Merge "Update pin-project-lite to 0.2.16" into main
diff --git a/crates/argh_shared/.android-checksum.json b/crates/argh_shared/.android-checksum.json
index 24bb8b1..a89e96e 100644
--- a/crates/argh_shared/.android-checksum.json
+++ b/crates/argh_shared/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"faa2703196aae6b28af0aaf4d44d48293f9a6c7f418cce923957ee2922fdc53b","Android.bp":"051a6127f3bf3b88e72b1d2a01a2924ec1c458d8d6d23be0559097616c411d4c","Cargo.toml":"7eff2740e789eb32621979c24987271770e14c2f005d254006dbc7ea0b363f78","LICENSE":"2d317525712f72bc5bd06a826df2bb2a6de216a9b1dcc8a423e7432c9b92c4a3","METADATA":"484ab152a2ad20ca33eb3e2c1e24615264f03bb475f15a92f7359e9a3724a80e","MODULE_LICENSE_BSD":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"aae203330dcae6321e20e651bf256dcbda6ef30c082189625c089b5a323555f9","TEST_MAPPING":"c05e28a9bd796694b7b14a5bee1fc17b976d36cba94f87f4c3a325ad61cfe8cc","cargo_embargo.json":"4534efdc4dd17000b31998823b78b690b19ae79fabf7419df626a79ba7141890","src/lib.rs":"7a8c27b66fc9378c41590e88958b3cd268859e3efd99c01683ed482623ebc751"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"62f3f1ae9f1076a7170cd38d6a7079447827e207620b18f19f0f557620b0a333","Android.bp":"99750ef9f6ece7fa1151f444852713aee41e79fd228c2710e46a7592e965e140","Cargo.toml":"76cbcd80fcaaaa4e08253f3658f00eb0db5cbff022c4b78a40be178d953039fc","LICENSE":"2d317525712f72bc5bd06a826df2bb2a6de216a9b1dcc8a423e7432c9b92c4a3","METADATA":"358da0fc84355223f0ea89cead375fbda71df23fb873758d0fe19a02ce5432cf","MODULE_LICENSE_BSD":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f3766c596e66441272fcf1e0fe590ada79e5c9f8cfe7d0bcdf94f2699760a45b","TEST_MAPPING":"c05e28a9bd796694b7b14a5bee1fc17b976d36cba94f87f4c3a325ad61cfe8cc","cargo_embargo.json":"4534efdc4dd17000b31998823b78b690b19ae79fabf7419df626a79ba7141890","src/lib.rs":"bc9b694adf11a6afeefc167e22e42d720a933277a96f65caf9c818189f974b03"}}
\ No newline at end of file
diff --git a/crates/argh_shared/.cargo-checksum.json b/crates/argh_shared/.cargo-checksum.json
index fbbf092..f19d223 100644
--- a/crates/argh_shared/.cargo-checksum.json
+++ b/crates/argh_shared/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"0815c9ae5449d9129081a3b98215b0e9896d95ed6e67e02b81c6c11b08cb4a73","LICENSE":"03b114f53e6587a398931762ee11e2395bfdba252a329940e2c8c9e81813845b","README.md":"05bee47456d4e08e89cb73dbd74cf8a2e1a96a896b9ec5c10842422282b539a2","src/lib.rs":"93a69c60f0d9f468127e0c2d0416370e303adf82204b4971476ecbc0c6994a09"},"package":"5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531"}
\ No newline at end of file
+{"files":{"Cargo.toml":"794c97c4880f0dc9f7e40801104381b9ea2adf6f7800b35ea49d778a87caeddd","LICENSE":"03b114f53e6587a398931762ee11e2395bfdba252a329940e2c8c9e81813845b","README.md":"fcf5bcc13c309045c66a509d8cb107305b82c8728bfe44e2106cd3ca80e83107","src/lib.rs":"20b6b27542691f5bc14652bf6847b7a17e5de59a37758522f6c4ca42a705b6d7"},"package":"a464143cc82dedcdc3928737445362466b7674b5db4e2eb8e869846d6d84f4f6"}
\ No newline at end of file
diff --git a/crates/argh_shared/Android.bp b/crates/argh_shared/Android.bp
index fa02777..663343f 100644
--- a/crates/argh_shared/Android.bp
+++ b/crates/argh_shared/Android.bp
@@ -18,10 +18,9 @@
     host_supported: true,
     crate_name: "argh_shared",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.12",
+    cargo_pkg_version: "0.1.13",
     crate_root: "src/lib.rs",
     edition: "2018",
-    rustlibs: ["libserde"],
     apex_available: [
         "//apex_available:platform",
         "com.android.virt",
diff --git a/crates/argh_shared/Cargo.toml b/crates/argh_shared/Cargo.toml
index 2463da8..983fc78 100644
--- a/crates/argh_shared/Cargo.toml
+++ b/crates/argh_shared/Cargo.toml
@@ -12,17 +12,28 @@
 [package]
 edition = "2018"
 name = "argh_shared"
-version = "0.1.12"
+version = "0.1.13"
 authors = [
     "Taylor Cramer <[email protected]>",
     "Benjamin Brittain <[email protected]>",
     "Erick Tryzelaar <[email protected]>",
 ]
+build = false
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "Derive-based argument parsing optimized for code size"
 readme = "README.md"
 license = "BSD-3-Clause"
 repository = "https://github.com/google/argh"
 
+[lib]
+name = "argh_shared"
+path = "src/lib.rs"
+
 [dependencies.serde]
 version = "1"
 features = ["derive"]
+optional = true
diff --git a/crates/argh_shared/METADATA b/crates/argh_shared/METADATA
index ee3b7ee..402b518 100644
--- a/crates/argh_shared/METADATA
+++ b/crates/argh_shared/METADATA
@@ -1,17 +1,17 @@
 name: "argh_shared"
 description: "Derive-based argument parsing optimized for code size"
 third_party {
-  version: "0.1.12"
+  version: "0.1.13"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 10
-    day: 19
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/argh_shared"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/argh_shared/argh_shared-0.1.12.crate"
-    version: "0.1.12"
+    value: "https://static.crates.io/crates/argh_shared/argh_shared-0.1.13.crate"
+    version: "0.1.13"
   }
 }
diff --git a/crates/argh_shared/README.md b/crates/argh_shared/README.md
index 7368162..8a03f94 100644
--- a/crates/argh_shared/README.md
+++ b/crates/argh_shared/README.md
@@ -51,7 +51,7 @@
   -j, --jump        whether or not to jump
   --height          how high to go
   --pilot-nickname  an optional nickname for the pilot
-  --help            display usage information
+  --help, help      display usage information
 ```
 
 The resulting program can then be used in any of these ways:
diff --git a/crates/argh_shared/src/lib.rs b/crates/argh_shared/src/lib.rs
index 20383a4..ae44e5b 100644
--- a/crates/argh_shared/src/lib.rs
+++ b/crates/argh_shared/src/lib.rs
@@ -15,7 +15,8 @@
 }
 
 /// Information about the command line arguments for a given command.
-#[derive(Debug, Default, PartialEq, Eq, Clone, serde::Serialize)]
+#[derive(Debug, Default, PartialEq, Eq, Clone)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub struct CommandInfoWithArgs<'a> {
     /// The name of the command.
     pub name: &'a str,
@@ -36,7 +37,8 @@
 }
 
 /// Information about a documented error code.
-#[derive(Debug, PartialEq, Eq, serde::Serialize)]
+#[derive(Debug, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub struct ErrorCodeInfo<'a> {
     /// The code value.
     pub code: i32,
@@ -45,7 +47,8 @@
 }
 
 /// Information about positional arguments
-#[derive(Debug, PartialEq, Eq, serde::Serialize)]
+#[derive(Debug, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub struct PositionalInfo<'a> {
     /// Name of the argument.
     pub name: &'a str,
@@ -63,7 +66,8 @@
 /// Dynamic subcommands do not implement
 /// get_args_info(), so the command field
 /// only contains the name and description.
-#[derive(Debug, Default, PartialEq, Eq, Clone, serde::Serialize)]
+#[derive(Debug, Default, PartialEq, Eq, Clone)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub struct SubCommandInfo<'a> {
     /// The subcommand name.
     pub name: &'a str,
@@ -72,7 +76,8 @@
 }
 
 /// Information about a flag or option.
-#[derive(Debug, Default, PartialEq, Eq, serde::Serialize)]
+#[derive(Debug, Default, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub struct FlagInfo<'a> {
     /// The kind of flag.
     pub kind: FlagInfoKind<'a>,
@@ -81,7 +86,7 @@
     /// The long string of the flag.
     pub long: &'a str,
     /// The single character short indicator
-    /// for trhis flag.
+    /// for this flag.
     pub short: Option<char>,
     /// The description of the flag.
     pub description: &'a str,
@@ -92,7 +97,8 @@
 }
 
 /// The kind of flags.
-#[derive(Debug, Default, PartialEq, Eq, serde::Serialize)]
+#[derive(Debug, Default, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub enum FlagInfoKind<'a> {
     /// switch represents a boolean flag,
     #[default]
@@ -102,9 +108,10 @@
     Option { arg_name: &'a str },
 }
 
-/// The optionality defines the requirments related
+/// The optionality defines the requirements related
 /// to the presence of the argument on the command line.
-#[derive(Debug, Default, PartialEq, Eq, serde::Serialize)]
+#[derive(Debug, Default, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Serialize))]
 pub enum Optionality {
     /// Required indicates the argument is required
     /// exactly once.
@@ -117,7 +124,7 @@
     /// or more times.
     Repeating,
     /// Greedy is used for positional arguments which
-    /// capture the all command line input upto the next flag or
+    /// capture the all command line input up to the next flag or
     /// the end of the input.
     Greedy,
 }
diff --git a/crates/bitflags/.android-checksum.json b/crates/bitflags/.android-checksum.json
index feaa531..cc854d0 100644
--- a/crates/bitflags/.android-checksum.json
+++ b/crates/bitflags/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"340b17e46fea0170842dccfa0339bcb50271e5c516e664c9edaf6dc147993988","Android.bp":"131a767bcc4a59a5cfcf36673fe4c8841957c1e2b6d60e1002c5134f6bf6db0c","CHANGELOG.md":"5e0f6921421101104d88e8797a2ce6a621b9503e681573a24278d3a3596acf5b","CODE_OF_CONDUCT.md":"4063df77c169eee901088338d4c4fdb1523469263a6e4ab46e2936d9ed1d8287","CONTRIBUTING.md":"eefc979a5fed613f39b33128b1a3acdb31bc12fbd2aa70bc0bd37afe9d0c4263","Cargo.lock":"d4e6fabb5fc6102d01483b6d076ba9efc0836ea614f4272a9e3d2277a40e4dcf","Cargo.toml":"1320ac34c24b7f6d7bbcd7f9afc61987c9d51ee84e215beeabe209bfe8760bc1","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"16693a68efd65bc6a9df3448c8f7ee6745418c73faff4ec4d443648c04285fa4","METADATA":"1ae6e6b8fff5925aa71251fbd6f7b3f5f88e2b1c5f4d4c4409406ec02990304f","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"94ad5dc0fb23c99e57ec477e15aab41595b23f3830e34d9e8cc54739ed0b680e","SECURITY.md":"b4054da2c6cf71c5c262d4e1ea23fe4a34fbaff429c837ef9cc1987050b0799a","TEST_MAPPING":"bcbfeb9a73a2e8a24ce7bc6e2529132de16e557957825acbac0dc616b1bb71c4","benches/parse.rs":"a2803b852ff337f7fd999602ba2a2963d57bfc7a63e619d4770e39a3bbe452e9","cargo_embargo.json":"d2d75aec1339e081ddf5bd585b4bf41d71c15afb1ec279e36b9de768475674c7","examples/custom_bits_type.rs":"65b3b831bbaf36201abf9ff48aa0424631a97c49a10c51d254a3f49f3f74753a","examples/custom_derive.rs":"7d08522687aeb3d449398bb98531dc10454123e6d5c665c82bbadb3198e704eb","examples/fmt.rs":"b49642ac253df177baa32a806df6f6a60c598bb08c5ca3a1589daa900fa6935b","examples/macro_free.rs":"276c152ee5cdad71a3988705abda355e54a6d467b465683fa7ee77e84fbb0623","examples/serde.rs":"e35659978f11469a7519402971ee0a37fec052e5b4f8f2f58b44ddf5bc4dab55","patches/rules.mk.diff":"38a0d80f966cc4413dff0c924a3cb5311804d835111e0dafa1054431b0277c14","rules.mk":"a9f1aaf7b85c9270b663e1eba553b4d4c498d3bf163265767869219b9a7f15b5","spec.md":"d6ac0c32ef98f96df3634e38d0bad97420126af3fd2e9eec008044a3d63d24c8","src/example_generated.rs":"e0b32b40b22248a2731106bd851a9eb2410b4774a72fc89838b4fbb7c6e393a3","src/external.rs":"300a572fadfe6d1fb05c81183c90de01b8ab923e7df82585ff7da0af0dfabc89","src/external/arbitrary.rs":"e22013b2cb04babe3de5c8b7a86a371084d10e1bfcbe94a06d3e5de7ca6867ce","src/external/bytemuck.rs":"290281ecc027b069b72a6e965e23af1b362f70d84a1b6466baae781c42080264","src/external/serde.rs":"25a6360def73c6eaa619520062e76b1073c01bcbc30fb5b3f15da59dff827638","src/internal.rs":"fbd8c745b8ea36f41aa6ceb05624bd4f2f039a627f00044567ef1d1a230f698f","src/iter.rs":"417e4ef92bc69ebb9abc6e205a7fc5d6f66eeba218cb9354990d91e28651c946","src/lib.rs":"5a869ecadae1a601626bcb21d3d69c9c3726faf1fc5911f22a9525ea76f4b658","src/parser.rs":"95e6a65479842e3880507d09c0e9c975233733ca007eaf85c384f86c825be89f","src/public.rs":"e9d62d31ddbb6c4f70b701d22e616102edf8aea2dc08c8292e365f6292641c07","src/tests.rs":"70eec2abc4c4e7ccc815aeae27d26182ac8b8284eec301d0bbed1596c97c4368","src/tests/all.rs":"d0c32ed470d43e53c471af1684d871b3fe282508e1a93d0a6b18ea0fafc5e474","src/tests/bits.rs":"d083ef28822e1c08c520f37905646c599e607089367c5498aa8777422ed717bc","src/tests/complement.rs":"2eff61b3a7aeeec4c47492468f5d5536d837995fcab87031bb1166296ff1c731","src/tests/contains.rs":"44742bd6e1ee60291da959fef103c137f1aa60cd48720d022dcd574a6747de4a","src/tests/difference.rs":"ade15dac713c90cb075ee0770ce5623233ae1ab676373df550df56ab1d2f31a1","src/tests/empty.rs":"18b93fab7194f5d82addeab1a0ad5efaed806727c479a6c233e602fd1eb3c3dd","src/tests/eq.rs":"471005a8132b16a8900e852cf7d9e864c8bbd7bea01954eb0b91c86f43a89950","src/tests/extend.rs":"366e1d59139af88c4cecb49a76ce21b1e82806dce3abaf5d16dcf65dddd2858c","src/tests/flags.rs":"7c4589c2b41a51ab813e9f40fe1b244fa6943f38d5209f68ff4e1d5106f251f6","src/tests/fmt.rs":"c758caa3f4064756d2478d99a2a758939cc44daa7505d33cae095e10532ee6db","src/tests/from_bits.rs":"47dd1bcf78b24f152fc95109fc0c6dc025c9f667aa5e8bc6d8836fc2cd76dc40","src/tests/from_bits_retain.rs":"4dbcc86e042ab0b2560ced3d0d69e1af803437c398dce7f1be906d92dc06c984","src/tests/from_bits_truncate.rs":"d17efb1bad75c5ff259dd97dedd958c87138bf35352964d041b68bcb11f2d45c","src/tests/from_name.rs":"efc39d196633793996b5fb049d700a50972c89326a55e224049b35c222e5e8a7","src/tests/insert.rs":"206adeff2bbbcf19f3b89404cd7aa00de948299dee68bf232d7e13bc4119f0b5","src/tests/intersection.rs":"cccf16199b719504b3893124501da2037cb754eb1c1e11334e953b96c5778b11","src/tests/intersects.rs":"dc96e54f9b3a3d65ab76015e90c4e7a91d9157512ba0315f8ece08bde148accc","src/tests/is_all.rs":"108180331563f5304d21314a7557bf6e9dd88ade94050408b58856e92b8786a5","src/tests/is_empty.rs":"f4717842e4c55b478bd6e3619c007295536ac19510f4b7df8a5569445c1a7e9e","src/tests/iter.rs":"b7143f58a9a3cecbbb3d84dc4292eb27a26fbddf23b9661270481ea7f377ced3","src/tests/parser.rs":"12513ba119618464e61cb624d9f47c5644b3fe5c90f75b451ea5c1287f3876b5","src/tests/remove.rs":"ace949c743f9c0add2964b3f0f59f5a39d1f20228ec3f5084ee93f331f975007","src/tests/symmetric_difference.rs":"d900443b34855527c5e3dae34a15014db12139edd0393b6dafd05120ff44096a","src/tests/union.rs":"3aa62dbcec0fe9c3302c8425b904b12b6fc303e5adfaed8d087dfdd24142c776","src/traits.rs":"37fa7b6c75ff366a8e0ea6e6d8ee4130d4881464bc266269bad9bfca7c592a7d"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"e60168093f0c9ab79c6efa3cd59e878174ef5aeb60a6ca05da54f6ee948e3726","Android.bp":"ca283fc01925086059b5f8d9084b82f3c58a05327b0531939319a035f3373a1a","CHANGELOG.md":"476f3722c29c420f74df236af508fd3c4f8cb30a9573178bf6cafaeee6489ad4","CODE_OF_CONDUCT.md":"4063df77c169eee901088338d4c4fdb1523469263a6e4ab46e2936d9ed1d8287","CONTRIBUTING.md":"eefc979a5fed613f39b33128b1a3acdb31bc12fbd2aa70bc0bd37afe9d0c4263","Cargo.lock":"781445bdb51c2e6d4d85bf0b247485f0d0af3db05d174356b58fedc1f62737f0","Cargo.toml":"34505970ce9f63ccdd77bd4dcd15af21af4d2f68c8adfc8d30ca77f23961b475","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"16693a68efd65bc6a9df3448c8f7ee6745418c73faff4ec4d443648c04285fa4","METADATA":"d7fb7534ddf862ebb5e4dce15ba28ae1c1f7ed74e013b21ddc55db9d3df07997","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"aaf3505f94957b40aececef1cd66dc1f0b1bf807b4d70a9d7206a883f919b297","SECURITY.md":"b4054da2c6cf71c5c262d4e1ea23fe4a34fbaff429c837ef9cc1987050b0799a","TEST_MAPPING":"bcbfeb9a73a2e8a24ce7bc6e2529132de16e557957825acbac0dc616b1bb71c4","benches/parse.rs":"a2803b852ff337f7fd999602ba2a2963d57bfc7a63e619d4770e39a3bbe452e9","cargo_embargo.json":"d2d75aec1339e081ddf5bd585b4bf41d71c15afb1ec279e36b9de768475674c7","examples/custom_bits_type.rs":"65b3b831bbaf36201abf9ff48aa0424631a97c49a10c51d254a3f49f3f74753a","examples/custom_derive.rs":"5221abaeb50bfe867bf0e47c18f16f8613d86c63ceb8e70c3b03ee8a8d75dc72","examples/fmt.rs":"b49642ac253df177baa32a806df6f6a60c598bb08c5ca3a1589daa900fa6935b","examples/macro_free.rs":"276c152ee5cdad71a3988705abda355e54a6d467b465683fa7ee77e84fbb0623","examples/serde.rs":"e35659978f11469a7519402971ee0a37fec052e5b4f8f2f58b44ddf5bc4dab55","patches/rules.mk.diff":"38a0d80f966cc4413dff0c924a3cb5311804d835111e0dafa1054431b0277c14","rules.mk":"a9f1aaf7b85c9270b663e1eba553b4d4c498d3bf163265767869219b9a7f15b5","spec.md":"d6ac0c32ef98f96df3634e38d0bad97420126af3fd2e9eec008044a3d63d24c8","src/example_generated.rs":"e0b32b40b22248a2731106bd851a9eb2410b4774a72fc89838b4fbb7c6e393a3","src/external.rs":"300a572fadfe6d1fb05c81183c90de01b8ab923e7df82585ff7da0af0dfabc89","src/external/arbitrary.rs":"cecc68181620c35419342453ac4c38df7272765d7ff168391a7564c6577b52d5","src/external/bytemuck.rs":"290281ecc027b069b72a6e965e23af1b362f70d84a1b6466baae781c42080264","src/external/serde.rs":"25a6360def73c6eaa619520062e76b1073c01bcbc30fb5b3f15da59dff827638","src/internal.rs":"fbd8c745b8ea36f41aa6ceb05624bd4f2f039a627f00044567ef1d1a230f698f","src/iter.rs":"417e4ef92bc69ebb9abc6e205a7fc5d6f66eeba218cb9354990d91e28651c946","src/lib.rs":"ae8ccdc743d5d99c6e3bd09971519e5b7d9096337dd64adc5163d7c6eafd155a","src/parser.rs":"95e6a65479842e3880507d09c0e9c975233733ca007eaf85c384f86c825be89f","src/public.rs":"e9d62d31ddbb6c4f70b701d22e616102edf8aea2dc08c8292e365f6292641c07","src/tests.rs":"6c4f4ed0937d59b088fc3a947ea20f6ad562a0967c8312bbd3c07d2c02021eba","src/tests/all.rs":"d0c32ed470d43e53c471af1684d871b3fe282508e1a93d0a6b18ea0fafc5e474","src/tests/bits.rs":"d083ef28822e1c08c520f37905646c599e607089367c5498aa8777422ed717bc","src/tests/complement.rs":"2eff61b3a7aeeec4c47492468f5d5536d837995fcab87031bb1166296ff1c731","src/tests/contains.rs":"44742bd6e1ee60291da959fef103c137f1aa60cd48720d022dcd574a6747de4a","src/tests/difference.rs":"ade15dac713c90cb075ee0770ce5623233ae1ab676373df550df56ab1d2f31a1","src/tests/empty.rs":"18b93fab7194f5d82addeab1a0ad5efaed806727c479a6c233e602fd1eb3c3dd","src/tests/eq.rs":"471005a8132b16a8900e852cf7d9e864c8bbd7bea01954eb0b91c86f43a89950","src/tests/extend.rs":"366e1d59139af88c4cecb49a76ce21b1e82806dce3abaf5d16dcf65dddd2858c","src/tests/flags.rs":"7c4589c2b41a51ab813e9f40fe1b244fa6943f38d5209f68ff4e1d5106f251f6","src/tests/fmt.rs":"c758caa3f4064756d2478d99a2a758939cc44daa7505d33cae095e10532ee6db","src/tests/from_bits.rs":"47dd1bcf78b24f152fc95109fc0c6dc025c9f667aa5e8bc6d8836fc2cd76dc40","src/tests/from_bits_retain.rs":"4dbcc86e042ab0b2560ced3d0d69e1af803437c398dce7f1be906d92dc06c984","src/tests/from_bits_truncate.rs":"d17efb1bad75c5ff259dd97dedd958c87138bf35352964d041b68bcb11f2d45c","src/tests/from_name.rs":"efc39d196633793996b5fb049d700a50972c89326a55e224049b35c222e5e8a7","src/tests/insert.rs":"206adeff2bbbcf19f3b89404cd7aa00de948299dee68bf232d7e13bc4119f0b5","src/tests/intersection.rs":"cccf16199b719504b3893124501da2037cb754eb1c1e11334e953b96c5778b11","src/tests/intersects.rs":"dc96e54f9b3a3d65ab76015e90c4e7a91d9157512ba0315f8ece08bde148accc","src/tests/is_all.rs":"108180331563f5304d21314a7557bf6e9dd88ade94050408b58856e92b8786a5","src/tests/is_empty.rs":"f4717842e4c55b478bd6e3619c007295536ac19510f4b7df8a5569445c1a7e9e","src/tests/iter.rs":"b7143f58a9a3cecbbb3d84dc4292eb27a26fbddf23b9661270481ea7f377ced3","src/tests/parser.rs":"12513ba119618464e61cb624d9f47c5644b3fe5c90f75b451ea5c1287f3876b5","src/tests/remove.rs":"ace949c743f9c0add2964b3f0f59f5a39d1f20228ec3f5084ee93f331f975007","src/tests/symmetric_difference.rs":"d900443b34855527c5e3dae34a15014db12139edd0393b6dafd05120ff44096a","src/tests/truncate.rs":"357988c61038edfbb8851dd50ac5f8f7dab5a99d5917c39651d44f83c5d7bb19","src/tests/union.rs":"3aa62dbcec0fe9c3302c8425b904b12b6fc303e5adfaed8d087dfdd24142c776","src/tests/unknown.rs":"52f8a803221065b871b12abfdff590eeeeef71ff3e9422ff1865a64ecf2c686e","src/traits.rs":"0d011a3aac117425f5b1ad657c6ac09275b191f10ec895bb4597e56f23e04378"}}
\ No newline at end of file
diff --git a/crates/bitflags/.cargo-checksum.json b/crates/bitflags/.cargo-checksum.json
index 9ed6cb2..720a2bb 100644
--- a/crates/bitflags/.cargo-checksum.json
+++ b/crates/bitflags/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"c98723b209ac4c66625e034b113a55a43a5c1c9e49c0e3b86123d0cd62bae573","CODE_OF_CONDUCT.md":"42634d0f6d922f49857175af991802822f7f920487aefa2ee250a50d12251a66","CONTRIBUTING.md":"6c9f96eacb20af877ae2d16f024904f3038b93448a8488e9dbcac0df7f6439a5","Cargo.lock":"d3e3bce47b94298f2de893a7d91035f2b73a887905a7ffd4ddb668efdd0aee20","Cargo.toml":"92e110c36340bda13f3b329a2aa24aede8bdcb7fa035806926f7ce438dde87f2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"e9b1329fee85868f1aa674d0505cd95b86a259e2a1762347e5af4a5abedd61d4","SECURITY.md":"68704c8128fa2e776ed7cbda741fbf61ad52f998a96350ee7ee4dbf64c6573bc","benches/parse.rs":"f1390d62322c6880d65bd931e183d49b313f287879a6bfaa36b1cb1921090b51","examples/custom_bits_type.rs":"e53b32051adc5d97860e0b48c8f3a301a041d73b4939c0d7caa5f0cfcc0b9739","examples/custom_derive.rs":"a404e8f606efdd1b43e0c365e4142ccc3dc3ba230127ddeea89cd8784bb55a1e","examples/fmt.rs":"87ba37a1fb8528570c74ea26d8e8948e1179c3d867b928bea1080880258e0a99","examples/macro_free.rs":"69e7f284b53b5214d51228a686e87f127b52a3b74711e45537ebfa5583a180e5","examples/serde.rs":"08b21b35d5c10fdca132fe0f36c8067bb44f559e96617a9257ab6316a20cbc75","spec.md":"fcdd939df30c59b0643be09027df664b71cbea9b9989185441482c5576160fed","src/example_generated.rs":"d018caf059f6ffc4c2403b771a6d76679fa5af03c329a91bd9252957df695e7f","src/external.rs":"734d3f470e6a669297d2df421ce3976fe613d8aa9c071d5ce6fe3ca890e5b815","src/external/arbitrary.rs":"fa8c9187028b9bc54856977b0914676f62101010e7a9450abd577fd78c89552f","src/external/bytemuck.rs":"3afcef382122867040fddd5e4153d633d1ed5596fe5d7dfac66a8e61c2513df5","src/external/serde.rs":"4a09db12534a20fe554a08dc5f1c8124b379292d41fa75628abcd2ca21587573","src/internal.rs":"645b13af0c7302258df61239073a4b8203d09f27b6c17f8a6f1f8c3e427f5334","src/iter.rs":"dbaa6437c1c044f689185ce3fafe43df8796bed19bbdd2c20334a52de5eeee73","src/lib.rs":"1feb0eea02f88491c99c7962b0ce6e66bdedea0ab0cac375d4c9c2d879248dc7","src/parser.rs":"4e788b29f5d0542c409a8b43c703bcb4a6c2a57c181cadd17f565f0abb39681e","src/public.rs":"78ba06e1a5830b36960adf9bd79aaf47d783b9b8a0f1fa33b0d7a340c15fd1d1","src/tests.rs":"b120c27ff0c67a819527de9d8171f1f4c5d37ba4009c54abeb869c70e6035f14","src/tests/all.rs":"e99a865cd4271a524c2fe95503e96d851b35990570aed6fb2e9dac7a14da31b6","src/tests/bits.rs":"3840c34b2ea5d1802404b9ce5bcc1d3fa6ccd8dfba2e29e6d07c605f817d90df","src/tests/complement.rs":"d0e6d4c3daf49e0a7438c9f1c1ac91fad1b37f258c03593f6cd6a695ee626f5e","src/tests/contains.rs":"58bb3cb8c86550e775d11134da1d4aca85c83f943ea454e3a5f222772c674a24","src/tests/difference.rs":"d0d2b96bb52658b8ac019210da74ca75a53e76622f668855142ea6e97c28cb0e","src/tests/empty.rs":"817d6e93ced7cb7576ff0e334aa1a44703f3f96871ff2c6bdcb8f207e6551f67","src/tests/eq.rs":"b816767680a029e9c163e37af074dd4e604c4a3e4936f829f0ca3774fd5f0e37","src/tests/extend.rs":"5fabb9fd0254c64da019149c24063fceff72da3eb4ad73b57c1cc4c04b008364","src/tests/flags.rs":"2f48d3a25db1cf66fe98c9959abc70875deb9f7b38b2c278dc70c46e0d4ec277","src/tests/fmt.rs":"a2d4148491f3202f030f63633eee941b741e3be29a68cf376f008dbe5cb11e5c","src/tests/from_bits.rs":"d94c65b88bf89961d0cfc1b3152a7f1acc285bae160a1628438effda11b8e2c1","src/tests/from_bits_retain.rs":"980591dfaf91e940f42d9a1ce890f237514dd59d458fc264abcf9ceabbc40677","src/tests/from_bits_truncate.rs":"d3406b5e107ebb6449b98a59eee6cc5d84f947d4aaee1ee7e80dc7202de179f0","src/tests/from_name.rs":"f4a055d1f3c86decef70ef8f3020cef5c4e229718c20b3d59d5a3abc3a8b1298","src/tests/insert.rs":"3fab5da800a6fc0654dfb5f859f95da65a507eb9fda8695083c2712266dff0b9","src/tests/intersection.rs":"baf1454c9e4eba552264870a556ee0032d9f2bb8cac361833d571235e0b52221","src/tests/intersects.rs":"c55e36179fd8bc636f04ea9bbce346dcaafe57915d13f1df28c5b83117dbd08e","src/tests/is_all.rs":"b2f11faa7c954bd85c8fb39999e0c37d983cf7895152bc13c7ddde106aa33b6d","src/tests/is_empty.rs":"11f21323cdca7ff92dd89e09de667dba69e8dce88e2d3e27ea68ace91d15d070","src/tests/iter.rs":"4ba121932b527e787b82745405c7c65c1084c242e2dda3290d475ec160d265e4","src/tests/parser.rs":"fa2fb8dedcf16601af609a5e21d9c5840c7f96a1e3a587f7f2ea3dc8387f7628","src/tests/remove.rs":"6e75f8508d2dc1a2cba89ef691f4387a665a4fd13853bb1dd0fd80c783b89947","src/tests/symmetric_difference.rs":"0a89f084f9de1dd5b1932fe72c3b10a3c93cbaa16832b3a31b6a85e3bbd3ba6e","src/tests/union.rs":"88f398ee4600bb1e59bf6d02d1f6ff33f5f853eab5a6c700bd8a683c6ee4651a","src/traits.rs":"b79d008daec546136fae4497966fc85a33663d86ea2d9213fd23b412d4d77b66"},"package":"b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"f2635274b6b8c496e855b4cf6ec7852102d794263292fe81f1c088e4ff253716","CODE_OF_CONDUCT.md":"42634d0f6d922f49857175af991802822f7f920487aefa2ee250a50d12251a66","CONTRIBUTING.md":"6c9f96eacb20af877ae2d16f024904f3038b93448a8488e9dbcac0df7f6439a5","Cargo.lock":"6fda29b7daf6af4dc0c5d3f32765e9052192ee960e90f180cdaee3f7f13adca6","Cargo.toml":"f931d505da26360b34271181dcc19b43cf68d11d05514789d24aeb2d814438cc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"4a9814dba6a6fdacf1ad20edd17905375550b2d4dc407ed5f00f2f0597ab437d","SECURITY.md":"68704c8128fa2e776ed7cbda741fbf61ad52f998a96350ee7ee4dbf64c6573bc","benches/parse.rs":"f1390d62322c6880d65bd931e183d49b313f287879a6bfaa36b1cb1921090b51","examples/custom_bits_type.rs":"e53b32051adc5d97860e0b48c8f3a301a041d73b4939c0d7caa5f0cfcc0b9739","examples/custom_derive.rs":"730589695eb68dda21d0d9f69e90cbdbf9823b13d6f16c5f22b0083c00981813","examples/fmt.rs":"87ba37a1fb8528570c74ea26d8e8948e1179c3d867b928bea1080880258e0a99","examples/macro_free.rs":"69e7f284b53b5214d51228a686e87f127b52a3b74711e45537ebfa5583a180e5","examples/serde.rs":"08b21b35d5c10fdca132fe0f36c8067bb44f559e96617a9257ab6316a20cbc75","spec.md":"fcdd939df30c59b0643be09027df664b71cbea9b9989185441482c5576160fed","src/example_generated.rs":"d018caf059f6ffc4c2403b771a6d76679fa5af03c329a91bd9252957df695e7f","src/external.rs":"734d3f470e6a669297d2df421ce3976fe613d8aa9c071d5ce6fe3ca890e5b815","src/external/arbitrary.rs":"43908bb4fe0a076078dcb3fa70c654aaed8c7b38aa66574414165a82037def83","src/external/bytemuck.rs":"3afcef382122867040fddd5e4153d633d1ed5596fe5d7dfac66a8e61c2513df5","src/external/serde.rs":"4a09db12534a20fe554a08dc5f1c8124b379292d41fa75628abcd2ca21587573","src/internal.rs":"645b13af0c7302258df61239073a4b8203d09f27b6c17f8a6f1f8c3e427f5334","src/iter.rs":"dbaa6437c1c044f689185ce3fafe43df8796bed19bbdd2c20334a52de5eeee73","src/lib.rs":"9d571acbfe33d90e61b097ad3bfa821545c67319558365f8d06337504a2d5dfe","src/parser.rs":"4e788b29f5d0542c409a8b43c703bcb4a6c2a57c181cadd17f565f0abb39681e","src/public.rs":"78ba06e1a5830b36960adf9bd79aaf47d783b9b8a0f1fa33b0d7a340c15fd1d1","src/tests.rs":"fb14f80509a991af90a0aef85e55429ad79d7e499112ff06f8ac54e5a6a7acfa","src/tests/all.rs":"e99a865cd4271a524c2fe95503e96d851b35990570aed6fb2e9dac7a14da31b6","src/tests/bits.rs":"3840c34b2ea5d1802404b9ce5bcc1d3fa6ccd8dfba2e29e6d07c605f817d90df","src/tests/complement.rs":"d0e6d4c3daf49e0a7438c9f1c1ac91fad1b37f258c03593f6cd6a695ee626f5e","src/tests/contains.rs":"58bb3cb8c86550e775d11134da1d4aca85c83f943ea454e3a5f222772c674a24","src/tests/difference.rs":"d0d2b96bb52658b8ac019210da74ca75a53e76622f668855142ea6e97c28cb0e","src/tests/empty.rs":"817d6e93ced7cb7576ff0e334aa1a44703f3f96871ff2c6bdcb8f207e6551f67","src/tests/eq.rs":"b816767680a029e9c163e37af074dd4e604c4a3e4936f829f0ca3774fd5f0e37","src/tests/extend.rs":"5fabb9fd0254c64da019149c24063fceff72da3eb4ad73b57c1cc4c04b008364","src/tests/flags.rs":"2f48d3a25db1cf66fe98c9959abc70875deb9f7b38b2c278dc70c46e0d4ec277","src/tests/fmt.rs":"a2d4148491f3202f030f63633eee941b741e3be29a68cf376f008dbe5cb11e5c","src/tests/from_bits.rs":"d94c65b88bf89961d0cfc1b3152a7f1acc285bae160a1628438effda11b8e2c1","src/tests/from_bits_retain.rs":"980591dfaf91e940f42d9a1ce890f237514dd59d458fc264abcf9ceabbc40677","src/tests/from_bits_truncate.rs":"d3406b5e107ebb6449b98a59eee6cc5d84f947d4aaee1ee7e80dc7202de179f0","src/tests/from_name.rs":"f4a055d1f3c86decef70ef8f3020cef5c4e229718c20b3d59d5a3abc3a8b1298","src/tests/insert.rs":"3fab5da800a6fc0654dfb5f859f95da65a507eb9fda8695083c2712266dff0b9","src/tests/intersection.rs":"baf1454c9e4eba552264870a556ee0032d9f2bb8cac361833d571235e0b52221","src/tests/intersects.rs":"c55e36179fd8bc636f04ea9bbce346dcaafe57915d13f1df28c5b83117dbd08e","src/tests/is_all.rs":"b2f11faa7c954bd85c8fb39999e0c37d983cf7895152bc13c7ddde106aa33b6d","src/tests/is_empty.rs":"11f21323cdca7ff92dd89e09de667dba69e8dce88e2d3e27ea68ace91d15d070","src/tests/iter.rs":"4ba121932b527e787b82745405c7c65c1084c242e2dda3290d475ec160d265e4","src/tests/parser.rs":"fa2fb8dedcf16601af609a5e21d9c5840c7f96a1e3a587f7f2ea3dc8387f7628","src/tests/remove.rs":"6e75f8508d2dc1a2cba89ef691f4387a665a4fd13853bb1dd0fd80c783b89947","src/tests/symmetric_difference.rs":"0a89f084f9de1dd5b1932fe72c3b10a3c93cbaa16832b3a31b6a85e3bbd3ba6e","src/tests/truncate.rs":"683430af4a0e47ec73c737a6908fac5d851bed7c41d47c73a642e96d966aa5ae","src/tests/union.rs":"88f398ee4600bb1e59bf6d02d1f6ff33f5f853eab5a6c700bd8a683c6ee4651a","src/tests/unknown.rs":"fa9e8ee461f176c0d892cde487fef0fe66df2aa5906aaef21b093102e590f5f5","src/traits.rs":"370c414a6b621ffe6e018861b481671dffa2689de39759922d03cdd12e5b612b"},"package":"1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be"}
\ No newline at end of file
diff --git a/crates/bitflags/Android.bp b/crates/bitflags/Android.bp
index 9689f8c..2f88ae0 100644
--- a/crates/bitflags/Android.bp
+++ b/crates/bitflags/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "bitflags",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.6.0",
+    cargo_pkg_version: "2.7.0",
     crate_root: "src/lib.rs",
     edition: "2021",
     apex_available: [
diff --git a/crates/bitflags/CHANGELOG.md b/crates/bitflags/CHANGELOG.md
index f17d469..fc6134a 100644
--- a/crates/bitflags/CHANGELOG.md
+++ b/crates/bitflags/CHANGELOG.md
@@ -1,3 +1,20 @@
+# 2.7.0
+
+## What's Changed
+* Fix `clippy::doc_lazy_continuation` lints by @waywardmonkeys in https://github.com/bitflags/bitflags/pull/414
+* Run clippy on extra features in CI. by @waywardmonkeys in https://github.com/bitflags/bitflags/pull/415
+* Fix CI: trybuild refresh, allow some clippy restrictions. by @waywardmonkeys in https://github.com/bitflags/bitflags/pull/417
+* Update zerocopy version in example by @KodrAus in https://github.com/bitflags/bitflags/pull/422
+* Add method to check if unknown bits are set by @wysiwys in https://github.com/bitflags/bitflags/pull/426
+* Update error messages by @KodrAus in https://github.com/bitflags/bitflags/pull/427
+* Add `truncate(&mut self)` method to unset unknown bits by @wysiwys in https://github.com/bitflags/bitflags/pull/428
+* Update error messages by @KodrAus in https://github.com/bitflags/bitflags/pull/429
+
+## New Contributors
+* @wysiwys made their first contribution in https://github.com/bitflags/bitflags/pull/426
+
+**Full Changelog**: https://github.com/bitflags/bitflags/compare/2.6.0...2.7.0
+
 # 2.6.0
 
 ## What's Changed
diff --git a/crates/bitflags/Cargo.lock b/crates/bitflags/Cargo.lock
index 5f98ce0..10910a3 100644
--- a/crates/bitflags/Cargo.lock
+++ b/crates/bitflags/Cargo.lock
@@ -4,16 +4,16 @@
 
 [[package]]
 name = "arbitrary"
-version = "1.3.2"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110"
+checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
 dependencies = [
  "derive_arbitrary",
 ]
 
 [[package]]
 name = "bitflags"
-version = "2.6.0"
+version = "2.7.0"
 dependencies = [
  "arbitrary",
  "bytemuck",
@@ -30,18 +30,18 @@
 
 [[package]]
 name = "bytemuck"
-version = "1.16.1"
+version = "1.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e"
+checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
 dependencies = [
  "bytemuck_derive",
 ]
 
 [[package]]
 name = "bytemuck_derive"
-version = "1.7.0"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b"
+checksum = "882ce8da04f2b62f52b2485ed297687a43a8438374e7c2261a80601ecb4bac04"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -49,22 +49,16 @@
 ]
 
 [[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
-[[package]]
 name = "compiler_builtins"
-version = "0.1.112"
+version = "0.1.142"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15acab2bb4fe4dad1f1e31f3d9e714f50ef561a0f87dd8a9da004f14d455e1a"
+checksum = "78013b42e2946a76d348a858fa5a06ca7d6b5cccdfccd660ea7a0aa4a44d40ca"
 
 [[package]]
 name = "derive_arbitrary"
-version = "1.3.2"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
+checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -79,21 +73,21 @@
 
 [[package]]
 name = "glob"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
 
 [[package]]
 name = "hashbrown"
-version = "0.14.5"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
 
 [[package]]
 name = "indexmap"
-version = "2.2.6"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
 dependencies = [
  "equivalent",
  "hashbrown",
@@ -101,9 +95,9 @@
 
 [[package]]
 name = "itoa"
-version = "1.0.11"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
 
 [[package]]
 name = "memchr"
@@ -113,33 +107,33 @@
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.86"
+version = "1.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.36"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
 name = "rustc-std-workspace-core"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1956f5517128a2b6f23ab2dadf1a976f4f5b27962e7724c2bf3d45e539ec098c"
+checksum = "aa9c45b374136f52f2d6311062c7146bff20fec063c3f5d46a410bd937746955"
 
 [[package]]
 name = "rustversion"
-version = "1.0.17"
+version = "1.0.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
 
 [[package]]
 name = "ryu"
@@ -149,18 +143,18 @@
 
 [[package]]
 name = "serde"
-version = "1.0.203"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
+checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.203"
+version = "1.0.217"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
+checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -169,38 +163,39 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.117"
+version = "1.0.135"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
+checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9"
 dependencies = [
  "itoa",
+ "memchr",
  "ryu",
  "serde",
 ]
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.6"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde_test"
-version = "1.0.176"
+version = "1.0.177"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a2f49ace1498612d14f7e0b8245519584db8299541dfe31a06374a828d620ab"
+checksum = "7f901ee573cab6b3060453d2d5f0bae4e6d628c23c0a962ff9b5f1d7c8d4f1ed"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "syn"
-version = "2.0.68"
+version = "2.0.95"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9"
+checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -208,6 +203,12 @@
 ]
 
 [[package]]
+name = "target-triple"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42a4d50cdb458045afc8131fd91b64904da29548bcb63c7236e0844936c13078"
+
+[[package]]
 name = "termcolor"
 version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -218,9 +219,9 @@
 
 [[package]]
 name = "toml"
-version = "0.8.14"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
  "serde_spanned",
@@ -230,18 +231,18 @@
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.6"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.22.14"
+version = "0.22.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38"
+checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
 dependencies = [
  "indexmap",
  "serde",
@@ -252,47 +253,48 @@
 
 [[package]]
 name = "trybuild"
-version = "1.0.96"
+version = "1.0.101"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33a5f13f11071020bb12de7a16b925d2d58636175c20c11dc5f96cb64bb6c9b3"
+checksum = "8dcd332a5496c026f1e14b7f3d2b7bd98e509660c04239c58b0ba38a12daded4"
 dependencies = [
  "glob",
  "serde",
  "serde_derive",
  "serde_json",
+ "target-triple",
  "termcolor",
  "toml",
 ]
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.12"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.8"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
  "windows-sys",
 ]
 
 [[package]]
 name = "windows-sys"
-version = "0.52.0"
+version = "0.59.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
 dependencies = [
  "windows-targets",
 ]
 
 [[package]]
 name = "windows-targets"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
 dependencies = [
  "windows_aarch64_gnullvm",
  "windows_aarch64_msvc",
@@ -306,76 +308,75 @@
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
 [[package]]
 name = "windows_i686_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
 name = "winnow"
-version = "0.6.13"
+version = "0.6.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
+checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "zerocopy"
-version = "0.7.34"
+version = "0.8.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
+checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468"
 dependencies = [
- "byteorder",
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.34"
+version = "0.8.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
+checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/crates/bitflags/Cargo.toml b/crates/bitflags/Cargo.toml
index 54c4b82..1e9a2ff 100644
--- a/crates/bitflags/Cargo.toml
+++ b/crates/bitflags/Cargo.toml
@@ -13,12 +13,18 @@
 edition = "2021"
 rust-version = "1.56.0"
 name = "bitflags"
-version = "2.6.0"
+version = "2.7.0"
 authors = ["The Rust Project Developers"]
+build = false
 exclude = [
     "/tests",
     "/.github",
 ]
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 A macro to generate structures which behave like bitflags.
 """
@@ -38,6 +44,34 @@
 [package.metadata.docs.rs]
 features = ["example_generated"]
 
+[lib]
+name = "bitflags"
+path = "src/lib.rs"
+
+[[example]]
+name = "custom_bits_type"
+path = "examples/custom_bits_type.rs"
+
+[[example]]
+name = "custom_derive"
+path = "examples/custom_derive.rs"
+
+[[example]]
+name = "fmt"
+path = "examples/fmt.rs"
+
+[[example]]
+name = "macro_free"
+path = "examples/macro_free.rs"
+
+[[example]]
+name = "serde"
+path = "examples/serde.rs"
+
+[[bench]]
+name = "parse"
+path = "benches/parse.rs"
+
 [dependencies.arbitrary]
 version = "1.0"
 optional = true
@@ -84,7 +118,7 @@
 version = "1.0.18"
 
 [dev-dependencies.zerocopy]
-version = "0.7"
+version = "0.8"
 features = ["derive"]
 
 [features]
diff --git a/crates/bitflags/METADATA b/crates/bitflags/METADATA
index c33887c..a0db309 100644
--- a/crates/bitflags/METADATA
+++ b/crates/bitflags/METADATA
@@ -1,17 +1,17 @@
 name: "bitflags"
 description: "A macro to generate structures which behave like bitflags."
 third_party {
-  version: "2.6.0"
+  version: "2.7.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 5
-    day: 31
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/bitflags"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/bitflags/bitflags-2.6.0.crate"
-    version: "2.6.0"
+    value: "https://static.crates.io/crates/bitflags/bitflags-2.7.0.crate"
+    version: "2.7.0"
   }
 }
diff --git a/crates/bitflags/README.md b/crates/bitflags/README.md
index f2ad555..19f9268 100644
--- a/crates/bitflags/README.md
+++ b/crates/bitflags/README.md
@@ -28,7 +28,7 @@
 
 ```toml
 [dependencies]
-bitflags = "2.6.0"
+bitflags = "2.7.0"
 ```
 
 and this to your source code:
diff --git a/crates/bitflags/examples/custom_derive.rs b/crates/bitflags/examples/custom_derive.rs
index 4239ee4..ba26723 100644
--- a/crates/bitflags/examples/custom_derive.rs
+++ b/crates/bitflags/examples/custom_derive.rs
@@ -6,7 +6,7 @@
 
 // Define a flags type outside of the `bitflags` macro as a newtype
 // It can accept custom derives for libraries `bitflags` doesn't support natively
-#[derive(zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::FromZeroes)]
+#[derive(zerocopy::IntoBytes, zerocopy::FromBytes, zerocopy::KnownLayout, zerocopy::Immutable)]
 #[repr(transparent)]
 pub struct ManualFlags(u32);
 
diff --git a/crates/bitflags/src/external/arbitrary.rs b/crates/bitflags/src/external/arbitrary.rs
index ea76f0a..edde9b5 100644
--- a/crates/bitflags/src/external/arbitrary.rs
+++ b/crates/bitflags/src/external/arbitrary.rs
@@ -9,7 +9,7 @@
 where
     B::Bits: arbitrary::Arbitrary<'a>,
 {
-    B::from_bits(u.arbitrary()?).ok_or_else(|| arbitrary::Error::IncorrectFormat)
+    B::from_bits(u.arbitrary()?).ok_or(arbitrary::Error::IncorrectFormat)
 }
 
 #[cfg(test)]
diff --git a/crates/bitflags/src/lib.rs b/crates/bitflags/src/lib.rs
index a9a6aa4..97e808f 100644
--- a/crates/bitflags/src/lib.rs
+++ b/crates/bitflags/src/lib.rs
@@ -17,7 +17,7 @@
 
 ```toml
 [dependencies.bitflags]
-version = "2.6.0"
+version = "2.7.0"
 ```
 
 ## Generating flags types
@@ -71,10 +71,10 @@
 libraries are currently supported:
 
 - `serde`: Support `#[derive(Serialize, Deserialize)]`, using text for human-readable formats,
-and a raw number for binary formats.
+  and a raw number for binary formats.
 - `arbitrary`: Support `#[derive(Arbitrary)]`, only generating flags values with known bits.
 - `bytemuck`: Support `#[derive(Pod, Zeroable)]`, for casting between flags values and their
-underlying bits values.
+  underlying bits values.
 
 You can also define your own flags type outside of the [`bitflags`] macro and then use it to generate methods.
 This can be useful if you need a custom `#[derive]` attribute for a library that `bitflags` doesn't
diff --git a/crates/bitflags/src/tests.rs b/crates/bitflags/src/tests.rs
index ed52ad4..28ed0a6 100644
--- a/crates/bitflags/src/tests.rs
+++ b/crates/bitflags/src/tests.rs
@@ -21,7 +21,9 @@
 mod parser;
 mod remove;
 mod symmetric_difference;
+mod truncate;
 mod union;
+mod unknown;
 
 bitflags! {
     #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
diff --git a/crates/bitflags/src/tests/truncate.rs b/crates/bitflags/src/tests/truncate.rs
new file mode 100644
index 0000000..e38df48
--- /dev/null
+++ b/crates/bitflags/src/tests/truncate.rs
@@ -0,0 +1,29 @@
+use super::*;
+
+use crate::Flags;
+
+#[test]
+fn cases() {
+    case(
+        TestFlags::ABC | TestFlags::from_bits_retain(1 << 3),
+        TestFlags::ABC,
+    );
+
+    case(TestZero::empty(), TestZero::empty());
+
+    case(TestZero::all(), TestZero::all());
+
+    case(
+        TestFlags::from_bits_retain(1 << 3) | TestFlags::all(),
+        TestFlags::all(),
+    );
+}
+
+#[track_caller]
+fn case<T: Flags + std::fmt::Debug>(mut before: T, after: T)
+where
+    T: std::fmt::Debug + PartialEq + Copy,
+{
+    before.truncate();
+    assert_eq!(before, after, "{:?}.truncate()", before);
+}
diff --git a/crates/bitflags/src/tests/unknown.rs b/crates/bitflags/src/tests/unknown.rs
new file mode 100644
index 0000000..020f7e9
--- /dev/null
+++ b/crates/bitflags/src/tests/unknown.rs
@@ -0,0 +1,40 @@
+use super::*;
+
+use crate::Flags;
+
+#[test]
+fn cases() {
+    case(false, TestFlags::empty(), TestFlags::contains_unknown_bits);
+    case(false, TestFlags::A, TestFlags::contains_unknown_bits);
+
+    case(
+        true,
+        TestFlags::ABC | TestFlags::from_bits_retain(1 << 3),
+        TestFlags::contains_unknown_bits,
+    );
+
+    case(
+        true,
+        TestFlags::empty() | TestFlags::from_bits_retain(1 << 3),
+        TestFlags::contains_unknown_bits,
+    );
+
+    case(false, TestFlags::all(), TestFlags::contains_unknown_bits);
+
+    case(false, TestZero::empty(), TestZero::contains_unknown_bits);
+}
+#[track_caller]
+fn case<T: Flags + std::fmt::Debug>(expected: bool, value: T, inherent: impl FnOnce(&T) -> bool) {
+    assert_eq!(
+        expected,
+        inherent(&value),
+        "{:?}.contains_unknown_bits()",
+        value
+    );
+    assert_eq!(
+        expected,
+        Flags::contains_unknown_bits(&value),
+        "Flags::contains_unknown_bits({:?})",
+        value
+    );
+}
diff --git a/crates/bitflags/src/traits.rs b/crates/bitflags/src/traits.rs
index 3905d7d..d351bfc 100644
--- a/crates/bitflags/src/traits.rs
+++ b/crates/bitflags/src/traits.rs
@@ -152,6 +152,11 @@
         Self::from_bits_retain(truncated)
     }
 
+    /// This method will return `true` if any unknown bits are set.
+    fn contains_unknown_bits(&self) -> bool {
+        Self::all().bits() & self.bits() != self.bits()
+    }
+
     /// Get the underlying bits value.
     ///
     /// The returned value is exactly the bits set in this flags value.
@@ -241,6 +246,14 @@
         self.bits() & other.bits() == other.bits()
     }
 
+    /// Remove any unknown bits from the flags.
+    fn truncate(&mut self)
+    where
+        Self: Sized,
+    {
+        *self = Self::from_bits_truncate(self.bits());
+    }
+
     /// The bitwise or (`|`) of the bits in two flags values.
     fn insert(&mut self, other: Self)
     where
diff --git a/crates/bytemuck/.android-checksum.json b/crates/bytemuck/.android-checksum.json
index c366fab..e656abb 100644
--- a/crates/bytemuck/.android-checksum.json
+++ b/crates/bytemuck/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"611988967ee97aea7f05e00cfa027906b204dfc1dc47696e2c502e0524c3fa7a","Android.bp":"7954e136a195b0d26a4a0730f26a18f010fde3cc928b6f83522cc77b62fd6d26","Cargo.toml":"5fed6f33707c14e08f181a0f19bc5c9a7b4307d8cf5373b83a0eb91e73241930","LICENSE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-APACHE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-MIT":"cec4013700872627ee18d2128d3bbde3e1bf1912a61eec493299dc0f434300fb","LICENSE-ZLIB":"a5748e7b6f484bb179d81e382c7cf9526f2da5dc1b027844ae85ed0b739cb56d","METADATA":"9c740a8e8a247f3f164cf039d36add1e74f8b7bfa24b3245f128cfb1fa42e944","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f6af7c3c0ef64c3625910cbf81cf69fe64d0ca6de5103379ae05cccc082c6a46","TEST_MAPPING":"56f237fe59538452b8639ea7252252654ac69662663eb2ea34ad388b1dae7572","cargo_embargo.json":"e0c03e048791d1e8f84c21f1e4d0b0db189a2ac3ca1d3feefdbc61d164342272","changelog.md":"68997787e8d711fa2e509feb230e7dd00a1556d9e45c1af43478d14585a7fea8","rustfmt.toml":"4dc084ed1f8eee76d5623a48573701dbb3eed85d0c858e50ad79c262598cc1c4","src/allocation.rs":"d0b8464cba876373fd2cd892f98ab8d7a8738bc850183ee084fb811c63c39912","src/anybitpattern.rs":"ae2f6c7567ac0050fd81bbe64c4552386f82c410d8c8f95844f348a523afa099","src/checked.rs":"be6b0edd1e7e65b06f109994e074f117b14378d0422d2da554745681566beeab","src/contiguous.rs":"5f226111b202ae4af33a67aebd72d5d4783b124f5aa2871aee7f5161e1f6d7fb","src/internal.rs":"77ac39d72f4c0c2baa2a9132574470dc603bce34c4f2a53e773c68538f83ac05","src/lib.rs":"3e83eb476477ad4f256e5c6258b86d9cac394dde53bf59866866d00d5529b82f","src/must.rs":"3e44ff35e8691b18f80ee897b2c521cac3cca4b13b1cfb77dbefc37ec4497a24","src/no_uninit.rs":"06a546319aac8a0cee275815860594121b16f5f740ee14aa62d28529242a9bb1","src/offset_of.rs":"d0726ced360c280d4c9f6d4dc709db482049c71434baa4810ea8782510b05989","src/pod.rs":"8f8d08e26cb5b784c682f50c9cc7432f1a592bb1d4ae72283ecbd13771736b51","src/pod_in_option.rs":"e88a449242133014c7490ae6c0ee4c164f3f41de80f329ce823299ce0fbc0692","src/transparent.rs":"43d6b547d72aa58fb31482fa61dcf2e5beb7075e2419805ae20c16915aa15083","src/zeroable.rs":"551b8f8fdec212afef7aa1d608542a78f994e404a0928b7baed251ec23391ae3","src/zeroable_in_option.rs":"e7e1842d2ae5af18cc040b2de9b4300b0ad8a29ffec2a0e1eea554f742765740","tests/array_tests.rs":"63a1f7bf11d09234d456f1eda4f7c59f7af313ee7f692f085fec6c7a303ab0a0","tests/cast_slice_tests.rs":"0fccf1f772c3eed58e24dd3cd0ef7e6c3f580fbc21867a849a35094a906a16b5","tests/checked_tests.rs":"2bee46585c6b6608df216381b1326c2fd56e05c8d7d121db4d37368eeff5fc7e","tests/derive.rs":"4d90facd45007555640269a46a0ef1c904c8665ee1ace879fa0c722977dc0acd","tests/doc_tests.rs":"ebc71de72bfe4499e0b512c94df4c06daa2cb09b6a519690e1f5d9d9e5ebc4dc","tests/offset_of_tests.rs":"fab12e44f1a5f7b86047b5bfa922d800081a2a3a27d58a9f72e374a73aec7f4f","tests/std_tests.rs":"45484e668354e80608df356860805ece04402ec4698760600d87dfc628089f3e","tests/transparent.rs":"66bb171f783a5ede3955ee63562352d538ca11eb16a9bfe72cc38b0f72e5a230","tests/wrapper_forgets.rs":"436c24e0834ff341db64b4b52bceb5c18c83415d01f830c2ec0fcad7266d4ba5"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"f0c247a14128bd7289a47cbbdb5d1df42f665bc16ea40c12fc5a1085774d6097","Android.bp":"9f13e6a1a13a7085aada8ac14c907fca0dd5e7f9f53dc41fd00cb75502d1f3e0","Cargo.toml":"0c59d16070f73859f051853924caf7fbeb7d052b55f9f4fd6c7e8960ec0c0e89","LICENSE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-APACHE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-MIT":"cec4013700872627ee18d2128d3bbde3e1bf1912a61eec493299dc0f434300fb","LICENSE-ZLIB":"a5748e7b6f484bb179d81e382c7cf9526f2da5dc1b027844ae85ed0b739cb56d","METADATA":"3f628b4d272e28eaed30808a93030c4c88c268a7d362c2610d30ca5e527361df","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f6af7c3c0ef64c3625910cbf81cf69fe64d0ca6de5103379ae05cccc082c6a46","TEST_MAPPING":"56f237fe59538452b8639ea7252252654ac69662663eb2ea34ad388b1dae7572","cargo_embargo.json":"e0c03e048791d1e8f84c21f1e4d0b0db189a2ac3ca1d3feefdbc61d164342272","changelog.md":"2e0e62c563845a666a56ffe666acc2c99464207fb90087b4b8b3335e0d71a510","rustfmt.toml":"4dc084ed1f8eee76d5623a48573701dbb3eed85d0c858e50ad79c262598cc1c4","src/allocation.rs":"d0b8464cba876373fd2cd892f98ab8d7a8738bc850183ee084fb811c63c39912","src/anybitpattern.rs":"ae2f6c7567ac0050fd81bbe64c4552386f82c410d8c8f95844f348a523afa099","src/checked.rs":"8cdfa353780fcac3d085d1f00d170f7be08214fe899ce7dc921de221159f6e5c","src/contiguous.rs":"5f226111b202ae4af33a67aebd72d5d4783b124f5aa2871aee7f5161e1f6d7fb","src/internal.rs":"77ac39d72f4c0c2baa2a9132574470dc603bce34c4f2a53e773c68538f83ac05","src/lib.rs":"d358cc206da405c292132e28a485f00e7736051fd9e7ae56c7b1b2984b314ce9","src/must.rs":"ebe31709688108949d832d516f6115a76915da723c27b015f4f5c04f0f788027","src/no_uninit.rs":"06a546319aac8a0cee275815860594121b16f5f740ee14aa62d28529242a9bb1","src/offset_of.rs":"d0726ced360c280d4c9f6d4dc709db482049c71434baa4810ea8782510b05989","src/pod.rs":"7b1b485d33ed7dfeb4be4887f7c8b8d5304588b41cddd458acb532a51823bcbd","src/pod_in_option.rs":"e88a449242133014c7490ae6c0ee4c164f3f41de80f329ce823299ce0fbc0692","src/transparent.rs":"43d6b547d72aa58fb31482fa61dcf2e5beb7075e2419805ae20c16915aa15083","src/zeroable.rs":"f6da412d43d593906000113da6534b6964f3a18f0db14c0877f371b2c1e8e020","src/zeroable_in_option.rs":"e7e1842d2ae5af18cc040b2de9b4300b0ad8a29ffec2a0e1eea554f742765740","tests/array_tests.rs":"63a1f7bf11d09234d456f1eda4f7c59f7af313ee7f692f085fec6c7a303ab0a0","tests/cast_slice_tests.rs":"0fccf1f772c3eed58e24dd3cd0ef7e6c3f580fbc21867a849a35094a906a16b5","tests/checked_tests.rs":"2bee46585c6b6608df216381b1326c2fd56e05c8d7d121db4d37368eeff5fc7e","tests/derive.rs":"4d90facd45007555640269a46a0ef1c904c8665ee1ace879fa0c722977dc0acd","tests/doc_tests.rs":"ebc71de72bfe4499e0b512c94df4c06daa2cb09b6a519690e1f5d9d9e5ebc4dc","tests/offset_of_tests.rs":"fab12e44f1a5f7b86047b5bfa922d800081a2a3a27d58a9f72e374a73aec7f4f","tests/std_tests.rs":"45484e668354e80608df356860805ece04402ec4698760600d87dfc628089f3e","tests/transparent.rs":"66bb171f783a5ede3955ee63562352d538ca11eb16a9bfe72cc38b0f72e5a230","tests/wrapper_forgets.rs":"436c24e0834ff341db64b4b52bceb5c18c83415d01f830c2ec0fcad7266d4ba5"}}
\ No newline at end of file
diff --git a/crates/bytemuck/.cargo-checksum.json b/crates/bytemuck/.cargo-checksum.json
index e94d33d..2d9934f 100644
--- a/crates/bytemuck/.cargo-checksum.json
+++ b/crates/bytemuck/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"3649299f411a320ac0451f7c2f169ccd0b9246b93a95e3fb319a68dac04064fb","LICENSE-APACHE":"870e20c217d15bcfcbe53d7c5867cd8fac44a4ca0b41fc1eb843557e16063eba","LICENSE-MIT":"0b2d108c9c686a74ac312990ee8377902756a2a081a7af3b0f9d68abf0a8f1a1","LICENSE-ZLIB":"682b4c81b85e83ce6cc6e1ace38fdd97aeb4de0e972bd2b44aa0916c54af8c96","README.md":"167493de1f1ad16d13c778494ae344cd71306622c89d19002eaf7f4185c1f728","changelog.md":"8c79c066f7cccfac1e02badcbc8193de5511745ece3eae7a788dffbbfa8df239","rustfmt.toml":"f4c215534437936f924c937dbb1677f614761589300d6b389f3b518b3eb551b8","src/allocation.rs":"be0c1075015d32698722183523dae7d9cd679f93f6692e733dd6a361214404c9","src/anybitpattern.rs":"172bcc22ba7b38a9a36e34d0aa5efc8716bba77569a3c142f16f8103046f1d45","src/checked.rs":"f60c88558dbf7e1d7d2be43dce7efb100c8710cf57455d3cf586ddad4f274b14","src/contiguous.rs":"bb340c0f20a06aa725bb625edcb493146ba64980fd1fd9e450654aa37384c564","src/internal.rs":"2b5b4fdc1a5d14462dd604ca1f4f23116f40639d7d8b4c1a7189ce276edd8272","src/lib.rs":"ae83f2eb38d059356410b004024b4be500f4beebbe4d83face255f3912c47507","src/must.rs":"e14643ef6a89d2caf87b9907a5cc5624962074963ec1a046ed7ee4b37cd7eb83","src/no_uninit.rs":"4ab2f5ed29bff0b33630661154eb548f3e55581bfcf576a90397b7f8d5323201","src/offset_of.rs":"2afd190ef0462b30ade786fe813a91e7bf41cc2fa99a1d79002cbafab5964f37","src/pod.rs":"b149ec10657dc45039b0be57ef89a4be638ab54d7d15bb7a5094c48f5b067ee5","src/pod_in_option.rs":"73bbe1d69f32d909695ce26d131aa2d81eaa31e2b4532256ebfe1a6ba68675c1","src/transparent.rs":"5e555d6d83f5fe215ce2dbc949e87977aa92ab8d6f7a9be8479f63fdeda2359f","src/zeroable.rs":"fc38a6e1c6ff8f36407279752ee3858fedcb9b94a334273d74da0851dbbf89cf","src/zeroable_in_option.rs":"f74799ac3eee50116ec63a0ae4d3e351e0ab7ac807d01b4b59027bf6a68d6de6","tests/array_tests.rs":"98ca7a0dcd93e65f70d4db19643e707cafae5a249561ab151998cedb89b2e036","tests/cast_slice_tests.rs":"1869416e833757f603765afbf48152a6d32a100316529eb494b48fca6c5a8899","tests/checked_tests.rs":"27965acf20e46482b09ee56aaa2536868821be651a3b95052f40e554ecde9917","tests/derive.rs":"93b5ab70ecdd726811af9dee1702e23e964b8ceac59f727889f6a2678ad90d65","tests/doc_tests.rs":"f20708319fde62d8957909d51ee976fce394ad0891ebc4bbcf336ab026a34092","tests/offset_of_tests.rs":"fb5f91e17f984050969f8b06f1de58b5c1e80802c5deb992d3188f5ec274690f","tests/std_tests.rs":"967d4fb4cae24a374633c9b68f1ff65f86ba4c8a0e980adfe69dcaf60a9049c2","tests/transparent.rs":"ecef6e0987e28121b480942e58ce4534f13fe35667bde7f5c6e04e590b02f6a3","tests/wrapper_forgets.rs":"c6330546f6aa696245625056e7323b3916e3fb1a9fbecefe9c9e62d3726812d9"},"package":"8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"}
\ No newline at end of file
+{"files":{"Cargo.toml":"97a0b8234556120873b15b5bf6ac70930f5fe38900bbcc70ba6283467a52b1f8","LICENSE-APACHE":"870e20c217d15bcfcbe53d7c5867cd8fac44a4ca0b41fc1eb843557e16063eba","LICENSE-MIT":"0b2d108c9c686a74ac312990ee8377902756a2a081a7af3b0f9d68abf0a8f1a1","LICENSE-ZLIB":"682b4c81b85e83ce6cc6e1ace38fdd97aeb4de0e972bd2b44aa0916c54af8c96","README.md":"167493de1f1ad16d13c778494ae344cd71306622c89d19002eaf7f4185c1f728","changelog.md":"bc6a75f248b44c5f9e97f99ed133b8bc6eeeb6aa1f1436442d1f6a6a3b53d6b5","rustfmt.toml":"f4c215534437936f924c937dbb1677f614761589300d6b389f3b518b3eb551b8","src/allocation.rs":"be0c1075015d32698722183523dae7d9cd679f93f6692e733dd6a361214404c9","src/anybitpattern.rs":"172bcc22ba7b38a9a36e34d0aa5efc8716bba77569a3c142f16f8103046f1d45","src/checked.rs":"35f69278bf0106ce2855bff48ae3aeb125a54c3ee4afb123cbfe135d518e68c0","src/contiguous.rs":"bb340c0f20a06aa725bb625edcb493146ba64980fd1fd9e450654aa37384c564","src/internal.rs":"2b5b4fdc1a5d14462dd604ca1f4f23116f40639d7d8b4c1a7189ce276edd8272","src/lib.rs":"752aa0122fa8e3d80dfc48d0bf694aebbbccf7a3686ca2376aca7bb60ed627c3","src/must.rs":"fed78b2a4dac5ef6758bab53a4f3bcabd8da071854bcc07dc70a255b327ec64c","src/no_uninit.rs":"4ab2f5ed29bff0b33630661154eb548f3e55581bfcf576a90397b7f8d5323201","src/offset_of.rs":"2afd190ef0462b30ade786fe813a91e7bf41cc2fa99a1d79002cbafab5964f37","src/pod.rs":"b010341e374a7c26f84286178c435f6df2e9d80f47306cb1dc29fdb0bc4d8e0f","src/pod_in_option.rs":"73bbe1d69f32d909695ce26d131aa2d81eaa31e2b4532256ebfe1a6ba68675c1","src/transparent.rs":"5e555d6d83f5fe215ce2dbc949e87977aa92ab8d6f7a9be8479f63fdeda2359f","src/zeroable.rs":"f44c0dbfe27661e39c17379e9a3a6ad458b8ca004c1fbf3d352a18aed3f093b1","src/zeroable_in_option.rs":"f74799ac3eee50116ec63a0ae4d3e351e0ab7ac807d01b4b59027bf6a68d6de6","tests/array_tests.rs":"98ca7a0dcd93e65f70d4db19643e707cafae5a249561ab151998cedb89b2e036","tests/cast_slice_tests.rs":"1869416e833757f603765afbf48152a6d32a100316529eb494b48fca6c5a8899","tests/checked_tests.rs":"27965acf20e46482b09ee56aaa2536868821be651a3b95052f40e554ecde9917","tests/derive.rs":"93b5ab70ecdd726811af9dee1702e23e964b8ceac59f727889f6a2678ad90d65","tests/doc_tests.rs":"f20708319fde62d8957909d51ee976fce394ad0891ebc4bbcf336ab026a34092","tests/offset_of_tests.rs":"fb5f91e17f984050969f8b06f1de58b5c1e80802c5deb992d3188f5ec274690f","tests/std_tests.rs":"967d4fb4cae24a374633c9b68f1ff65f86ba4c8a0e980adfe69dcaf60a9049c2","tests/transparent.rs":"ecef6e0987e28121b480942e58ce4534f13fe35667bde7f5c6e04e590b02f6a3","tests/wrapper_forgets.rs":"c6330546f6aa696245625056e7323b3916e3fb1a9fbecefe9c9e62d3726812d9"},"package":"ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"}
\ No newline at end of file
diff --git a/crates/bytemuck/Android.bp b/crates/bytemuck/Android.bp
index 2f2a854..6f363de 100644
--- a/crates/bytemuck/Android.bp
+++ b/crates/bytemuck/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "array_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/array_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -41,7 +41,7 @@
     host_supported: true,
     crate_name: "cast_slice_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/cast_slice_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -64,7 +64,7 @@
     host_supported: true,
     crate_name: "checked_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/checked_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -87,7 +87,7 @@
     host_supported: true,
     crate_name: "doc_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/doc_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -110,7 +110,7 @@
     host_supported: true,
     crate_name: "offset_of_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/offset_of_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -133,7 +133,7 @@
     host_supported: true,
     crate_name: "std_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/std_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -156,7 +156,7 @@
     host_supported: true,
     crate_name: "transparent",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/transparent.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -179,7 +179,7 @@
     host_supported: true,
     crate_name: "bytemuck",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
@@ -202,7 +202,7 @@
     name: "libbytemuck_nostd",
     crate_name: "bytemuck",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
diff --git a/crates/bytemuck/Cargo.toml b/crates/bytemuck/Cargo.toml
index 94bbf21..4f67c8d 100644
--- a/crates/bytemuck/Cargo.toml
+++ b/crates/bytemuck/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2018"
 name = "bytemuck"
-version = "1.20.0"
+version = "1.21.0"
 authors = ["Lokathor <[email protected]>"]
 build = false
 exclude = ["/pedantic.bat"]
@@ -97,25 +97,30 @@
 aarch64_simd = []
 align_offset = []
 alloc_uninit = []
+avx512_simd = []
 const_zeroed = []
 derive = ["bytemuck_derive"]
 extern_crate_alloc = []
 extern_crate_std = ["extern_crate_alloc"]
 latest_stable_rust = [
     "aarch64_simd",
+    "avx512_simd",
     "align_offset",
     "alloc_uninit",
     "const_zeroed",
     "derive",
     "min_const_generics",
     "must_cast",
+    "must_cast_extra",
     "track_caller",
+    "transparentwrapper_extra",
     "wasm_simd",
     "zeroable_atomics",
     "zeroable_maybe_uninit",
 ]
 min_const_generics = []
 must_cast = []
+must_cast_extra = ["must_cast"]
 nightly_docs = []
 nightly_float = []
 nightly_portable_simd = []
diff --git a/crates/bytemuck/METADATA b/crates/bytemuck/METADATA
index d2c3394..b5d7f4a 100644
--- a/crates/bytemuck/METADATA
+++ b/crates/bytemuck/METADATA
@@ -1,17 +1,17 @@
 name: "bytemuck"
 description: "A crate for mucking around with piles of bytes."
 third_party {
-  version: "1.20.0"
+  version: "1.21.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 19
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/bytemuck"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/bytemuck/bytemuck-1.20.0.crate"
-    version: "1.20.0"
+    value: "https://static.crates.io/crates/bytemuck/bytemuck-1.21.0.crate"
+    version: "1.21.0"
   }
 }
diff --git a/crates/bytemuck/changelog.md b/crates/bytemuck/changelog.md
index 1e22f33..294647c 100644
--- a/crates/bytemuck/changelog.md
+++ b/crates/bytemuck/changelog.md
@@ -1,5 +1,14 @@
 # `bytemuck` changelog

 

+## 1.21

+

+* Implement `Pod` and `Zeroable` for `core::arch::{x86, x86_64}::__m512`, `__m512d` and `__m512i` without nightly.

+  Requires Rust 1.72, and is gated through the `avx512_simd` cargo feature.

+* Allow the use of `must_cast_mut` and `must_cast_slice_mut` in const contexts.

+  Requires Rust 1.83, and is gated through the `must_cast_extra` cargo feature.

+* internal: introduced the `maybe_const_fn` macro that allows defining some function

+  to be const depending upon some `cfg` predicate.

+

 ## 1.20

 

 * New functions to allocate zeroed `Arc` and `Rc`. Requires Rust 1.82

diff --git a/crates/bytemuck/src/checked.rs b/crates/bytemuck/src/checked.rs
index d0c92cb..c81b449 100644
--- a/crates/bytemuck/src/checked.rs
+++ b/crates/bytemuck/src/checked.rs
@@ -438,7 +438,7 @@
 /// Reads the slice into a `T` value.

 ///

 /// ## Panics

-/// * This is like `try_pod_read_unaligned` but will panic on failure.

+/// * This is like [`try_pod_read_unaligned`] but will panic on failure.

 #[inline]

 #[cfg_attr(feature = "track_caller", track_caller)]

 pub fn pod_read_unaligned<T: CheckedBitPattern>(bytes: &[u8]) -> T {

diff --git a/crates/bytemuck/src/lib.rs b/crates/bytemuck/src/lib.rs
index 7679f74..f820762 100644
--- a/crates/bytemuck/src/lib.rs
+++ b/crates/bytemuck/src/lib.rs
@@ -1,5 +1,6 @@
 #![no_std]

 #![warn(missing_docs)]

+#![allow(unused_mut)]

 #![allow(clippy::match_like_matches_macro)]

 #![allow(clippy::uninlined_format_args)]

 #![allow(clippy::result_unit_err)]

@@ -154,6 +155,25 @@
   };

 }

 

+/// A macro for conditionally const-ifying a function.

+/// #[allow(unused)] because currently it is only used with the `must_cast` feature.

+#[allow(unused)]

+macro_rules! maybe_const_fn {

+  (

+      #[cfg($cfg_predicate:meta)]

+      $(#[$attr:meta])*

+      $vis:vis $(unsafe $($unsafe:lifetime)?)? fn $name:ident $($rest:tt)*

+  ) => {

+      #[cfg($cfg_predicate)]

+      $(#[$attr])*

+      $vis const $(unsafe $($unsafe)?)? fn $name $($rest)*

+

+      #[cfg(not($cfg_predicate))]

+      $(#[$attr])*

+      $vis $(unsafe $($unsafe)?)? fn $name $($rest)*

+    };

+}

+

 #[cfg(feature = "extern_crate_std")]

 extern crate std;

 

diff --git a/crates/bytemuck/src/must.rs b/crates/bytemuck/src/must.rs
index 4753651..1bb5ccc 100644
--- a/crates/bytemuck/src/must.rs
+++ b/crates/bytemuck/src/must.rs
@@ -70,36 +70,39 @@
   unsafe { &*(a as *const A as *const B) }

 }

 

-/// Convert a `&mut A` into `&mut B` if infalliable, or fail to compile.

-///

-/// As [`must_cast_ref`], but `mut`.

-///

-/// ## Examples

-/// ```

-/// let mut i = 12_u16;

-/// // compiles:

-/// let bytes: &mut [u8; 2] = bytemuck::must_cast_mut(&mut i);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut bytes: &mut [u8; 2] = &mut [1, 2];

-/// // fails to compile (alignment requirements increased):

-/// let i : &mut u16 = bytemuck::must_cast_mut(bytes);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut i = 12_u16;

-/// // fails to compile (size mismatch):

-/// let bytes : &mut [u8; 3] = bytemuck::must_cast_mut(&mut i);

-/// ```

-#[inline]

-pub fn must_cast_mut<

-  A: NoUninit + AnyBitPattern,

-  B: NoUninit + AnyBitPattern,

->(

-  a: &mut A,

-) -> &mut B {

-  let _ = Cast::<A, B>::ASSERT_SIZE_EQUAL;

-  let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

-  unsafe { &mut *(a as *mut A as *mut B) }

+maybe_const_fn! {

+  #[cfg(feature = "must_cast_extra")]

+  /// Convert a `&mut A` into `&mut B` if infalliable, or fail to compile.

+  ///

+  /// As [`must_cast_ref`], but `mut`.

+  ///

+  /// ## Examples

+  /// ```

+  /// let mut i = 12_u16;

+  /// // compiles:

+  /// let bytes: &mut [u8; 2] = bytemuck::must_cast_mut(&mut i);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut bytes: &mut [u8; 2] = &mut [1, 2];

+  /// // fails to compile (alignment requirements increased):

+  /// let i : &mut u16 = bytemuck::must_cast_mut(bytes);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut i = 12_u16;

+  /// // fails to compile (size mismatch):

+  /// let bytes : &mut [u8; 3] = bytemuck::must_cast_mut(&mut i);

+  /// ```

+  #[inline]

+  pub fn must_cast_mut<

+    A: NoUninit + AnyBitPattern,

+    B: NoUninit + AnyBitPattern,

+  >(

+    a: &mut A,

+  ) -> &mut B {

+    let _ = Cast::<A, B>::ASSERT_SIZE_EQUAL;

+    let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

+    unsafe { &mut *(a as *mut A as *mut B) }

+  }

 }

 

 /// Convert `&[A]` into `&[B]` (possibly with a change in length) if

@@ -154,53 +157,56 @@
   unsafe { core::slice::from_raw_parts(a.as_ptr() as *const B, new_len) }

 }

 

-/// Convert `&mut [A]` into `&mut [B]` (possibly with a change in length) if

-/// infalliable, or fail to compile.

-///

-/// As [`must_cast_slice`], but `&mut`.

-///

-/// ## Examples

-/// ```

-/// let mut indicies = [1, 2, 3];

-/// let indicies: &mut [u16] = &mut indicies;

-/// // compiles:

-/// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(indicies);

-/// ```

-/// ```

-/// let zsts: &mut [()] = &mut [(), (), ()];

-/// // compiles:

-/// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(zsts);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut bytes = [1, 0, 2, 0, 3, 0];

-/// # let bytes : &mut [u8] = &mut bytes[..];

-/// // fails to compile (bytes.len() might not be a multiple of 2):

-/// let byte_pairs : &mut [[u8; 2]] = bytemuck::must_cast_slice_mut(bytes);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut byte_pairs = [[1, 0], [2, 0], [3, 0]];

-/// # let byte_pairs : &mut [[u8; 2]] = &mut byte_pairs[..];

-/// // fails to compile (alignment requirements increased):

-/// let indicies : &mut [u16] = bytemuck::must_cast_slice_mut(byte_pairs);

-/// ```

-/// ```compile_fail,E0080

-/// let bytes: &mut [u8] = &mut [];

-/// // fails to compile: (bytes.len() might not be 0)

-/// let zsts: &mut [()] = bytemuck::must_cast_slice_mut(bytes);

-/// ```

-#[inline]

-pub fn must_cast_slice_mut<

-  A: NoUninit + AnyBitPattern,

-  B: NoUninit + AnyBitPattern,

->(

-  a: &mut [A],

-) -> &mut [B] {

-  let _ = Cast::<A, B>::ASSERT_SIZE_MULTIPLE_OF_OR_INPUT_ZST;

-  let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

-  let new_len = if size_of::<A>() == size_of::<B>() {

-    a.len()

-  } else {

-    a.len() * (size_of::<A>() / size_of::<B>())

-  };

-  unsafe { core::slice::from_raw_parts_mut(a.as_mut_ptr() as *mut B, new_len) }

+maybe_const_fn! {

+  #[cfg(feature = "must_cast_extra")]

+  /// Convert `&mut [A]` into `&mut [B]` (possibly with a change in length) if

+  /// infalliable, or fail to compile.

+  ///

+  /// As [`must_cast_slice`], but `&mut`.

+  ///

+  /// ## Examples

+  /// ```

+  /// let mut indicies = [1, 2, 3];

+  /// let indicies: &mut [u16] = &mut indicies;

+  /// // compiles:

+  /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(indicies);

+  /// ```

+  /// ```

+  /// let zsts: &mut [()] = &mut [(), (), ()];

+  /// // compiles:

+  /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(zsts);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut bytes = [1, 0, 2, 0, 3, 0];

+  /// # let bytes : &mut [u8] = &mut bytes[..];

+  /// // fails to compile (bytes.len() might not be a multiple of 2):

+  /// let byte_pairs : &mut [[u8; 2]] = bytemuck::must_cast_slice_mut(bytes);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut byte_pairs = [[1, 0], [2, 0], [3, 0]];

+  /// # let byte_pairs : &mut [[u8; 2]] = &mut byte_pairs[..];

+  /// // fails to compile (alignment requirements increased):

+  /// let indicies : &mut [u16] = bytemuck::must_cast_slice_mut(byte_pairs);

+  /// ```

+  /// ```compile_fail,E0080

+  /// let bytes: &mut [u8] = &mut [];

+  /// // fails to compile: (bytes.len() might not be 0)

+  /// let zsts: &mut [()] = bytemuck::must_cast_slice_mut(bytes);

+  /// ```

+  #[inline]

+  pub fn must_cast_slice_mut<

+    A: NoUninit + AnyBitPattern,

+    B: NoUninit + AnyBitPattern,

+  >(

+    a: &mut [A],

+  ) -> &mut [B] {

+    let _ = Cast::<A, B>::ASSERT_SIZE_MULTIPLE_OF_OR_INPUT_ZST;

+    let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

+    let new_len = if size_of::<A>() == size_of::<B>() {

+      a.len()

+    } else {

+      a.len() * (size_of::<A>() / size_of::<B>())

+    };

+    unsafe { core::slice::from_raw_parts_mut(a.as_mut_ptr() as *mut B, new_len) }

+  }

 }

diff --git a/crates/bytemuck/src/pod.rs b/crates/bytemuck/src/pod.rs
index 7fdf5a6..7a60b08 100644
--- a/crates/bytemuck/src/pod.rs
+++ b/crates/bytemuck/src/pod.rs
@@ -153,17 +153,29 @@
 }

 

 impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Pod for x86::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86_64", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Pod for x86_64::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86", feature = "nightly_stdsimd"))]

   unsafe impl Pod for x86::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

 

 impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86_64", feature = "nightly_stdsimd"))]

   unsafe impl Pod for x86_64::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

diff --git a/crates/bytemuck/src/zeroable.rs b/crates/bytemuck/src/zeroable.rs
index 7eb476f..9d371a7 100644
--- a/crates/bytemuck/src/zeroable.rs
+++ b/crates/bytemuck/src/zeroable.rs
@@ -233,17 +233,29 @@
 }

 

 impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Zeroable for x86::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86_64", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Zeroable for x86_64::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86", feature = "nightly_stdsimd"))]

   unsafe impl Zeroable for x86::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

 

 impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86_64", feature = "nightly_stdsimd"))]

   unsafe impl Zeroable for x86_64::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

diff --git a/crates/glob/.android-checksum.json b/crates/glob/.android-checksum.json
index 362f196..0ec607e 100644
--- a/crates/glob/.android-checksum.json
+++ b/crates/glob/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"56c05b47b3bd5f8a50209ede542ce32a014163a618ea3027437e222a8e445921","Android.bp":"fdd29ea6f8b390632376a9af2d34cbbd67fa3886f5e85c7bdfa1ef0ae4d50bd0","Cargo.toml":"db5e77f01bed9cb4eb68ec0c7f6e43b37ca1ad893c55a77bdae40c47b3d77ae3","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"16693a68efd65bc6a9df3448c8f7ee6745418c73faff4ec4d443648c04285fa4","METADATA":"02117073c3090159bc4902a032a20695e8beaf2da035ef5db780adee89302252","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"aba9a7f946a48d0d78dd89df774679bd5547f43c88a7d6beb7d7f9d9a985b35d","TEST_MAPPING":"b980f27af06453e486aff3e93847a38c3886881743d109a9d083b8e6b60bee1d","cargo_embargo.json":"835449d98b03d5d6ff2bd412b91567eb90dc4f181fd463c1a03e27da48d5fc09","src/lib.rs":"57d02cd4f63fea2f731b13b0f57d044fe8de5f66586a5d0f53d1e9159b3f821b","tests/glob-std.rs":"6a2870563677f30c89621489320114738f811aa839d1f35bf94ec8251cf5b4fe","triagebot.toml":"26772e45fe413284e600760236cfd60cb726b7ae47fde22f2f9c474bd27ff8b0"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"ae557f3c5767619683fb8e1984ad583a77abae31389f62f253a96fdfc63423d5","Android.bp":"762fed9f6a48885b941666fc80aea256e62ac19c5e6a307827353a8d0459625a","CHANGELOG.md":"7feee48475b592d2d959405781a99681a181ff9186aa2fd1205ed19090346d0b","Cargo.toml":"5dccc7bdbde6dcd53bbfb87bccffeb4ddea12ba7b237751b73488f29d1c1428a","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"16693a68efd65bc6a9df3448c8f7ee6745418c73faff4ec4d443648c04285fa4","METADATA":"92b39b23acc9ebdb746c462c9123bfcdff272fbc7186632f0f424d385fb69bdf","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"8f98d8cbf55a6dd30313b80844fb06971334a66fe1b86164044369d35f29f912","TEST_MAPPING":"b980f27af06453e486aff3e93847a38c3886881743d109a9d083b8e6b60bee1d","cargo_embargo.json":"835449d98b03d5d6ff2bd412b91567eb90dc4f181fd463c1a03e27da48d5fc09","src/lib.rs":"b6eb28092e25512f3bac59134072b036ad34b546d8317ff49f16173b9a3025a6","tests/glob-std.rs":"0c22b6efd6add7f65e26502a10a4f1902709e98a56b6373ac4072ac8e86279b5","triagebot.toml":"26772e45fe413284e600760236cfd60cb726b7ae47fde22f2f9c474bd27ff8b0"}}
\ No newline at end of file
diff --git a/crates/glob/.cargo-checksum.json b/crates/glob/.cargo-checksum.json
index e31f7a6..aebac2d 100644
--- a/crates/glob/.cargo-checksum.json
+++ b/crates/glob/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"6791dcdd292ecaeeec9535afae7189026dca9d8486211acd27208673edfa995a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"3482ed957e7e22efdf5f368d92c497b932c665bce3ad17db8ec31c1007164539","src/lib.rs":"b2f3c3f48eb07f1767a7e5bb02847d10e02655f1dbf57281eb63fd001427e28b","tests/glob-std.rs":"b0a0aa11d7b8cc2cc0216fb117a543d6e584eec8b51173994dfd19761ab00a62","triagebot.toml":"a135e10c777cd13459559bdf74fb704c1379af7c9b0f70bc49fa6f5a837daa81"},"package":"d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"1d58b475783a53a2c20c8682dd666c0b3d95e3923b85c5b03eb577762178ea90","Cargo.toml":"b0fe646251875bd2b4ac71d55758fce1a58499a381d889cdec6c294064413410","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8f2d321242fc17deb4e61d9cfbaec7b68ff532e0f458190d01668b37e34bfc2f","src/lib.rs":"eceab024b44237b5960e6c3625a0449c15bcf8409fa52401c83d4287f2c0fbce","tests/glob-std.rs":"83bf0b8371190832e85ed1ab8a335df3d8c03fab529694577d722dd1a0a5f398","triagebot.toml":"a135e10c777cd13459559bdf74fb704c1379af7c9b0f70bc49fa6f5a837daa81"},"package":"a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"}
\ No newline at end of file
diff --git a/crates/glob/Android.bp b/crates/glob/Android.bp
index 9f58735..154f0cc 100644
--- a/crates/glob/Android.bp
+++ b/crates/glob/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "glob",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.3.1",
+    cargo_pkg_version: "0.3.2",
     crate_root: "src/lib.rs",
     edition: "2015",
     apex_available: [
diff --git a/crates/glob/CHANGELOG.md b/crates/glob/CHANGELOG.md
new file mode 100644
index 0000000..11d7f62
--- /dev/null
+++ b/crates/glob/CHANGELOG.md
@@ -0,0 +1,33 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+## [Unreleased]
+
+## [0.3.2](https://github.com/rust-lang/glob/compare/v0.3.1...v0.3.2) - 2024-12-28
+
+## What's Changed
+* Add fs::symlink_metadata to detect broken symlinks by @kyoheiu in https://github.com/rust-lang/glob/pull/105
+* Add support for windows verbatim disk paths by @nico-abram in https://github.com/rust-lang/glob/pull/112
+* Respect `require_literal_leading_dot` option in `glob_with` method for path components by @JohnTitor in https://github.com/rust-lang/glob/pull/128
+* Harden tests for symlink by @JohnTitor in https://github.com/rust-lang/glob/pull/127
+* Remove "extern crate" directions from README by @zmitchell in https://github.com/rust-lang/glob/pull/131
+* Add FIXME for tempdir by @JohnTitor in https://github.com/rust-lang/glob/pull/126
+* Cache information about file type by @Kobzol in https://github.com/rust-lang/glob/pull/135
+* Document the behaviour of ** with files by @Wilfred in https://github.com/rust-lang/glob/pull/138
+* Add dependabot by @oriontvv in https://github.com/rust-lang/glob/pull/139
+* Bump actions/checkout from 3 to 4 by @dependabot in https://github.com/rust-lang/glob/pull/140
+* Check only (no longer test) at the MSRV by @tgross35 in https://github.com/rust-lang/glob/pull/151
+* Add release-plz for automated releases by @tgross35 in https://github.com/rust-lang/glob/pull/150
+
+## New Contributors
+* @kyoheiu made their first contribution in https://github.com/rust-lang/glob/pull/105
+* @nico-abram made their first contribution in https://github.com/rust-lang/glob/pull/112
+* @zmitchell made their first contribution in https://github.com/rust-lang/glob/pull/131
+* @Kobzol made their first contribution in https://github.com/rust-lang/glob/pull/135
+* @Wilfred made their first contribution in https://github.com/rust-lang/glob/pull/138
+* @oriontvv made their first contribution in https://github.com/rust-lang/glob/pull/139
+* @dependabot made their first contribution in https://github.com/rust-lang/glob/pull/140
+* @tgross35 made their first contribution in https://github.com/rust-lang/glob/pull/151
+
+**Full Changelog**: https://github.com/rust-lang/glob/compare/0.3.1...0.3.2
diff --git a/crates/glob/Cargo.toml b/crates/glob/Cargo.toml
index 5397717..59393e1 100644
--- a/crates/glob/Cargo.toml
+++ b/crates/glob/Cargo.toml
@@ -10,9 +10,16 @@
 # See Cargo.toml.orig for the original contents.
 
 [package]
+rust-version = "1.23.0"
 name = "glob"
-version = "0.3.1"
+version = "0.3.2"
 authors = ["The Rust Project Developers"]
+build = false
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 Support for matching file paths against Unix shell style patterns.
 """
@@ -23,6 +30,14 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rust-lang/glob"
 
+[lib]
+name = "glob"
+path = "src/lib.rs"
+
+[[test]]
+name = "glob-std"
+path = "tests/glob-std.rs"
+
 [dev-dependencies.doc-comment]
 version = "0.3"
 
diff --git a/crates/glob/METADATA b/crates/glob/METADATA
index b4815a1..6238def 100644
--- a/crates/glob/METADATA
+++ b/crates/glob/METADATA
@@ -1,17 +1,17 @@
 name: "glob"
 description: "Support for matching file paths against Unix shell style patterns."
 third_party {
-  version: "0.3.1"
+  version: "0.3.2"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 2
-    day: 2
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/glob"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/glob/glob-0.3.1.crate"
-    version: "0.3.1"
+    value: "https://static.crates.io/crates/glob/glob-0.3.2.crate"
+    version: "0.3.2"
   }
 }
diff --git a/crates/glob/README.md b/crates/glob/README.md
index b68a40e..36302ee 100644
--- a/crates/glob/README.md
+++ b/crates/glob/README.md
@@ -16,8 +16,7 @@
 glob = "0.3.1"
 ```
 
-And add this to your crate root:
-
+If you're using Rust 1.30 or earlier, or edition 2015, add this to your crate root:
 ```rust
 extern crate glob;
 ```
diff --git a/crates/glob/src/lib.rs b/crates/glob/src/lib.rs
index 744cabf..fef8090 100644
--- a/crates/glob/src/lib.rs
+++ b/crates/glob/src/lib.rs
@@ -73,7 +73,9 @@
 use std::error::Error;
 use std::fmt;
 use std::fs;
+use std::fs::DirEntry;
 use std::io;
+use std::ops::Deref;
 use std::path::{self, Component, Path, PathBuf};
 use std::str::FromStr;
 
@@ -96,8 +98,8 @@
     dir_patterns: Vec<Pattern>,
     require_dir: bool,
     options: MatchOptions,
-    todo: Vec<Result<(PathBuf, usize), GlobError>>,
-    scope: Option<PathBuf>,
+    todo: Vec<Result<(PathWrapper, usize), GlobError>>,
+    scope: Option<PathWrapper>,
 }
 
 /// Return an iterator that produces all the `Path`s that match the given
@@ -178,7 +180,15 @@
     #[cfg(windows)]
     fn check_windows_verbatim(p: &Path) -> bool {
         match p.components().next() {
-            Some(Component::Prefix(ref p)) => p.kind().is_verbatim(),
+            Some(Component::Prefix(ref p)) => {
+                // Allow VerbatimDisk paths. std canonicalize() generates them, and they work fine
+                p.kind().is_verbatim()
+                    && if let std::path::Prefix::VerbatimDisk(_) = p.kind() {
+                        false
+                    } else {
+                        true
+                    }
+            }
             _ => false,
         }
     }
@@ -234,6 +244,7 @@
     }
 
     let scope = root.map_or_else(|| PathBuf::from("."), to_scope);
+    let scope = PathWrapper::from_path(scope);
 
     let mut dir_patterns = Vec::new();
     let components =
@@ -315,8 +326,52 @@
     }
 }
 
-fn is_dir(p: &Path) -> bool {
-    fs::metadata(p).map(|m| m.is_dir()).unwrap_or(false)
+#[derive(Debug)]
+struct PathWrapper {
+    path: PathBuf,
+    is_directory: bool,
+}
+
+impl PathWrapper {
+    fn from_dir_entry(path: PathBuf, e: DirEntry) -> Self {
+        let is_directory = e
+            .file_type()
+            .ok()
+            .and_then(|file_type| {
+                // We need to use fs::metadata to resolve the actual path
+                // if it's a symlink.
+                if file_type.is_symlink() {
+                    None
+                } else {
+                    Some(file_type.is_dir())
+                }
+            })
+            .or_else(|| fs::metadata(&path).map(|m| m.is_dir()).ok())
+            .unwrap_or(false);
+        Self { path, is_directory }
+    }
+    fn from_path(path: PathBuf) -> Self {
+        let is_directory = fs::metadata(&path).map(|m| m.is_dir()).unwrap_or(false);
+        Self { path, is_directory }
+    }
+
+    fn into_path(self) -> PathBuf {
+        self.path
+    }
+}
+
+impl Deref for PathWrapper {
+    type Target = Path;
+
+    fn deref(&self) -> &Self::Target {
+        self.path.deref()
+    }
+}
+
+impl AsRef<Path> for PathWrapper {
+    fn as_ref(&self) -> &Path {
+        self.path.as_ref()
+    }
 }
 
 /// An alias for a glob iteration result.
@@ -355,10 +410,10 @@
             // idx -1: was already checked by fill_todo, maybe path was '.' or
             // '..' that we can't match here because of normalization.
             if idx == !0 as usize {
-                if self.require_dir && !is_dir(&path) {
+                if self.require_dir && !path.is_directory {
                     continue;
                 }
-                return Some(Ok(path));
+                return Some(Ok(path.into_path()));
             }
 
             if self.dir_patterns[idx].is_recursive {
@@ -371,7 +426,7 @@
                     next += 1;
                 }
 
-                if is_dir(&path) {
+                if path.is_directory {
                     // the path is a directory, so it's a match
 
                     // push this directory's contents
@@ -386,7 +441,7 @@
                     if next == self.dir_patterns.len() - 1 {
                         // pattern ends in recursive pattern, so return this
                         // directory as a result
-                        return Some(Ok(path));
+                        return Some(Ok(path.into_path()));
                     } else {
                         // advanced to the next pattern for this path
                         idx = next + 1;
@@ -419,8 +474,8 @@
                     // *AND* its children so we don't need to check the
                     // children
 
-                    if !self.require_dir || is_dir(&path) {
-                        return Some(Ok(path));
+                    if !self.require_dir || path.is_directory {
+                        return Some(Ok(path.into_path()));
                     }
                 } else {
                     fill_todo(
@@ -469,10 +524,14 @@
 ///
 /// - `*` matches any (possibly empty) sequence of characters.
 ///
-/// - `**` matches the current directory and arbitrary subdirectories. This
-///   sequence **must** form a single path component, so both `**a` and `b**`
-///   are invalid and will result in an error.  A sequence of more than two
-///   consecutive `*` characters is also invalid.
+/// - `**` matches the current directory and arbitrary
+///   subdirectories. To match files in arbitrary subdiretories, use
+///   `**/*`.
+///
+///   This sequence **must** form a single path component, so both
+///   `**a` and `b**` are invalid and will result in an error.  A
+///   sequence of more than two consecutive `*` characters is also
+///   invalid.
 ///
 /// - `[...]` matches any character inside the brackets.  Character sequences
 ///   can also specify ranges of characters, as ordered by Unicode, so e.g.
@@ -809,10 +868,10 @@
 // special-casing patterns to match `.` and `..`, and avoiding `readdir()`
 // calls when there are no metacharacters in the pattern.
 fn fill_todo(
-    todo: &mut Vec<Result<(PathBuf, usize), GlobError>>,
+    todo: &mut Vec<Result<(PathWrapper, usize), GlobError>>,
     patterns: &[Pattern],
     idx: usize,
-    path: &Path,
+    path: &PathWrapper,
     options: MatchOptions,
 ) {
     // convert a pattern that's just many Char(_) to a string
@@ -828,7 +887,7 @@
         Some(s)
     }
 
-    let add = |todo: &mut Vec<_>, next_path: PathBuf| {
+    let add = |todo: &mut Vec<_>, next_path: PathWrapper| {
         if idx + 1 == patterns.len() {
             // We know it's good, so don't make the iterator match this path
             // against the pattern again. In particular, it can't match
@@ -840,8 +899,8 @@
     };
 
     let pattern = &patterns[idx];
-    let is_dir = is_dir(path);
-    let curdir = path == Path::new(".");
+    let is_dir = path.is_directory;
+    let curdir = path.as_ref() == Path::new(".");
     match pattern_as_str(pattern) {
         Some(s) => {
             // This pattern component doesn't have any metacharacters, so we
@@ -855,7 +914,12 @@
             } else {
                 path.join(&s)
             };
-            if (special && is_dir) || (!special && fs::metadata(&next_path).is_ok()) {
+            let next_path = PathWrapper::from_path(next_path);
+            if (special && is_dir)
+                || (!special
+                    && (fs::metadata(&next_path).is_ok()
+                        || fs::symlink_metadata(&next_path).is_ok()))
+            {
                 add(todo, next_path);
             }
         }
@@ -863,17 +927,22 @@
             let dirs = fs::read_dir(path).and_then(|d| {
                 d.map(|e| {
                     e.map(|e| {
-                        if curdir {
+                        let path = if curdir {
                             PathBuf::from(e.path().file_name().unwrap())
                         } else {
                             e.path()
-                        }
+                        };
+                        PathWrapper::from_dir_entry(path, e)
                     })
                 })
                 .collect::<Result<Vec<_>, _>>()
             });
             match dirs {
                 Ok(mut children) => {
+                    if options.require_literal_leading_dot {
+                        children
+                            .retain(|x| !x.file_name().unwrap().to_str().unwrap().starts_with("."));
+                    }
                     children.sort_by(|p1, p2| p2.file_name().cmp(&p1.file_name()));
                     todo.extend(children.into_iter().map(|x| Ok((x, idx))));
 
@@ -885,7 +954,7 @@
                     if !pattern.tokens.is_empty() && pattern.tokens[0] == Char('.') {
                         for &special in &[".", ".."] {
                             if pattern.matches_with(special, options) {
-                                add(todo, path.join(special));
+                                add(todo, PathWrapper::from_path(path.join(special)));
                             }
                         }
                     }
@@ -1097,15 +1166,13 @@
             // check windows absolute paths with host/device components
             let root_with_device = current_dir()
                 .ok()
-                .and_then(|p| {
-                    match p.components().next().unwrap() {
-                        Component::Prefix(prefix_component) => {
-                            let path = Path::new(prefix_component.as_os_str());
-                            path.join("*");
-                            Some(path.to_path_buf())
-                        }
-                        _ => panic!("no prefix in this path"),
+                .and_then(|p| match p.components().next().unwrap() {
+                    Component::Prefix(prefix_component) => {
+                        let path = Path::new(prefix_component.as_os_str());
+                        path.join("*");
+                        Some(path.to_path_buf())
                     }
+                    _ => panic!("no prefix in this path"),
                 })
                 .unwrap();
             // FIXME (#9639): This needs to handle non-utf8 paths
diff --git a/crates/glob/tests/glob-std.rs b/crates/glob/tests/glob-std.rs
index 085eb6d..4466413 100644
--- a/crates/glob/tests/glob-std.rs
+++ b/crates/glob/tests/glob-std.rs
@@ -15,7 +15,7 @@
 extern crate glob;
 extern crate tempdir;
 
-use glob::glob;
+use glob::{glob, glob_with};
 use std::env;
 use std::fs;
 use std::path::PathBuf;
@@ -31,10 +31,40 @@
         }
     }
 
+    fn mk_symlink_file(original: &str, link: &str) {
+        #[cfg(unix)]
+        {
+            use std::os::unix::fs::symlink;
+            symlink(original, link).unwrap();
+        }
+        #[cfg(windows)]
+        {
+            use std::os::windows::fs::symlink_file;
+            symlink_file(original, link).unwrap();
+        }
+    }
+
+    fn mk_symlink_dir(original: &str, link: &str) {
+        #[cfg(unix)]
+        {
+            use std::os::unix::fs::symlink;
+            symlink(original, link).unwrap();
+        }
+        #[cfg(windows)]
+        {
+            use std::os::windows::fs::symlink_dir;
+            symlink_dir(original, link).unwrap();
+        }
+    }
+
     fn glob_vec(pattern: &str) -> Vec<PathBuf> {
         glob(pattern).unwrap().map(|r| r.unwrap()).collect()
     }
 
+    fn glob_with_vec(pattern: &str, options: glob::MatchOptions) -> Vec<PathBuf> {
+        glob_with(pattern, options).unwrap().map(|r| r.unwrap()).collect()
+    }
+
     let root = TempDir::new("glob-tests");
     let root = root.ok().expect("Should have created a temp directory");
     assert!(env::set_current_dir(root.path()).is_ok());
@@ -48,6 +78,10 @@
     mk_file("bbb", true);
     mk_file("bbb/specials", true);
     mk_file("bbb/specials/!", false);
+    // a valid symlink
+    mk_symlink_file("aaa/apple", "aaa/green_apple");
+    // a broken symlink
+    mk_symlink_file("aaa/setsuna", "aaa/kazusa");
 
     // windows does not allow `*` or `?` characters to exist in filenames
     if env::consts::FAMILY != "windows" {
@@ -78,6 +112,22 @@
     mk_file("r/three", true);
     mk_file("r/three/c.md", false);
 
+    mk_file("dirsym", true);
+    mk_symlink_dir(root.path().join("r").to_str().unwrap(), "dirsym/link");
+
+    assert_eq!(
+        glob_vec("dirsym/**/*.md"),
+        vec!(
+            PathBuf::from("dirsym/link/another/a.md"),
+            PathBuf::from("dirsym/link/current_dir.md"),
+            PathBuf::from("dirsym/link/one/a.md"),
+            PathBuf::from("dirsym/link/one/another/a.md"),
+            PathBuf::from("dirsym/link/one/another/deep/spelunking.md"),
+            PathBuf::from("dirsym/link/three/c.md"),
+            PathBuf::from("dirsym/link/two/b.md")
+        )
+    );
+
     // all recursive entities
     assert_eq!(
         glob_vec("r/**"),
@@ -91,6 +141,25 @@
         )
     );
 
+    // std-canonicalized windows verbatim disk paths should work
+    if env::consts::FAMILY == "windows" {
+        let r_verbatim = PathBuf::from("r").canonicalize().unwrap();
+        assert_eq!(
+            glob_vec(&format!("{}\\**", r_verbatim.display().to_string()))
+                .into_iter()
+                .map(|p| p.strip_prefix(&r_verbatim).unwrap().to_owned())
+                .collect::<Vec<_>>(),
+            vec!(
+                PathBuf::from("another"),
+                PathBuf::from("one"),
+                PathBuf::from("one\\another"),
+                PathBuf::from("one\\another\\deep"),
+                PathBuf::from("three"),
+                PathBuf::from("two")
+            )
+        );
+    }
+
     // collapse consecutive recursive patterns
     assert_eq!(
         glob_vec("r/**/**"),
@@ -223,8 +292,10 @@
         glob_vec("aaa/*"),
         vec!(
             PathBuf::from("aaa/apple"),
+            PathBuf::from("aaa/green_apple"),
+            PathBuf::from("aaa/kazusa"),
             PathBuf::from("aaa/orange"),
-            PathBuf::from("aaa/tomato")
+            PathBuf::from("aaa/tomato"),
         )
     );
 
@@ -232,6 +303,8 @@
         glob_vec("aaa/*a*"),
         vec!(
             PathBuf::from("aaa/apple"),
+            PathBuf::from("aaa/green_apple"),
+            PathBuf::from("aaa/kazusa"),
             PathBuf::from("aaa/orange"),
             PathBuf::from("aaa/tomato")
         )
@@ -262,6 +335,9 @@
 
     assert_eq!(glob_vec("aaa/tomato/tomato.txt/"), Vec::<PathBuf>::new());
 
+    // Ensure to find a broken symlink.
+    assert_eq!(glob_vec("aaa/kazusa"), vec!(PathBuf::from("aaa/kazusa")));
+
     assert_eq!(glob_vec("aa[a]"), vec!(PathBuf::from("aaa")));
     assert_eq!(glob_vec("aa[abc]"), vec!(PathBuf::from("aaa")));
     assert_eq!(glob_vec("a[bca]a"), vec!(PathBuf::from("aaa")));
@@ -288,6 +364,27 @@
         vec!(PathBuf::from("bbb/specials/]"))
     );
 
+    mk_file("i", true);
+    mk_file("i/qwe", true);
+    mk_file("i/qwe/.aaa", false);
+    mk_file("i/qwe/.bbb", true);
+    mk_file("i/qwe/.bbb/ccc", false);
+    mk_file("i/qwe/.bbb/.ddd", false);
+    mk_file("i/qwe/eee", false);
+
+    let options = glob::MatchOptions {
+        case_sensitive: false,
+        require_literal_separator: true,
+        require_literal_leading_dot: true,
+    };
+    assert_eq!(glob_with_vec("i/**/*a*", options), Vec::<PathBuf>::new());
+    assert_eq!(glob_with_vec("i/**/*c*", options), Vec::<PathBuf>::new());
+    assert_eq!(glob_with_vec("i/**/*d*", options), Vec::<PathBuf>::new());
+    assert_eq!(
+        glob_with_vec("i/**/*e*", options),
+        vec!(PathBuf::from("i/qwe"), PathBuf::from("i/qwe/eee"))
+    );
+
     if env::consts::FAMILY != "windows" {
         assert_eq!(
             glob_vec("bbb/specials/[*]"),
diff --git a/crates/itertools/.android-checksum.json b/crates/itertools/.android-checksum.json
index bad3edd..1d505e1 100644
--- a/crates/itertools/.android-checksum.json
+++ b/crates/itertools/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"257dc46557410c03abd76c73a69f9adf3e564bbbea257a4b98eeb26162b7f207","Android.bp":"5ee265653e6582d25b05825dc8a2e7e41729cde2b8e667337d995624e817789d","CHANGELOG.md":"f1847e87f3097ef6f806ea99742d417c54cef0c02c96c8a52df8f43f9c92f0db","CONTRIBUTING.md":"0d7ab7d906e3ffb5f7c83efeefe84579106cc9f12a87886f03fdb0ddc5b8f81e","Cargo.lock":"32bc950e9dd34296698a2d5c3ce1e60aa1d7a0526578ae3fa6aeab144dbc41a7","Cargo.toml":"e762efee6c058e7b9ee88bd45fd9fd7aa55bfd288a9af6baafe5dfcae6d192a5","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"25045647f8514b43237cf0efdc4ba7dc153f8793e19c9e4b4a65af7e1b78cb5b","METADATA":"f3168c1900d70cac03a3469f5f523109e334aa59e35b95e8724c91a260506fbb","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"9cde44f0b329cdf3c255738ca84b60032f6280349ed2bc63270a4556fb39a065","TEST_MAPPING":"07d90e0d0888f048c20648fd613f2d89945853092265fa9346a3d4254bf0de17","benches/bench1.rs":"3d593f853938bf0d3eaeed26cd39a3afb90c48a8e799a4d4ff0dc26c5eee85f1","benches/combinations.rs":"9b36ec7cf395c2d8892a027914d57b114302f9a0a499959a1ad1c8942742daf8","benches/combinations_with_replacement.rs":"9fa18af6ddfc6f812fcaca4bc77fba4d4a04577251e2bcc25ff2bf5b9478bcdd","benches/fold_specialization.rs":"048b22ee15ca3c8f2da52ea3394527106cd1d8296d59898a7f84ff85c79e68a9","benches/powerset.rs":"47fe0d3cb3ba056283b88d7250c4f250b58b98020aed775a3ee03d26cf63fed4","benches/specializations.rs":"58cf97f0c51b48a491b897f5e5c6ff90854b871f53a27f19db52d2cd44998442","benches/tree_reduce.rs":"88c65e4da528f6df83a37eb720a8441eb284e872a5daf184a1004109937417f3","benches/tuple_combinations.rs":"4bc2c02549fd3aac467fd2c40e4f3134901ef2cecc67d3ace338d42f5d7bddd8","benches/tuples.rs":"07a663fced16df1e519110ba5c2dd9483955f2f21e8fc5171eea60d52bc715d0","cargo_embargo.json":"1c412d446965f40b1f2eb1d39291bb0e0732cc3b9c5fb36737f432d930e23c6e","examples/iris.data":"f952e90ad557c796d4834705174aaf71bb0a235dd09ca9407eff9b5b72a9f76f","examples/iris.rs":"6c3b8e2763ee4fdec1ecd7a4942b2d1bbf71d9658feb866b7420cb7512945c99","src/adaptors/coalesce.rs":"0a14e65588912e47c86c4cc43be4173992ac69958e73e4ca75406bf1a72787c1","src/adaptors/map.rs":"d0d5adb862ba83a9ff8d7bc2c2aa3e794a00639cb93a8355b4388c3d726d5c22","src/adaptors/mod.rs":"87833680388fc63edb2f4c9775a20e2e7e9055da0b527aeeecac9c9c1ffa8ef4","src/adaptors/multi_product.rs":"833ccc206e0d6d0a6e5ec95835c6ef87b9c6ff0db510c3aaf9a5627cd5061feb","src/combinations.rs":"1cea853cdba4b0254520e19129266651dec5a874cd386d7df80f74c05a0f16f3","src/combinations_with_replacement.rs":"7ebf227e9a1999a302e3f4642f27b39a96bad81760a8e0a19c4ec5eb1a20559c","src/concat_impl.rs":"4c0774db0f60c30214dafa73441676e7e81a4d6d64e579a80cc1a3092852266b","src/cons_tuples_impl.rs":"8fe663096421ee4cb48433298d2d3dd574261219004cf862d763256ef0f5073e","src/diff.rs":"a75dbab47313046304d8accbb1a4511800a90a5da861fa800a1bf4a5a04eca3f","src/duplicates_impl.rs":"dd3d4e04af8a85479658115105646159640c1a2b9d2216f251922c97da8b2f49","src/either_or_both.rs":"7c990e808fd7ae8b855a8383be7cc77e7aa3b5fe52044c4a662f2e47e94a9c68","src/exactly_one_err.rs":"558badd3aad0c38c4344a8e1469af442043304af51cde3fb9b41ad4c1581f349","src/extrema_set.rs":"15e5e133bb8efa2a99e8d68b8cbf5466cad6d3d7a5baec1b11a467cb7511da5e","src/flatten_ok.rs":"0bd61298617834e035c68ac9e485bae7f9d89d0fa07b5a2a84818bbddc92abd4","src/format.rs":"266506a1caa9b14caed9a4c4ff0564025d5726fb5119c79db8489635a3f453de","src/free.rs":"75ca79438588826fa2aec14097197a0af139786417dc0902d04f7a8337fd40b1","src/group_map.rs":"f2e97e58f03f36a01e31da3f912bfe1dcd4b456d5c6e05f540c4ec8344891b4b","src/groupbylazy.rs":"6b27e9c5c801e54946dec9e29c5d4bca290d7200a84d4c93a8e4af3ad8c9e3cf","src/grouping_map.rs":"0b62f8987d14956ee7bfdb1d5bbdfe9f01e17b1585647f9ad310332e74ce2e7f","src/impl_macros.rs":"29d480f310b17a1e8c68504d1be6024a3ccf9b4350a93b2cd6ea9b7be279ac6a","src/intersperse.rs":"481b6729e3f98cd62405f0c181aa2bb528508bd084bf3a3054d57c810f6e5c43","src/iter_index.rs":"1d68bf19eed6f975d06131638534e5a7b382f5b03aeb29e1107412bb08ce36a1","src/k_smallest.rs":"ffda60dd32d662c75d3ed9cfa849458e5322fc20ecab0d2dd8cc75c9cbe9c753","src/kmerge_impl.rs":"eaff0331e8a85b5b6a2a3a2041e5546b6d765a2ea0fc948f570d577d8fc646a0","src/lazy_buffer.rs":"8fd6ff0e0700ad6f22543a9cfe209cd10e2284a2c63b769e2cfb9349e154c7d7","src/lib.rs":"590fe6fe598de46afb7eadc289438730913a7236b9a71fbb70db76855ac584dc","src/merge_join.rs":"91f824fb58859d0a0b7925f530a64e91218baf46feece8b5b76974ae5f05f8aa","src/minmax.rs":"6c1eb4f9048153adb841adcbc33c78f237fbadd3b8705289a9fef104b4920693","src/multipeek_impl.rs":"502c545ab39b8db9ea5482b37226c02290aa5ba169b58a9c2427bb38a6f18628","src/pad_tail.rs":"91babaf864d230a402d63c959f1d87a0ff6b6881bb582b213896f7fe5fa61d14","src/peek_nth.rs":"b293ccc75f50919d44653f4453cd27a28bd33f21448df57b1f87a72e38941417","src/peeking_take_while.rs":"9e0bd09c19ed1df98772b43ed16a646d6887ecb6af73e5ebf22889065fd0d770","src/permutations.rs":"1cc667ff17fa7b3a9227f7a96cb861770228c3a1cabb6e0a515cd46ab8ef46c3","src/powerset.rs":"2a55d1100eda58c94a0843a639120df6d26b15318c659404654fcfea0275880e","src/process_results_impl.rs":"1196dae4ae1118e090b46def6b4f4519392000f811c7a9ced031628553f63233","src/put_back_n_impl.rs":"da1b66a391cb0b1d5467fd6257e1dcc86b90a2c12ed03c0bd6cad73a71c3414d","src/rciter_impl.rs":"7774181fcf4b70155123faacd512ba059d18ef05a5a3dd7fb5fab61d7540d99f","src/repeatn.rs":"4d5be3a1d97e91ee94fdc8d508ebe7fb815279db1b06d0e38ddf69e58475ed4a","src/size_hint.rs":"3ef07e7c3fa75bd1469de67452f8eb992a4d6c3e7839e79ff883bfb02ed65839","src/sources.rs":"b9d87801a0c1d39efb657a6f4fa33e95e71fab2230a8e2ae3d02bb686f42cb99","src/take_while_inclusive.rs":"ec3a8501a874422d8a7e6f556c949cc411180e43116ed7fa5f92954829eb56da","src/tee.rs":"9f97c5b4bb44ce437b51e92619274a488bd32eab8a9897c192e64dea9d5fbd9b","src/tuple_impl.rs":"0ece5c00544ffe88c61d89ad7bb997127c86764f17fe1a53e6a0c019ba185984","src/unique_impl.rs":"a99c3ae80697791d7b663b1d8a981fdcfe6e1ca67155c4ac87b4ad1d8fb6e18e","src/unziptuple.rs":"e26d5ab3e522604e84b5286ab0d7f608394677db3b9a69beeb4d557f5871f8d4","src/with_position.rs":"9cdd85aa92ccdadf88dfcd9643a69af6d3e053c5597ef3b00ee62fdc5bbc611d","src/zip_eq_impl.rs":"38fa6317618064c666be842ac1452c04b4f90d2e90e4e2a54266312a13963031","src/zip_longest.rs":"3f9003b0b7c050d53f48d2d36997ea45bb428fa74e5ba13d1df98205f7a51084","src/ziptuple.rs":"552ab217529b637f12b5e39702008f0ac91d2dc0b5d5819b839766d740c64c9e","tests/adaptors_no_collect.rs":"1aa9c1a1f6144f7b7a126c1802c2a791e1bc7d0a6330971ab5d51c1f6ab9e2d9","tests/flatten_ok.rs":"05d7773126bc41913bd6a5db6617c4cf90bb051f6ad5e7c1718694b6a0b4e0c1","tests/laziness.rs":"660e0df9a95e5021d954b57fec5ca18aeb71a6fd8c13637faf0eef023642c084","tests/macros_hygiene.rs":"809cebecb915752fe8e2b5883f8725b0494181775ddbe231bb0945c686dc53b6","tests/merge_join.rs":"cf07e22a97cb496ae2a18ffbecaf797c9cc99f2a0de7958ebf0da86b21590cad","tests/peeking_take_while.rs":"8b0220981b437aa6756f2510ea4e25cf49a19a399a14a465dccff9ad08c48d55","tests/quick.rs":"700de3a8923974ee349a395febd047befb668b4aeb523cfa3c7d0442724ef8b4","tests/specializations.rs":"3d5e5305d4c23d780cd7003c78c87c9f8eccbf32d86680a6ad5da6c2081d7980","tests/test_core.rs":"c3986dcb99a72f8d36203a341acdd71771b96f354a2832f1b25ff0bc740bb6ae","tests/test_std.rs":"818af66b216bafdd527ff456ad4943187f28b59b9eb215c4c38981038192a988","tests/tuples.rs":"92df348f8816e17a3c02eeac420ae33e0a2c6ff994f8171aaecd3875863d2f0f","tests/zip.rs":"f1d057149f847eccaebc110b474df6bc6c65e002be09af64516c46675a10ba99"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"e4ab3828cab0255c2394a3c0b04bd22eeb1698b2fa7591a4e75b164c8f255260","Android.bp":"6db0a7d0d137b70817938262b39b68e4620d28ef2d1fb85d3cde789a9cff5874","CHANGELOG.md":"943156ca6b8384eb6ab7fd6b52ffb38f0874915fac724845fb1fde34ec56202a","CONTRIBUTING.md":"0d7ab7d906e3ffb5f7c83efeefe84579106cc9f12a87886f03fdb0ddc5b8f81e","Cargo.lock":"bc157173dcde8d4fcb537b05849527e45ba85d079866ae3027feb6d11bcfdaa7","Cargo.toml":"7ab158a0e9c5cac50f97adc234907c1569e51b2f9e47ba74addfd8540c8c337e","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"25045647f8514b43237cf0efdc4ba7dc153f8793e19c9e4b4a65af7e1b78cb5b","METADATA":"c48db4794e069d47a59163878e98a4854a6c7e40ff7bd9a512dddaa443b999bb","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"1b66d859b3ffc9629f9389d22b3ef05598e4675af432ba7ba7ba2fa474962174","TEST_MAPPING":"07d90e0d0888f048c20648fd613f2d89945853092265fa9346a3d4254bf0de17","benches/bench1.rs":"3d593f853938bf0d3eaeed26cd39a3afb90c48a8e799a4d4ff0dc26c5eee85f1","benches/combinations.rs":"9b36ec7cf395c2d8892a027914d57b114302f9a0a499959a1ad1c8942742daf8","benches/combinations_with_replacement.rs":"9fa18af6ddfc6f812fcaca4bc77fba4d4a04577251e2bcc25ff2bf5b9478bcdd","benches/fold_specialization.rs":"048b22ee15ca3c8f2da52ea3394527106cd1d8296d59898a7f84ff85c79e68a9","benches/k_smallest.rs":"bb2b1f1e05814a42da916884727ac550ee995c3b90070497c41d9906cbefbb1b","benches/powerset.rs":"47fe0d3cb3ba056283b88d7250c4f250b58b98020aed775a3ee03d26cf63fed4","benches/specializations.rs":"1662f3f02d989458de47c219ef6dd507f75ee9e0046fabd198ac4b2ddf83c299","benches/tree_reduce.rs":"88c65e4da528f6df83a37eb720a8441eb284e872a5daf184a1004109937417f3","benches/tuple_combinations.rs":"4bc2c02549fd3aac467fd2c40e4f3134901ef2cecc67d3ace338d42f5d7bddd8","benches/tuples.rs":"07a663fced16df1e519110ba5c2dd9483955f2f21e8fc5171eea60d52bc715d0","cargo_embargo.json":"1c412d446965f40b1f2eb1d39291bb0e0732cc3b9c5fb36737f432d930e23c6e","examples/iris.data":"f952e90ad557c796d4834705174aaf71bb0a235dd09ca9407eff9b5b72a9f76f","examples/iris.rs":"6c3b8e2763ee4fdec1ecd7a4942b2d1bbf71d9658feb866b7420cb7512945c99","src/adaptors/coalesce.rs":"0a14e65588912e47c86c4cc43be4173992ac69958e73e4ca75406bf1a72787c1","src/adaptors/map.rs":"d0d5adb862ba83a9ff8d7bc2c2aa3e794a00639cb93a8355b4388c3d726d5c22","src/adaptors/mod.rs":"42b75e89940d8ebb8cf8c16032d56100a12c73bc567316666d4710feec3e71b9","src/adaptors/multi_product.rs":"833ccc206e0d6d0a6e5ec95835c6ef87b9c6ff0db510c3aaf9a5627cd5061feb","src/combinations.rs":"011a33f4b1e2ae57380800d5878c27a736fab0ed7f3b676d0be655cdad8d22b7","src/combinations_with_replacement.rs":"1dd4c50b9add8cba32f47571449cd03bb93db52013c9e8ffe9ca3acb851c01c8","src/concat_impl.rs":"4ab66a9a9800bc20d061a23d6a7bca235f038865850860da77311a0ddf852fc1","src/cons_tuples_impl.rs":"cbfaec74702bb6397b1005b8460b1ba2cfb7c52771b9009dd730a8bff45c09b9","src/diff.rs":"a66f924d8f57718a36e13b5aee2fe142fbb4e2d8ab974a2a83c9f6405278d7d0","src/duplicates_impl.rs":"dd3d4e04af8a85479658115105646159640c1a2b9d2216f251922c97da8b2f49","src/either_or_both.rs":"7c990e808fd7ae8b855a8383be7cc77e7aa3b5fe52044c4a662f2e47e94a9c68","src/exactly_one_err.rs":"558badd3aad0c38c4344a8e1469af442043304af51cde3fb9b41ad4c1581f349","src/extrema_set.rs":"dbbb20f4f293a74dad55b0c0286a38b6849ce918c9085274aafbc7fbde9de013","src/flatten_ok.rs":"0bd61298617834e035c68ac9e485bae7f9d89d0fa07b5a2a84818bbddc92abd4","src/format.rs":"4c5f963ea4a9d4da941c2209496596d895d73db968b1e41b09be39589eb36ac6","src/free.rs":"b6f64938e164559b0a7eb2696d2f460efae6373f4edde12ce2d247b9a67bc526","src/group_map.rs":"f2e97e58f03f36a01e31da3f912bfe1dcd4b456d5c6e05f540c4ec8344891b4b","src/groupbylazy.rs":"6b27e9c5c801e54946dec9e29c5d4bca290d7200a84d4c93a8e4af3ad8c9e3cf","src/grouping_map.rs":"116a100889201637b519cc33dcf20fbf0ce403a1008fddc5f7dc82e6fb34fcf5","src/impl_macros.rs":"29d480f310b17a1e8c68504d1be6024a3ccf9b4350a93b2cd6ea9b7be279ac6a","src/intersperse.rs":"481b6729e3f98cd62405f0c181aa2bb528508bd084bf3a3054d57c810f6e5c43","src/iter_index.rs":"1d68bf19eed6f975d06131638534e5a7b382f5b03aeb29e1107412bb08ce36a1","src/k_smallest.rs":"381043da6b7af62574c5c5034dd55bb1eb7074cc32b1df1340c921e67463b150","src/kmerge_impl.rs":"9670e60ba6ef3c6c51713ccd3eee46f1744393daaa4833ebbe52df7c6965f3b6","src/lazy_buffer.rs":"0bf7a4fe8a7d3d23783bf61e674bfd0ba03cca55cc1d0549145758611f1bdbed","src/lib.rs":"a2156c5f51ce3559c21f6f5eb63e7d0c7fae75cc9e93ec54d09f106198507b07","src/merge_join.rs":"b7ef9d7a3654279e808f32b7751c752f2db5fa35521affd0ed560fa5303e06e1","src/minmax.rs":"6c1eb4f9048153adb841adcbc33c78f237fbadd3b8705289a9fef104b4920693","src/multipeek_impl.rs":"502c545ab39b8db9ea5482b37226c02290aa5ba169b58a9c2427bb38a6f18628","src/next_array.rs":"fd5904fc07fb4b9e4c48a2771a3d300ffabe9db0680ebe96ea754d21e6d2876f","src/pad_tail.rs":"91babaf864d230a402d63c959f1d87a0ff6b6881bb582b213896f7fe5fa61d14","src/peek_nth.rs":"b293ccc75f50919d44653f4453cd27a28bd33f21448df57b1f87a72e38941417","src/peeking_take_while.rs":"ff66fc7a97a9101a04ec5f4a0e56b5754c69ce7b27f3132c5d376b30a1f0b19d","src/permutations.rs":"1cc667ff17fa7b3a9227f7a96cb861770228c3a1cabb6e0a515cd46ab8ef46c3","src/powerset.rs":"2a55d1100eda58c94a0843a639120df6d26b15318c659404654fcfea0275880e","src/process_results_impl.rs":"67c7cd60171053c21939252b71aad6879d6ad251a6ea3d50af1ffb0d0b4241bd","src/put_back_n_impl.rs":"da1b66a391cb0b1d5467fd6257e1dcc86b90a2c12ed03c0bd6cad73a71c3414d","src/rciter_impl.rs":"3aa04cdf4cbd96ddff4b210e90652e346177663b1993836b0f88215043ab228b","src/repeatn.rs":"4d5be3a1d97e91ee94fdc8d508ebe7fb815279db1b06d0e38ddf69e58475ed4a","src/size_hint.rs":"3ef07e7c3fa75bd1469de67452f8eb992a4d6c3e7839e79ff883bfb02ed65839","src/sources.rs":"b9d87801a0c1d39efb657a6f4fa33e95e71fab2230a8e2ae3d02bb686f42cb99","src/take_while_inclusive.rs":"ec3a8501a874422d8a7e6f556c949cc411180e43116ed7fa5f92954829eb56da","src/tee.rs":"9f97c5b4bb44ce437b51e92619274a488bd32eab8a9897c192e64dea9d5fbd9b","src/tuple_impl.rs":"0ece5c00544ffe88c61d89ad7bb997127c86764f17fe1a53e6a0c019ba185984","src/unique_impl.rs":"a99c3ae80697791d7b663b1d8a981fdcfe6e1ca67155c4ac87b4ad1d8fb6e18e","src/unziptuple.rs":"e26d5ab3e522604e84b5286ab0d7f608394677db3b9a69beeb4d557f5871f8d4","src/with_position.rs":"9cdd85aa92ccdadf88dfcd9643a69af6d3e053c5597ef3b00ee62fdc5bbc611d","src/zip_eq_impl.rs":"10ea8763cf64c9f20172c5b041de10108f5c366f6f91bd153d00a8755d01ed94","src/zip_longest.rs":"3f9003b0b7c050d53f48d2d36997ea45bb428fa74e5ba13d1df98205f7a51084","src/ziptuple.rs":"552ab217529b637f12b5e39702008f0ac91d2dc0b5d5819b839766d740c64c9e","tests/adaptors_no_collect.rs":"1aa9c1a1f6144f7b7a126c1802c2a791e1bc7d0a6330971ab5d51c1f6ab9e2d9","tests/flatten_ok.rs":"05d7773126bc41913bd6a5db6617c4cf90bb051f6ad5e7c1718694b6a0b4e0c1","tests/laziness.rs":"660e0df9a95e5021d954b57fec5ca18aeb71a6fd8c13637faf0eef023642c084","tests/macros_hygiene.rs":"b5a9053e2a9fdc6a3f958092846b9201ae4c94a84cf853aafbd4079c8cc9aa50","tests/merge_join.rs":"cf07e22a97cb496ae2a18ffbecaf797c9cc99f2a0de7958ebf0da86b21590cad","tests/peeking_take_while.rs":"8b0220981b437aa6756f2510ea4e25cf49a19a399a14a465dccff9ad08c48d55","tests/quick.rs":"8673d4fa3aac895fddfbe0d772a162cb193cbd2f05e84ed89a281f66b4cbae99","tests/specializations.rs":"a7af5260416febe23c4175b6c744bfcaccc0ccff5034a9758b2f89ba837b7a24","tests/test_core.rs":"ff3e834c8a3cf0d12b2e4e90b696fd5406a9ca588517f5c5630c8fe5fae5556c","tests/test_std.rs":"4c761b1379cb4a48a8f995d7525f59263fd1942c33a486b72555f80115199d68","tests/tuples.rs":"92df348f8816e17a3c02eeac420ae33e0a2c6ff994f8171aaecd3875863d2f0f","tests/zip.rs":"3767be9b0e8bdbcf1a41a6230a968d14263cb5fb6941af4ecf4bbe7782a7a0b2"}}
\ No newline at end of file
diff --git a/crates/itertools/.cargo-checksum.json b/crates/itertools/.cargo-checksum.json
index 38bbe13..13a4681 100644
--- a/crates/itertools/.cargo-checksum.json
+++ b/crates/itertools/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"ceee4376468a3f7647f3bf4649e195a86873dd3091f23e3f992d248bd143fba2","CONTRIBUTING.md":"d5787d0fd4df15481e2e09a37234ac5dec22c007c890826991f633d890efa29e","Cargo.lock":"fd2c9ca8e299f51d7ed2a0f3760c393f03c544c817743ab7341c1f22b8c1d869","Cargo.toml":"49abb2101a0dd9cb137df206454b6620d04929a4975921fab6682ba834435620","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"fc812ab0d5756b62c2ae34f38365899204b53332d5e6a87a695b0fe15a466957","benches/bench1.rs":"d632c8b839d7b318d1cb7b81b9c62570c77dcdf0696b8ce3d52067c79c930f78","benches/combinations.rs":"5b3bd243336d6b6bdc111d66218f3f0a4ecdb10fb72e90db79959e3d8bb2cf6f","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/fold_specialization.rs":"66ab13fd8576a662afb59ef72c5565f5c3d27f7f30a976450ee5a14958654fa2","benches/powerset.rs":"dc1fd729584147e5d8e4d19c6ca6f8706087d41c3c5beb7293d9ea43b4beab14","benches/specializations.rs":"d8320071a692147c1239881725079003be2f924f6124c3aa3bdf6a4596d66a66","benches/tree_reduce.rs":"fa4f22f042b76df89094ddf6e925ba42c4c3992f8195e719ed035f2e7cfa05bd","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5ab542aca40df4390de0ebf3819665df402d924a7dd6f4280e6ffc942bbd25c4","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"42c1b2fc148df52a050b013a57b577ad19911f1fe85b9525863df501979b5cd1","src/adaptors/coalesce.rs":"b57157c205ae077dd398740b61c7f49023aa80868abd8a071a6fe89ae6ecc9ad","src/adaptors/map.rs":"4952ee770cb54e98b2f649efd9c98f18951689358eb9b6bee10f139d056353ae","src/adaptors/mod.rs":"7064a1043baec815c02803d5043bd950e6a515f3a0247e44028ee080004dc225","src/adaptors/multi_product.rs":"ad501e8ae4e5089b9d2f2be1f9a4713da6a2103b14daa759e09918409f88e321","src/combinations.rs":"6c1cd55051eb59c595780b055ccabb07db72add134120dd8b2f5aa60c0f5fa6e","src/combinations_with_replacement.rs":"cad1885ca51e52a1dc324a0b06bd0d1d911f1dd58cf5d76bd9a9c78a09853b86","src/concat_impl.rs":"6094463eb57f77e115f6a3fe7f469992eef81c0c4caa9585b99a426d87f794fb","src/cons_tuples_impl.rs":"3ceee1ff0dbd4c3b43195a490b8f38b05de3a46e0fb691ba11fbbe1e7e3ad746","src/diff.rs":"046b3ac4a22036b9ec8741aba4e8f6729ae44bf14346b61c23192b88d9fc7c88","src/duplicates_impl.rs":"1be37249b4566edc8da611ed9766ec851a526e7513bd13d80fe97482dcfcf7f3","src/either_or_both.rs":"cac278666b5d3c1fd103d97d15ce4c40960ea459441aeae83c6502087fd2ad8d","src/exactly_one_err.rs":"90b6204551161d27394af72107765dbfe3b51a77f4770c2e506fa4938985a184","src/extrema_set.rs":"7e0d92ca1aafc1221e08d0297087b35373463d03228a0e65628cfd1734273e90","src/flatten_ok.rs":"62c18e5221a27949a00de49414306d6dfd601515817c1c8ae6189e3275756dd3","src/format.rs":"94675a6ac4500ec52bbf8463b2241b870fea8b5dd6b113accb8a00b2c1174871","src/free.rs":"6f3597a5ccf8a9b0606da7df6803f7368152ebcf7b7bcfd31b17fcff3a286139","src/group_map.rs":"c9da201137c6bb479b9308bfc38398b76950e39905f4ce8bc435c5318371522c","src/groupbylazy.rs":"5862629719258703aad47977ba1060f20fff15e962e18e6142758ebf6cd4a61c","src/grouping_map.rs":"8dac807a6cbf1893fdc147b4160000c452bfb5e533e1c774ed6bd3af91cf46da","src/impl_macros.rs":"97fc5f39574805e0c220aa462cf1ae7dcac5c1082d6ee5500e7d71c120db5f88","src/intersperse.rs":"55031819e985c3184275e254c9600ecbe01e9fb49f198039c5da82a87ea5b90e","src/iter_index.rs":"1b0ff8376a4ad855d44db8c662450c777db84e0f4997b53ca575c65b107bb83b","src/k_smallest.rs":"6a665742f6665e350a54ae3ff821252e7c599b57aee3239a03fa56a9d1930467","src/kmerge_impl.rs":"2e425d4189898566c5146e8f5bd258045c246f6babbe3ac5fef10ca08ae2efd2","src/lazy_buffer.rs":"a065f73c228f156bdf901824977ea9375f912823af4f9b05378e3f633d3b20e4","src/lib.rs":"75903dcd21573a8a77a205cfb8d335c60c2939771481c6431c29a0918d8dbfb0","src/merge_join.rs":"bb1fccddcc647fe21da1895a8808c06596d49900f5cf60a69a9c9141fc12af11","src/minmax.rs":"0ec34b172ca8efc4aacb96f3e5771bdc5e8ac882876ee0f59d698c3924717c48","src/multipeek_impl.rs":"79eef0be49ad66f15d41808e72c03976c4f7cff5838b69d17975d3ece266f3f8","src/pad_tail.rs":"e6bb5b086478600b0dbb8726cae8364bf83ab36d989ef467e1264eea43933b50","src/peek_nth.rs":"093f1a157b1c917f041af5244a5a46311affa2922126e36dc0ee2c501c79b58c","src/peeking_take_while.rs":"6967ba212f045145da7683a192471b2dcfcedf90d23922d70a5b7e2a1b36622e","src/permutations.rs":"b316084ee14e9e138d22f177367b3bfa24cb3e5e90ab20b9b00a9a23d653496f","src/powerset.rs":"7ab24fefc914b339dd92a6c8e639d0cad34479e09293b3346078856d6bc02d34","src/process_results_impl.rs":"a6f91aec53c56b042e15ecb8f8ca489c81e3ee92347dc9fa8352a5baac44a247","src/put_back_n_impl.rs":"5a58d7a31c03029f0726e4d42de3be869580cf76b73c6d1ef70dd40c240b03a0","src/rciter_impl.rs":"9a50cdc0106587be8ee49c2af5fcf84436b74d353c2846b401eb638c23b4733c","src/repeatn.rs":"dd9a5bf5a63ef9cc6ec5c8a6137c7ffba80f13568b6d001e189daaa29ffbaf39","src/size_hint.rs":"6022c2327ddc6df7e7b939eb60a93ee66ea9aa4d3aab49b9952e663ff4bff10b","src/sources.rs":"ef942af209ca1effcd28a95abedad8c45b659ae2a15b66c2158cb604f6e325f8","src/take_while_inclusive.rs":"1973a9f5322b3dae3b5ccded5912a08a8e2e975b9a5eac666192b118b230d305","src/tee.rs":"dad50ca162627cf0a67786f0993ef27d06cdefc14d412463e58c07824ef409d8","src/tuple_impl.rs":"0213261109e7c65746ccc22425d19141907bf7ea1e3dd4c40e9f278e6148e272","src/unique_impl.rs":"1efc280226f13ddd7dd5f7eedeec0093b704596652c942f3a0b2f8c90fa2e2f7","src/unziptuple.rs":"f3f6a2ee2658fa07db7592f2c344c2e3b1263a21fc75e1325f2be32c9dc1e750","src/with_position.rs":"9ca1eb195d04690b0c3a62a6c0eea349b8042e11c4ca4b80744f54103e1c7355","src/zip_eq_impl.rs":"4e0d38266c26982ea8b8d055994cb1298e93b7749caadbd7f25d2b6e0c8ce0d7","src/zip_longest.rs":"5572699564dd5717cc074b7733333ed238c2e9f3e6819d45e33e3a2dbda74478","src/ziptuple.rs":"d3a12221d39c8a5514574adb3ad2ccd1803d514b1cb09fbcd9253e3ddd628310","tests/adaptors_no_collect.rs":"7e6240878b1fc13b6384fdde0317d5d7ccca3e417b10a201ba61eb5255400fda","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/laziness.rs":"89e6caec10da3d7aeadf9e30d5caf03cda36d07cee8415ff134b5b8e2a2cf144","tests/macros_hygiene.rs":"c9e9f0546a8c12ea52311c0eadd77d75c782d4e10ae9e74d410ea2861d526c66","tests/merge_join.rs":"5fb506b989f4a331d46cdec5775ea594656985134196099eaf8d3905bdddcdd5","tests/peeking_take_while.rs":"f834361c5520dda15eb9e9ebe87507c905462201412b21859d9f83dab91d0e0b","tests/quick.rs":"60b1ca6d820aa505545f20d6082fd08c1e0470b5326b711567ec1c93d07f9ced","tests/specializations.rs":"7c6a461850a2b4f783801ef23b2303ad985c58f2295c569001369b3c9d4c6e33","tests/test_core.rs":"482e077e0c5fe78ba0a8a126d8c0821162d820a21936855fadede713b1d4e70a","tests/test_std.rs":"f788573adc9ae19eb4bd2886c3967b273dd881982af407f6f5b6276434df0f00","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"2f68d531170fa2f106efafaf38ae854281d93305bf1b2b8d4bea833072518ecd"},"package":"413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"60ec9a1801e015e49f7fbb299b608ac730d5b1a3fb298e6cf7935c0695ddf7fe","CONTRIBUTING.md":"d5787d0fd4df15481e2e09a37234ac5dec22c007c890826991f633d890efa29e","Cargo.lock":"4422e732d4ce6f650afb53a1dcffb1e53c86dd066c3dcd66bc9620acd898b99e","Cargo.toml":"77735549383196a4156a2246dd1cd6742029b223679b3004531456d33562b0ce","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"7dba3f55ea54eff2606f8b9f005e369cf9885dd972cb481432fce00234ee7750","benches/bench1.rs":"d632c8b839d7b318d1cb7b81b9c62570c77dcdf0696b8ce3d52067c79c930f78","benches/combinations.rs":"5b3bd243336d6b6bdc111d66218f3f0a4ecdb10fb72e90db79959e3d8bb2cf6f","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/fold_specialization.rs":"66ab13fd8576a662afb59ef72c5565f5c3d27f7f30a976450ee5a14958654fa2","benches/k_smallest.rs":"c1bb2aa597def7f7c282d1196f9d70be6d10e1acbae03279c05bc8065544bb8e","benches/powerset.rs":"dc1fd729584147e5d8e4d19c6ca6f8706087d41c3c5beb7293d9ea43b4beab14","benches/specializations.rs":"daa989877d83ccd58e8de529184d50905b3d6fa60a9eeae917f38bd570d72fa4","benches/tree_reduce.rs":"fa4f22f042b76df89094ddf6e925ba42c4c3992f8195e719ed035f2e7cfa05bd","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5ab542aca40df4390de0ebf3819665df402d924a7dd6f4280e6ffc942bbd25c4","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"42c1b2fc148df52a050b013a57b577ad19911f1fe85b9525863df501979b5cd1","src/adaptors/coalesce.rs":"b57157c205ae077dd398740b61c7f49023aa80868abd8a071a6fe89ae6ecc9ad","src/adaptors/map.rs":"4952ee770cb54e98b2f649efd9c98f18951689358eb9b6bee10f139d056353ae","src/adaptors/mod.rs":"1e0cf7409c7291a923cf87f1c6d27cc57bd9f71ca52f7dd08a429aa994daa6ce","src/adaptors/multi_product.rs":"ad501e8ae4e5089b9d2f2be1f9a4713da6a2103b14daa759e09918409f88e321","src/combinations.rs":"9c4490bc4c7488fe9a8dba656a30493d90abb33006f7abbe3e266c237ffc986b","src/combinations_with_replacement.rs":"c7d6b7a122057e9aab075b2de41440ccd2973a6985fba75c2e93af13de55ef90","src/concat_impl.rs":"d61c00d43eca1193f135e25d3b6afd840c02ef1c573c29b264c47ee3429a45e8","src/cons_tuples_impl.rs":"7f46da33168107860b2b15d05d8edfe618e41bbc66ff0e16baf82d7373c4356d","src/diff.rs":"6e5ba3705a3a076d4fc360594014c90f1dfc597e61e8a629f96efa050e2433f5","src/duplicates_impl.rs":"1be37249b4566edc8da611ed9766ec851a526e7513bd13d80fe97482dcfcf7f3","src/either_or_both.rs":"cac278666b5d3c1fd103d97d15ce4c40960ea459441aeae83c6502087fd2ad8d","src/exactly_one_err.rs":"90b6204551161d27394af72107765dbfe3b51a77f4770c2e506fa4938985a184","src/extrema_set.rs":"11de200d853941716e9aa9a9b520b006704827c3c43a0c5f067906b0941e51d1","src/flatten_ok.rs":"62c18e5221a27949a00de49414306d6dfd601515817c1c8ae6189e3275756dd3","src/format.rs":"3ae6414043e0040f7358028c560437ea49afdbb2416df138a2410169e2619589","src/free.rs":"00ec21acee2ae2b30bf99e62472f9684c0a1719fbafc8dd2e4195ea8377c5b5d","src/group_map.rs":"c9da201137c6bb479b9308bfc38398b76950e39905f4ce8bc435c5318371522c","src/groupbylazy.rs":"5862629719258703aad47977ba1060f20fff15e962e18e6142758ebf6cd4a61c","src/grouping_map.rs":"3896c46ba4bd8ea886e5344a245658235626a104758d5ccecf223544a9ba471b","src/impl_macros.rs":"97fc5f39574805e0c220aa462cf1ae7dcac5c1082d6ee5500e7d71c120db5f88","src/intersperse.rs":"55031819e985c3184275e254c9600ecbe01e9fb49f198039c5da82a87ea5b90e","src/iter_index.rs":"1b0ff8376a4ad855d44db8c662450c777db84e0f4997b53ca575c65b107bb83b","src/k_smallest.rs":"a6840980e4c1aedd6987f93c904d362aa09a101537e447121fff58bb2473638d","src/kmerge_impl.rs":"3f999d55d7def904f71f2ca88b36707461f7f23b32966e0ccaf31d808886d843","src/lazy_buffer.rs":"baa01490fceb5a8dd7bd9c2634e19ce8a785bd1df352a9dd77d1344e3e0f8892","src/lib.rs":"e7f144351cca5018dc12270b4c33f0562afddb92452acfa85153cb276aebd6e9","src/merge_join.rs":"f2f257e63c84ed772b235229cc787ebe9ae009d7c80ed2087002a6b62c5e2133","src/minmax.rs":"0ec34b172ca8efc4aacb96f3e5771bdc5e8ac882876ee0f59d698c3924717c48","src/multipeek_impl.rs":"79eef0be49ad66f15d41808e72c03976c4f7cff5838b69d17975d3ece266f3f8","src/next_array.rs":"295924058891c08f9fe6313a1d9dd0042dcf60f0a514c6a6e009a1396d804fc9","src/pad_tail.rs":"e6bb5b086478600b0dbb8726cae8364bf83ab36d989ef467e1264eea43933b50","src/peek_nth.rs":"093f1a157b1c917f041af5244a5a46311affa2922126e36dc0ee2c501c79b58c","src/peeking_take_while.rs":"075ce13475c84e2cfdfaf1a7a0d0695332102c82a61914ed4c00a7d2634b1d34","src/permutations.rs":"b316084ee14e9e138d22f177367b3bfa24cb3e5e90ab20b9b00a9a23d653496f","src/powerset.rs":"7ab24fefc914b339dd92a6c8e639d0cad34479e09293b3346078856d6bc02d34","src/process_results_impl.rs":"6b5d82447eef4e87fef7b2a8e56b906ac7b000886a468ce421252f34ec86e371","src/put_back_n_impl.rs":"5a58d7a31c03029f0726e4d42de3be869580cf76b73c6d1ef70dd40c240b03a0","src/rciter_impl.rs":"081fd206ba4a601bd65e2f3b8d7c95e3e4a3564beb7c98944bd2e7986959c230","src/repeatn.rs":"dd9a5bf5a63ef9cc6ec5c8a6137c7ffba80f13568b6d001e189daaa29ffbaf39","src/size_hint.rs":"6022c2327ddc6df7e7b939eb60a93ee66ea9aa4d3aab49b9952e663ff4bff10b","src/sources.rs":"ef942af209ca1effcd28a95abedad8c45b659ae2a15b66c2158cb604f6e325f8","src/take_while_inclusive.rs":"1973a9f5322b3dae3b5ccded5912a08a8e2e975b9a5eac666192b118b230d305","src/tee.rs":"dad50ca162627cf0a67786f0993ef27d06cdefc14d412463e58c07824ef409d8","src/tuple_impl.rs":"0213261109e7c65746ccc22425d19141907bf7ea1e3dd4c40e9f278e6148e272","src/unique_impl.rs":"1efc280226f13ddd7dd5f7eedeec0093b704596652c942f3a0b2f8c90fa2e2f7","src/unziptuple.rs":"f3f6a2ee2658fa07db7592f2c344c2e3b1263a21fc75e1325f2be32c9dc1e750","src/with_position.rs":"9ca1eb195d04690b0c3a62a6c0eea349b8042e11c4ca4b80744f54103e1c7355","src/zip_eq_impl.rs":"3282b177e7dece5d3fbdc9b03563f209589a399ea45e70abf23ccca3b5512ac7","src/zip_longest.rs":"5572699564dd5717cc074b7733333ed238c2e9f3e6819d45e33e3a2dbda74478","src/ziptuple.rs":"d3a12221d39c8a5514574adb3ad2ccd1803d514b1cb09fbcd9253e3ddd628310","tests/adaptors_no_collect.rs":"7e6240878b1fc13b6384fdde0317d5d7ccca3e417b10a201ba61eb5255400fda","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/laziness.rs":"89e6caec10da3d7aeadf9e30d5caf03cda36d07cee8415ff134b5b8e2a2cf144","tests/macros_hygiene.rs":"c2d517badf593c0ba9b70e987a6f8482ed8997547b2e88bbec70babd9b677aa2","tests/merge_join.rs":"5fb506b989f4a331d46cdec5775ea594656985134196099eaf8d3905bdddcdd5","tests/peeking_take_while.rs":"f834361c5520dda15eb9e9ebe87507c905462201412b21859d9f83dab91d0e0b","tests/quick.rs":"d463bf8712b32742c93bc2cf3993031aeaba1f5b0505ca0ecd347313c3da0582","tests/specializations.rs":"fefbdac83bb774186882e3d31be619c9ce1dbfc4191a99ed2ac90aa764737a8f","tests/test_core.rs":"9bbc6772e97a60d93d4021c184b9e4de1c0440a1c48b991a92edc189699fd20d","tests/test_std.rs":"b0e56deefe309b9c11804bd069c744b5caea7960cd4b68244531f6edf38b9741","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"457e34761d9bf2943a43abd9020d2b1a4492ebff9e4d94efe4c730652fbf62af"},"package":"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"}
\ No newline at end of file
diff --git a/crates/itertools/Android.bp b/crates/itertools/Android.bp
index 18776c3..9e1cffa 100644
--- a/crates/itertools/Android.bp
+++ b/crates/itertools/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "itertools",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.13.0",
+    cargo_pkg_version: "0.14.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
diff --git a/crates/itertools/CHANGELOG.md b/crates/itertools/CHANGELOG.md
index de9564c..6b08f68 100644
--- a/crates/itertools/CHANGELOG.md
+++ b/crates/itertools/CHANGELOG.md
@@ -1,5 +1,36 @@
 # Changelog
 
+## 0.14.0
+
+### Breaking
+- Increased MSRV to 1.63.0 (#960)
+- Removed generic parameter from `cons_tuples` (#988)
+
+### Added
+- Added `array_combinations` (#991)
+- Added `k_smallest_relaxed` and variants (#925)
+- Added `next_array` and `collect_array` (#560)
+- Implemented `DoubleEndedIterator` for `FilterOk` (#948)
+- Implemented `DoubleEndedIterator` for `FilterMapOk` (#950)
+
+### Changed
+- Allow `Q: ?Sized` in `Itertools::contains` (#971)
+- Improved hygiene of `chain!` (#943)
+- Improved `into_group_map_by` documentation (#1000)
+- Improved `tree_reduce` documentation (#955)
+- Improved discoverability of `merge_join_by` (#966)
+- Improved discoverability of `take_while_inclusive` (#972)
+- Improved documentation of `find_or_last` and `find_or_first` (#984)
+- Prevented exponentially large type sizes in `tuple_combinations` (#945)
+- Added `track_caller` attr for `asser_equal` (#976)
+
+### Notable Internal Changes
+- Fixed clippy lints (#956, #987, #1008)
+- Addressed warnings within doctests (#964)
+- CI: Run most tests with miri (#961)
+- CI: Speed up "cargo-semver-checks" action (#938)
+- Changed an instance of `default_features` in `Cargo.toml` to `default-features` (#985)
+
 ## 0.13.0
 
 ### Breaking
diff --git a/crates/itertools/Cargo.lock b/crates/itertools/Cargo.lock
index d2183c2..fbf369b 100644
--- a/crates/itertools/Cargo.lock
+++ b/crates/itertools/Cargo.lock
@@ -236,7 +236,7 @@
 
 [[package]]
 name = "itertools"
-version = "0.13.0"
+version = "0.14.0"
 dependencies = [
  "criterion",
  "either",
diff --git a/crates/itertools/Cargo.toml b/crates/itertools/Cargo.toml
index 21896fe..96f9597 100644
--- a/crates/itertools/Cargo.toml
+++ b/crates/itertools/Cargo.toml
@@ -11,10 +11,16 @@
 
 [package]
 edition = "2018"
-rust-version = "1.43.1"
+rust-version = "1.63.0"
 name = "itertools"
-version = "0.13.0"
+version = "0.14.0"
 authors = ["bluss"]
+build = false
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "Extra iterator adaptors, iterator methods, free functions, and macros."
 documentation = "https://docs.rs/itertools/"
 readme = "README.md"
@@ -33,47 +39,120 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rust-itertools/itertools"
 
-[profile.bench]
-debug = 2
+[features]
+default = ["use_std"]
+use_alloc = []
+use_std = [
+    "use_alloc",
+    "either/use_std",
+]
 
 [lib]
+name = "itertools"
+path = "src/lib.rs"
 test = false
 bench = false
 
-[[bench]]
-name = "tuple_combinations"
-harness = false
+[[example]]
+name = "iris"
+path = "examples/iris.rs"
 
-[[bench]]
+[[test]]
+name = "adaptors_no_collect"
+path = "tests/adaptors_no_collect.rs"
+
+[[test]]
+name = "flatten_ok"
+path = "tests/flatten_ok.rs"
+
+[[test]]
+name = "laziness"
+path = "tests/laziness.rs"
+
+[[test]]
+name = "macros_hygiene"
+path = "tests/macros_hygiene.rs"
+
+[[test]]
+name = "merge_join"
+path = "tests/merge_join.rs"
+
+[[test]]
+name = "peeking_take_while"
+path = "tests/peeking_take_while.rs"
+
+[[test]]
+name = "quick"
+path = "tests/quick.rs"
+
+[[test]]
+name = "specializations"
+path = "tests/specializations.rs"
+
+[[test]]
+name = "test_core"
+path = "tests/test_core.rs"
+
+[[test]]
+name = "test_std"
+path = "tests/test_std.rs"
+
+[[test]]
 name = "tuples"
-harness = false
+path = "tests/tuples.rs"
 
-[[bench]]
-name = "fold_specialization"
-harness = false
-
-[[bench]]
-name = "combinations_with_replacement"
-harness = false
-
-[[bench]]
-name = "tree_reduce"
-harness = false
+[[test]]
+name = "zip"
+path = "tests/zip.rs"
 
 [[bench]]
 name = "bench1"
+path = "benches/bench1.rs"
 harness = false
 
 [[bench]]
 name = "combinations"
+path = "benches/combinations.rs"
+harness = false
+
+[[bench]]
+name = "combinations_with_replacement"
+path = "benches/combinations_with_replacement.rs"
+harness = false
+
+[[bench]]
+name = "fold_specialization"
+path = "benches/fold_specialization.rs"
+harness = false
+
+[[bench]]
+name = "k_smallest"
+path = "benches/k_smallest.rs"
 harness = false
 
 [[bench]]
 name = "powerset"
+path = "benches/powerset.rs"
 harness = false
 
 [[bench]]
 name = "specializations"
+path = "benches/specializations.rs"
+harness = false
+
+[[bench]]
+name = "tree_reduce"
+path = "benches/tree_reduce.rs"
+harness = false
+
+[[bench]]
+name = "tuple_combinations"
+path = "benches/tuple_combinations.rs"
+harness = false
+
+[[bench]]
+name = "tuples"
+path = "benches/tuples.rs"
 harness = false
 
 [dependencies.either]
@@ -82,6 +161,7 @@
 
 [dev-dependencies.criterion]
 version = "0.4.0"
+features = ["html_reports"]
 
 [dev-dependencies.paste]
 version = "1.0.0"
@@ -91,15 +171,10 @@
 
 [dev-dependencies.quickcheck]
 version = "0.9"
-default_features = false
+default-features = false
 
 [dev-dependencies.rand]
 version = "0.7"
 
-[features]
-default = ["use_std"]
-use_alloc = []
-use_std = [
-    "use_alloc",
-    "either/use_std",
-]
+[profile.bench]
+debug = 2
diff --git a/crates/itertools/METADATA b/crates/itertools/METADATA
index 6bb1771..775971a 100644
--- a/crates/itertools/METADATA
+++ b/crates/itertools/METADATA
@@ -1,17 +1,17 @@
 name: "itertools"
 description: "Extra iterator adaptors, iterator methods, free functions, and macros."
 third_party {
-  version: "0.13.0"
+  version: "0.14.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 9
-    day: 4
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/itertools"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/itertools/itertools-0.13.0.crate"
-    version: "0.13.0"
+    value: "https://static.crates.io/crates/itertools/itertools-0.14.0.crate"
+    version: "0.14.0"
   }
 }
diff --git a/crates/itertools/README.md b/crates/itertools/README.md
index 982ef5d..46acc3f 100644
--- a/crates/itertools/README.md
+++ b/crates/itertools/README.md
@@ -8,7 +8,7 @@
 
 ```toml
 [dependencies]
-itertools = "0.13.0"
+itertools = "0.14.0"
 ```
 
 How to use in your crate:
diff --git a/crates/itertools/benches/k_smallest.rs b/crates/itertools/benches/k_smallest.rs
new file mode 100644
index 0000000..509ed7f
--- /dev/null
+++ b/crates/itertools/benches/k_smallest.rs
@@ -0,0 +1,61 @@
+use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion};
+use itertools::Itertools;
+use rand::{rngs::StdRng, seq::SliceRandom, SeedableRng};
+
+fn strict(b: &mut Bencher, (k, vals): &(usize, &Vec<usize>)) {
+    b.iter(|| black_box(vals.iter()).k_smallest(*k))
+}
+
+fn relaxed(b: &mut Bencher, (k, vals): &(usize, &Vec<usize>)) {
+    b.iter(|| black_box(vals.iter()).k_smallest_relaxed(*k))
+}
+
+fn ascending(n: usize) -> Vec<usize> {
+    (0..n).collect()
+}
+
+fn random(n: usize) -> Vec<usize> {
+    let mut vals = (0..n).collect_vec();
+    vals.shuffle(&mut StdRng::seed_from_u64(42));
+    vals
+}
+
+fn descending(n: usize) -> Vec<usize> {
+    (0..n).rev().collect()
+}
+
+fn k_smallest(c: &mut Criterion, order: &str, vals: fn(usize) -> Vec<usize>) {
+    let mut g = c.benchmark_group(format!("k-smallest/{order}"));
+
+    for log_n in 20..23 {
+        let n = 1 << log_n;
+
+        let vals = vals(n);
+
+        for log_k in 7..10 {
+            let k = 1 << log_k;
+
+            let params = format!("{log_n}/{log_k}");
+            let input = (k, &vals);
+            g.bench_with_input(BenchmarkId::new("strict", &params), &input, strict);
+            g.bench_with_input(BenchmarkId::new("relaxed", &params), &input, relaxed);
+        }
+    }
+
+    g.finish()
+}
+
+fn k_smallest_asc(c: &mut Criterion) {
+    k_smallest(c, "asc", ascending);
+}
+
+fn k_smallest_rand(c: &mut Criterion) {
+    k_smallest(c, "rand", random);
+}
+
+fn k_smallest_desc(c: &mut Criterion) {
+    k_smallest(c, "desc", descending);
+}
+
+criterion_group!(benches, k_smallest_asc, k_smallest_rand, k_smallest_desc);
+criterion_main!(benches);
diff --git a/crates/itertools/benches/specializations.rs b/crates/itertools/benches/specializations.rs
index 18039fc..e70323f 100644
--- a/crates/itertools/benches/specializations.rs
+++ b/crates/itertools/benches/specializations.rs
@@ -1,4 +1,4 @@
-#![allow(unstable_name_collisions, clippy::incompatible_msrv)]
+#![allow(unstable_name_collisions)]
 
 use criterion::black_box;
 use criterion::BenchmarkId;
@@ -639,6 +639,7 @@
         v.iter().copied().map_ok(|x| x + 1)
     }
     filter_ok {
+        DoubleEndedIterator
         {
             let v = black_box((0_u32..1024)
                 .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) })
@@ -647,6 +648,7 @@
         v.iter().copied().filter_ok(|x| x % 3 == 0)
     }
     filter_map_ok {
+        DoubleEndedIterator
         {
             let v = black_box((0_u32..1024)
                 .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) })
diff --git a/crates/itertools/src/adaptors/mod.rs b/crates/itertools/src/adaptors/mod.rs
index 52e36c4..77192f2 100644
--- a/crates/itertools/src/adaptors/mod.rs
+++ b/crates/itertools/src/adaptors/mod.rs
@@ -515,7 +515,7 @@
     f: F,
 }
 
-impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F>
+impl<I, F> fmt::Debug for TakeWhileRef<'_, I, F>
 where
     I: Iterator + fmt::Debug,
 {
@@ -530,7 +530,7 @@
     TakeWhileRef { iter, f }
 }
 
-impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F>
+impl<I, F> Iterator for TakeWhileRef<'_, I, F>
 where
     I: Iterator + Clone,
     F: FnMut(&I::Item) -> bool,
@@ -773,16 +773,28 @@
             where
                 F: FnMut(B, Self::Item) -> B,
             {
+                // We outline this closure to prevent it from unnecessarily
+                // capturing the type parameters `I`, `B`, and `F`. Not doing
+                // so ended up causing exponentially big types during MIR
+                // inlining when building itertools with optimizations enabled.
+                //
+                // This change causes a small improvement to compile times in
+                // release mode.
+                type CurrTuple<A> = (A, $(ignore_ident!($X, A)),*);
+                type PrevTuple<A> = ($(ignore_ident!($X, A),)*);
+                fn map_fn<A: Clone>(z: &A) -> impl FnMut(PrevTuple<A>) -> CurrTuple<A> + '_ {
+                    move |($($X,)*)| (z.clone(), $($X),*)
+                }
                 let Self { c, item, mut iter } = self;
                 if let Some(z) = item.as_ref() {
                     init = c
-                        .map(|($($X,)*)| (z.clone(), $($X),*))
+                        .map(map_fn::<A>(z))
                         .fold(init, &mut f);
                 }
                 while let Some(z) = iter.next() {
                     let c: $P<I> = iter.clone().into();
                     init = c
-                        .map(|($($X,)*)| (z.clone(), $($X),*))
+                        .map(map_fn::<A>(&z))
                         .fold(init, &mut f);
                 }
                 init
@@ -924,6 +936,30 @@
     }
 }
 
+impl<I, F, T, E> DoubleEndedIterator for FilterOk<I, F>
+where
+    I: DoubleEndedIterator<Item = Result<T, E>>,
+    F: FnMut(&T) -> bool,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        let f = &mut self.f;
+        self.iter.rfind(|res| match res {
+            Ok(t) => f(t),
+            _ => true,
+        })
+    }
+
+    fn rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
+    where
+        Fold: FnMut(Acc, Self::Item) -> Acc,
+    {
+        let mut f = self.f;
+        self.iter
+            .filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
+            .rfold(init, fold_f)
+    }
+}
+
 impl<I, F, T, E> FusedIterator for FilterOk<I, F>
 where
     I: FusedIterator<Item = Result<T, E>>,
@@ -1005,6 +1041,30 @@
     }
 }
 
+impl<I, F, T, U, E> DoubleEndedIterator for FilterMapOk<I, F>
+where
+    I: DoubleEndedIterator<Item = Result<T, E>>,
+    F: FnMut(T) -> Option<U>,
+{
+    fn next_back(&mut self) -> Option<Self::Item> {
+        let f = &mut self.f;
+        self.iter.by_ref().rev().find_map(|res| match res {
+            Ok(t) => f(t).map(Ok),
+            Err(e) => Some(Err(e)),
+        })
+    }
+
+    fn rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
+    where
+        Fold: FnMut(Acc, Self::Item) -> Acc,
+    {
+        let mut f = self.f;
+        self.iter
+            .filter_map(|v| transpose_result(v.map(&mut f)))
+            .rfold(init, fold_f)
+    }
+}
+
 impl<I, F, T, U, E> FusedIterator for FilterMapOk<I, F>
 where
     I: FusedIterator<Item = Result<T, E>>,
@@ -1048,9 +1108,7 @@
 
     fn next(&mut self) -> Option<Self::Item> {
         let f = &mut self.f;
-        // TODO: once MSRV >= 1.62, use `then_some`.
-        self.iter
-            .find_map(|(count, val)| if f(val) { Some(count) } else { None })
+        self.iter.find_map(|(count, val)| f(val).then_some(count))
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
@@ -1078,11 +1136,10 @@
 {
     fn next_back(&mut self) -> Option<Self::Item> {
         let f = &mut self.f;
-        // TODO: once MSRV >= 1.62, use `then_some`.
         self.iter
             .by_ref()
             .rev()
-            .find_map(|(count, val)| if f(val) { Some(count) } else { None })
+            .find_map(|(count, val)| f(val).then_some(count))
     }
 
     fn rfold<B, G>(self, init: B, mut func: G) -> B
diff --git a/crates/itertools/src/combinations.rs b/crates/itertools/src/combinations.rs
index 6bb2f3e..54a0275 100644
--- a/crates/itertools/src/combinations.rs
+++ b/crates/itertools/src/combinations.rs
@@ -1,3 +1,5 @@
+use core::array;
+use core::borrow::BorrowMut;
 use std::fmt;
 use std::iter::FusedIterator;
 
@@ -6,45 +8,101 @@
 
 use crate::adaptors::checked_binomial;
 
+/// Iterator for `Vec` valued combinations returned by [`.combinations()`](crate::Itertools::combinations)
+pub type Combinations<I> = CombinationsGeneric<I, Vec<usize>>;
+/// Iterator for const generic combinations returned by [`.array_combinations()`](crate::Itertools::array_combinations)
+pub type ArrayCombinations<I, const K: usize> = CombinationsGeneric<I, [usize; K]>;
+
+/// Create a new `Combinations` from a clonable iterator.
+pub fn combinations<I: Iterator>(iter: I, k: usize) -> Combinations<I>
+where
+    I::Item: Clone,
+{
+    Combinations::new(iter, (0..k).collect())
+}
+
+/// Create a new `ArrayCombinations` from a clonable iterator.
+pub fn array_combinations<I: Iterator, const K: usize>(iter: I) -> ArrayCombinations<I, K>
+where
+    I::Item: Clone,
+{
+    ArrayCombinations::new(iter, array::from_fn(|i| i))
+}
+
 /// An iterator to iterate through all the `k`-length combinations in an iterator.
 ///
-/// See [`.combinations()`](crate::Itertools::combinations) for more information.
+/// See [`.combinations()`](crate::Itertools::combinations) and [`.array_combinations()`](crate::Itertools::array_combinations) for more information.
 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-pub struct Combinations<I: Iterator> {
-    indices: Vec<usize>,
+pub struct CombinationsGeneric<I: Iterator, Idx> {
+    indices: Idx,
     pool: LazyBuffer<I>,
     first: bool,
 }
 
-impl<I> Clone for Combinations<I>
+/// A type holding indices of elements in a pool or buffer of items from an inner iterator
+/// and used to pick out different combinations in a generic way.
+pub trait PoolIndex<T>: BorrowMut<[usize]> {
+    type Item;
+
+    fn extract_item<I: Iterator<Item = T>>(&self, pool: &LazyBuffer<I>) -> Self::Item
+    where
+        T: Clone;
+
+    fn len(&self) -> usize {
+        self.borrow().len()
+    }
+}
+
+impl<T> PoolIndex<T> for Vec<usize> {
+    type Item = Vec<T>;
+
+    fn extract_item<I: Iterator<Item = T>>(&self, pool: &LazyBuffer<I>) -> Vec<T>
+    where
+        T: Clone,
+    {
+        pool.get_at(self)
+    }
+}
+
+impl<T, const K: usize> PoolIndex<T> for [usize; K] {
+    type Item = [T; K];
+
+    fn extract_item<I: Iterator<Item = T>>(&self, pool: &LazyBuffer<I>) -> [T; K]
+    where
+        T: Clone,
+    {
+        pool.get_array(*self)
+    }
+}
+
+impl<I, Idx> Clone for CombinationsGeneric<I, Idx>
 where
-    I: Clone + Iterator,
+    I: Iterator + Clone,
     I::Item: Clone,
+    Idx: Clone,
 {
     clone_fields!(indices, pool, first);
 }
 
-impl<I> fmt::Debug for Combinations<I>
+impl<I, Idx> fmt::Debug for CombinationsGeneric<I, Idx>
 where
     I: Iterator + fmt::Debug,
     I::Item: fmt::Debug,
+    Idx: fmt::Debug,
 {
     debug_fmt_fields!(Combinations, indices, pool, first);
 }
 
-/// Create a new `Combinations` from a clonable iterator.
-pub fn combinations<I>(iter: I, k: usize) -> Combinations<I>
-where
-    I: Iterator,
-{
-    Combinations {
-        indices: (0..k).collect(),
-        pool: LazyBuffer::new(iter),
-        first: true,
+impl<I: Iterator, Idx: PoolIndex<I::Item>> CombinationsGeneric<I, Idx> {
+    /// Constructor with arguments the inner iterator and the initial state for the indices.
+    fn new(iter: I, indices: Idx) -> Self {
+        Self {
+            indices,
+            pool: LazyBuffer::new(iter),
+            first: true,
+        }
     }
-}
 
-impl<I: Iterator> Combinations<I> {
     /// Returns the length of a combination produced by this iterator.
     #[inline]
     pub fn k(&self) -> usize {
@@ -64,27 +122,7 @@
         &self.pool
     }
 
-    /// Resets this `Combinations` back to an initial state for combinations of length
-    /// `k` over the same pool data source. If `k` is larger than the current length
-    /// of the data pool an attempt is made to prefill the pool so that it holds `k`
-    /// elements.
-    pub(crate) fn reset(&mut self, k: usize) {
-        self.first = true;
-
-        if k < self.indices.len() {
-            self.indices.truncate(k);
-            for i in 0..k {
-                self.indices[i] = i;
-            }
-        } else {
-            for i in 0..self.indices.len() {
-                self.indices[i] = i;
-            }
-            self.indices.extend(self.indices.len()..k);
-            self.pool.prefill(k);
-        }
-    }
-
+    /// Return the length of the inner iterator and the count of remaining combinations.
     pub(crate) fn n_and_count(self) -> (usize, usize) {
         let Self {
             indices,
@@ -92,7 +130,7 @@
             first,
         } = self;
         let n = pool.count();
-        (n, remaining_for(n, first, &indices).unwrap())
+        (n, remaining_for(n, first, indices.borrow()).unwrap())
     }
 
     /// Initialises the iterator by filling a buffer with elements from the
@@ -113,19 +151,21 @@
     ///
     /// Returns true if we've run out of combinations, false otherwise.
     fn increment_indices(&mut self) -> bool {
-        if self.indices.is_empty() {
+        // Borrow once instead of noise each time it's indexed
+        let indices = self.indices.borrow_mut();
+
+        if indices.is_empty() {
             return true; // Done
         }
-
         // Scan from the end, looking for an index to increment
-        let mut i: usize = self.indices.len() - 1;
+        let mut i: usize = indices.len() - 1;
 
         // Check if we need to consume more from the iterator
-        if self.indices[i] == self.pool.len() - 1 {
+        if indices[i] == self.pool.len() - 1 {
             self.pool.get_next(); // may change pool size
         }
 
-        while self.indices[i] == i + self.pool.len() - self.indices.len() {
+        while indices[i] == i + self.pool.len() - indices.len() {
             if i > 0 {
                 i -= 1;
             } else {
@@ -135,11 +175,10 @@
         }
 
         // Increment index, and reset the ones to its right
-        self.indices[i] += 1;
-        for j in i + 1..self.indices.len() {
-            self.indices[j] = self.indices[j - 1] + 1;
+        indices[i] += 1;
+        for j in i + 1..indices.len() {
+            indices[j] = indices[j - 1] + 1;
         }
-
         // If we've made it this far, we haven't run out of combos
         false
     }
@@ -147,6 +186,7 @@
     /// Returns the n-th item or the number of successful steps.
     pub(crate) fn try_nth(&mut self, n: usize) -> Result<<Self as Iterator>::Item, usize>
     where
+        I: Iterator,
         I::Item: Clone,
     {
         let done = if self.first {
@@ -162,16 +202,17 @@
                 return Err(i + 1);
             }
         }
-        Ok(self.pool.get_at(&self.indices))
+        Ok(self.indices.extract_item(&self.pool))
     }
 }
 
-impl<I> Iterator for Combinations<I>
+impl<I, Idx> Iterator for CombinationsGeneric<I, Idx>
 where
     I: Iterator,
     I::Item: Clone,
+    Idx: PoolIndex<I::Item>,
 {
-    type Item = Vec<I::Item>;
+    type Item = Idx::Item;
     fn next(&mut self) -> Option<Self::Item> {
         let done = if self.first {
             self.init()
@@ -183,7 +224,7 @@
             return None;
         }
 
-        Some(self.pool.get_at(&self.indices))
+        Some(self.indices.extract_item(&self.pool))
     }
 
     fn nth(&mut self, n: usize) -> Option<Self::Item> {
@@ -192,8 +233,8 @@
 
     fn size_hint(&self) -> (usize, Option<usize>) {
         let (mut low, mut upp) = self.pool.size_hint();
-        low = remaining_for(low, self.first, &self.indices).unwrap_or(usize::MAX);
-        upp = upp.and_then(|upp| remaining_for(upp, self.first, &self.indices));
+        low = remaining_for(low, self.first, self.indices.borrow()).unwrap_or(usize::MAX);
+        upp = upp.and_then(|upp| remaining_for(upp, self.first, self.indices.borrow()));
         (low, upp)
     }
 
@@ -203,13 +244,37 @@
     }
 }
 
-impl<I> FusedIterator for Combinations<I>
+impl<I, Idx> FusedIterator for CombinationsGeneric<I, Idx>
 where
     I: Iterator,
     I::Item: Clone,
+    Idx: PoolIndex<I::Item>,
 {
 }
 
+impl<I: Iterator> Combinations<I> {
+    /// Resets this `Combinations` back to an initial state for combinations of length
+    /// `k` over the same pool data source. If `k` is larger than the current length
+    /// of the data pool an attempt is made to prefill the pool so that it holds `k`
+    /// elements.
+    pub(crate) fn reset(&mut self, k: usize) {
+        self.first = true;
+
+        if k < self.indices.len() {
+            self.indices.truncate(k);
+            for i in 0..k {
+                self.indices[i] = i;
+            }
+        } else {
+            for i in 0..self.indices.len() {
+                self.indices[i] = i;
+            }
+            self.indices.extend(self.indices.len()..k);
+            self.pool.prefill(k);
+        }
+    }
+}
+
 /// For a given size `n`, return the count of remaining combinations or None if it would overflow.
 fn remaining_for(n: usize, first: bool, indices: &[usize]) -> Option<usize> {
     let k = indices.len();
diff --git a/crates/itertools/src/combinations_with_replacement.rs b/crates/itertools/src/combinations_with_replacement.rs
index f363f9b..c17e752 100644
--- a/crates/itertools/src/combinations_with_replacement.rs
+++ b/crates/itertools/src/combinations_with_replacement.rs
@@ -73,11 +73,7 @@
             Some((increment_from, increment_value)) => {
                 // We need to update the rightmost non-max value
                 // and all those to the right
-                for i in &mut self.indices[increment_from..] {
-                    *i = increment_value;
-                }
-                // TODO: once MSRV >= 1.50, use `fill` instead:
-                // self.indices[increment_from..].fill(increment_value);
+                self.indices[increment_from..].fill(increment_value);
                 false
             }
             // Otherwise, we're done
diff --git a/crates/itertools/src/concat_impl.rs b/crates/itertools/src/concat_impl.rs
index ec7b91c..dc80839 100644
--- a/crates/itertools/src/concat_impl.rs
+++ b/crates/itertools/src/concat_impl.rs
@@ -1,8 +1,6 @@
-use crate::Itertools;
-
 /// Combine all an iterator's elements into one element by using [`Extend`].
 ///
-/// [`IntoIterator`]-enabled version of [`Itertools::concat`].
+/// [`IntoIterator`]-enabled version of [`Itertools::concat`](crate::Itertools::concat).
 ///
 /// This combinator will extend the first item with each of the rest of the
 /// items of the iterator. If the iterator is empty, the default value of
@@ -19,10 +17,9 @@
     I: IntoIterator,
     I::Item: Extend<<<I as IntoIterator>::Item as IntoIterator>::Item> + IntoIterator + Default,
 {
-    #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce`
     iterable
         .into_iter()
-        .fold1(|mut a, b| {
+        .reduce(|mut a, b| {
             a.extend(b);
             a
         })
diff --git a/crates/itertools/src/cons_tuples_impl.rs b/crates/itertools/src/cons_tuples_impl.rs
index 9ab3094..7e86260 100644
--- a/crates/itertools/src/cons_tuples_impl.rs
+++ b/crates/itertools/src/cons_tuples_impl.rs
@@ -1,24 +1,15 @@
+use crate::adaptors::map::{MapSpecialCase, MapSpecialCaseFn};
+
 macro_rules! impl_cons_iter(
     ($_A:ident, $_B:ident, ) => (); // stop
 
     ($A:ident, $($B:ident,)*) => (
         impl_cons_iter!($($B,)*);
         #[allow(non_snake_case)]
-        impl<X, Iter, $($B),*> Iterator for ConsTuples<Iter, (($($B,)*), X)>
-            where Iter: Iterator<Item = (($($B,)*), X)>,
-        {
-            type Item = ($($B,)* X, );
-            fn next(&mut self) -> Option<Self::Item> {
-                self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, ))
-            }
-
-            fn size_hint(&self) -> (usize, Option<usize>) {
-                self.iter.size_hint()
-            }
-            fn fold<Acc, Fold>(self, accum: Acc, mut f: Fold) -> Acc
-                where Fold: FnMut(Acc, Self::Item) -> Acc,
-            {
-                self.iter.fold(accum, move |acc, (($($B,)*), x)| f(acc, ($($B,)* x, )))
+        impl<$($B),*, X> MapSpecialCaseFn<(($($B,)*), X)> for ConsTuplesFn {
+            type Out = ($($B,)* X, );
+            fn call(&mut self, (($($B,)*), X): (($($B,)*), X)) -> Self::Out {
+                ($($B,)* X, )
             }
         }
     );
@@ -26,33 +17,23 @@
 
 impl_cons_iter!(A, B, C, D, E, F, G, H, I, J, K, L,);
 
+#[derive(Debug, Clone)]
+pub struct ConsTuplesFn;
+
 /// An iterator that maps an iterator of tuples like
 /// `((A, B), C)` to an iterator of `(A, B, C)`.
 ///
 /// Used by the `iproduct!()` macro.
-#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-#[derive(Debug)]
-pub struct ConsTuples<I, J>
-where
-    I: Iterator<Item = J>,
-{
-    iter: I,
-}
-
-impl<I, J> Clone for ConsTuples<I, J>
-where
-    I: Clone + Iterator<Item = J>,
-{
-    clone_fields!(iter);
-}
+pub type ConsTuples<I> = MapSpecialCase<I, ConsTuplesFn>;
 
 /// Create an iterator that maps for example iterators of
 /// `((A, B), C)` to `(A, B, C)`.
-pub fn cons_tuples<I, J>(iterable: I) -> ConsTuples<I::IntoIter, J>
+pub fn cons_tuples<I>(iterable: I) -> ConsTuples<I::IntoIter>
 where
-    I: IntoIterator<Item = J>,
+    I: IntoIterator,
 {
     ConsTuples {
         iter: iterable.into_iter(),
+        f: ConsTuplesFn,
     }
 }
diff --git a/crates/itertools/src/diff.rs b/crates/itertools/src/diff.rs
index c6d9965..df88d80 100644
--- a/crates/itertools/src/diff.rs
+++ b/crates/itertools/src/diff.rs
@@ -1,7 +1,7 @@
 //! "Diff"ing iterators for caching elements to sequential collections without requiring the new
 //! elements' iterator to be `Clone`.
 //!
-//! - [`Diff`] (produced by the [`diff_with`] function)
+//! [`Diff`] (produced by the [`diff_with`] function)
 //! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from
 //! a lock-step comparison.
 
diff --git a/crates/itertools/src/extrema_set.rs b/crates/itertools/src/extrema_set.rs
index d24114c..7d35382 100644
--- a/crates/itertools/src/extrema_set.rs
+++ b/crates/itertools/src/extrema_set.rs
@@ -1,4 +1,3 @@
-#![cfg(feature = "use_alloc")]
 use alloc::{vec, vec::Vec};
 use std::cmp::Ordering;
 
diff --git a/crates/itertools/src/format.rs b/crates/itertools/src/format.rs
index 15cee34..3abdda3 100644
--- a/crates/itertools/src/format.rs
+++ b/crates/itertools/src/format.rs
@@ -47,7 +47,7 @@
     }
 }
 
-impl<'a, I, F> fmt::Display for FormatWith<'a, I, F>
+impl<I, F> fmt::Display for FormatWith<'_, I, F>
 where
     I: Iterator,
     F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result,
@@ -71,7 +71,7 @@
     }
 }
 
-impl<'a, I, F> fmt::Debug for FormatWith<'a, I, F>
+impl<I, F> fmt::Debug for FormatWith<'_, I, F>
 where
     I: Iterator,
     F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result,
@@ -81,7 +81,7 @@
     }
 }
 
-impl<'a, I> Format<'a, I>
+impl<I> Format<'_, I>
 where
     I: Iterator,
 {
@@ -125,7 +125,7 @@
 
 impl_format! {Display Debug UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer}
 
-impl<'a, I, F> Clone for FormatWith<'a, I, F>
+impl<I, F> Clone for FormatWith<'_, I, F>
 where
     (I, F): Clone,
 {
@@ -135,7 +135,7 @@
             inner: Option<(I, F)>,
         }
         // This ensures we preserve the state of the original `FormatWith` if `Clone` panics
-        impl<'r, 'a, I, F> Drop for PutBackOnDrop<'r, 'a, I, F> {
+        impl<I, F> Drop for PutBackOnDrop<'_, '_, I, F> {
             fn drop(&mut self) {
                 self.into.inner.set(self.inner.take())
             }
@@ -151,7 +151,7 @@
     }
 }
 
-impl<'a, I> Clone for Format<'a, I>
+impl<I> Clone for Format<'_, I>
 where
     I: Clone,
 {
@@ -161,7 +161,7 @@
             inner: Option<I>,
         }
         // This ensures we preserve the state of the original `FormatWith` if `Clone` panics
-        impl<'r, 'a, I> Drop for PutBackOnDrop<'r, 'a, I> {
+        impl<I> Drop for PutBackOnDrop<'_, '_, I> {
             fn drop(&mut self) {
                 self.into.inner.set(self.inner.take())
             }
diff --git a/crates/itertools/src/free.rs b/crates/itertools/src/free.rs
index 8d0bcf3..4c68205 100644
--- a/crates/itertools/src/free.rs
+++ b/crates/itertools/src/free.rs
@@ -36,7 +36,7 @@
 /// ```
 /// use itertools::intersperse;
 ///
-/// itertools::assert_equal(intersperse((0..3), 8), vec![0, 8, 1, 8, 2]);
+/// itertools::assert_equal(intersperse(0..3, 8), vec![0, 8, 1, 8, 2]);
 /// ```
 pub fn intersperse<I>(iterable: I, element: I::Item) -> Intersperse<I::IntoIter>
 where
@@ -55,7 +55,7 @@
 /// use itertools::intersperse_with;
 ///
 /// let mut i = 10;
-/// itertools::assert_equal(intersperse_with((0..3), || { i -= 1; i }), vec![0, 9, 1, 8, 2]);
+/// itertools::assert_equal(intersperse_with(0..3, || { i -= 1; i }), vec![0, 9, 1, 8, 2]);
 /// assert_eq!(i, 8);
 /// ```
 pub fn intersperse_with<I, F>(iterable: I, element: F) -> IntersperseWith<I::IntoIter, F>
@@ -75,6 +75,7 @@
 ///
 /// for (i, elt) in enumerate(&[1, 2, 3]) {
 ///     /* loop body */
+///     # let _ = (i, elt);
 /// }
 /// ```
 pub fn enumerate<I>(iterable: I) -> iter::Enumerate<I::IntoIter>
@@ -93,6 +94,7 @@
 ///
 /// for elt in rev(&[1, 2, 3]) {
 ///     /* loop body */
+///     # let _ = elt;
 /// }
 /// ```
 pub fn rev<I>(iterable: I) -> iter::Rev<I::IntoIter>
diff --git a/crates/itertools/src/grouping_map.rs b/crates/itertools/src/grouping_map.rs
index b4aae9e..86cb55d 100644
--- a/crates/itertools/src/grouping_map.rs
+++ b/crates/itertools/src/grouping_map.rs
@@ -1,5 +1,3 @@
-#![cfg(feature = "use_std")]
-
 use crate::{
     adaptors::map::{MapSpecialCase, MapSpecialCaseFn},
     MinMaxResult,
diff --git a/crates/itertools/src/k_smallest.rs b/crates/itertools/src/k_smallest.rs
index 7b2f62e..7e4ace2 100644
--- a/crates/itertools/src/k_smallest.rs
+++ b/crates/itertools/src/k_smallest.rs
@@ -88,6 +88,46 @@
     storage
 }
 
+pub(crate) fn k_smallest_relaxed_general<I, F>(iter: I, k: usize, mut comparator: F) -> Vec<I::Item>
+where
+    I: Iterator,
+    F: FnMut(&I::Item, &I::Item) -> Ordering,
+{
+    if k == 0 {
+        iter.last();
+        return Vec::new();
+    }
+
+    let mut iter = iter.fuse();
+    let mut buf = iter.by_ref().take(2 * k).collect::<Vec<_>>();
+
+    if buf.len() < k {
+        buf.sort_unstable_by(&mut comparator);
+        return buf;
+    }
+
+    buf.select_nth_unstable_by(k - 1, &mut comparator);
+    buf.truncate(k);
+
+    iter.for_each(|val| {
+        if comparator(&val, &buf[k - 1]) != Ordering::Less {
+            return;
+        }
+
+        assert_ne!(buf.len(), buf.capacity());
+        buf.push(val);
+
+        if buf.len() == 2 * k {
+            buf.select_nth_unstable_by(k - 1, &mut comparator);
+            buf.truncate(k);
+        }
+    });
+
+    buf.sort_unstable_by(&mut comparator);
+    buf.truncate(k);
+    buf
+}
+
 #[inline]
 pub(crate) fn key_to_cmp<T, K, F>(mut key: F) -> impl FnMut(&T, &T) -> Ordering
 where
diff --git a/crates/itertools/src/kmerge_impl.rs b/crates/itertools/src/kmerge_impl.rs
index 0be3840..9ea73f9 100644
--- a/crates/itertools/src/kmerge_impl.rs
+++ b/crates/itertools/src/kmerge_impl.rs
@@ -1,5 +1,4 @@
 use crate::size_hint;
-use crate::Itertools;
 
 use alloc::vec::Vec;
 use std::fmt;
@@ -128,13 +127,14 @@
 /// Create an iterator that merges elements of the contained iterators using
 /// the ordering function.
 ///
-/// [`IntoIterator`] enabled version of [`Itertools::kmerge`].
+/// [`IntoIterator`] enabled version of [`Itertools::kmerge`](crate::Itertools::kmerge).
 ///
 /// ```
 /// use itertools::kmerge;
 ///
 /// for elt in kmerge(vec![vec![0, 2, 4], vec![1, 3, 5], vec![6, 7]]) {
 ///     /* loop body */
+///     # let _ = elt;
 /// }
 /// ```
 pub fn kmerge<I>(iterable: I) -> KMerge<<I::Item as IntoIterator>::IntoIter>
@@ -172,7 +172,7 @@
 
 /// Create an iterator that merges elements of the contained iterators.
 ///
-/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`].
+/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`](crate::Itertools::kmerge_by).
 pub fn kmerge_by<I, F>(
     iterable: I,
     mut less_than: F,
@@ -223,11 +223,10 @@
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
-        #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce`
         self.heap
             .iter()
             .map(|i| i.size_hint())
-            .fold1(size_hint::add)
+            .reduce(size_hint::add)
             .unwrap_or((0, Some(0)))
     }
 }
diff --git a/crates/itertools/src/lazy_buffer.rs b/crates/itertools/src/lazy_buffer.rs
index fefcff8..fafa5f7 100644
--- a/crates/itertools/src/lazy_buffer.rs
+++ b/crates/itertools/src/lazy_buffer.rs
@@ -59,6 +59,10 @@
     pub fn get_at(&self, indices: &[usize]) -> Vec<I::Item> {
         indices.iter().map(|i| self.buffer[*i].clone()).collect()
     }
+
+    pub fn get_array<const K: usize>(&self, indices: [usize; K]) -> [I::Item; K] {
+        indices.map(|i| self.buffer[i].clone())
+    }
 }
 
 impl<I, J> Index<J> for LazyBuffer<I>
diff --git a/crates/itertools/src/lib.rs b/crates/itertools/src/lib.rs
index f4de79c..20226d8 100644
--- a/crates/itertools/src/lib.rs
+++ b/crates/itertools/src/lib.rs
@@ -1,6 +1,7 @@
 #![warn(missing_docs, clippy::default_numeric_fallback)]
 #![crate_name = "itertools"]
 #![cfg_attr(not(feature = "use_std"), no_std)]
+#![doc(test(attr(deny(warnings), allow(deprecated, unstable_name_collisions))))]
 
 //! Extra iterator adaptors, functions and macros.
 //!
@@ -8,6 +9,7 @@
 //! the [`Itertools`] trait:
 //!
 //! ```
+//! # #[allow(unused_imports)]
 //! use itertools::Itertools;
 //! ```
 //!
@@ -29,6 +31,7 @@
 //!
 //! for elt in interleave(&[1, 2, 3], &[2, 3, 4]) {
 //!     /* loop body */
+//!     # let _ = elt;
 //! }
 //! ```
 //!
@@ -46,7 +49,7 @@
 //!
 //! ## Rust Version
 //!
-//! This version of itertools requires Rust 1.43.1 or later.
+//! This version of itertools requires Rust 1.63.0 or later.
 
 #[cfg(not(feature = "use_std"))]
 extern crate core as std;
@@ -94,7 +97,7 @@
         TakeWhileRef, TupleCombinations, Update, WhileSome,
     };
     #[cfg(feature = "use_alloc")]
-    pub use crate::combinations::Combinations;
+    pub use crate::combinations::{ArrayCombinations, Combinations};
     #[cfg(feature = "use_alloc")]
     pub use crate::combinations_with_replacement::CombinationsWithReplacement;
     pub use crate::cons_tuples_impl::ConsTuples;
@@ -206,6 +209,7 @@
 mod minmax;
 #[cfg(feature = "use_alloc")]
 mod multipeek_impl;
+mod next_array;
 mod pad_tail;
 #[cfg(feature = "use_alloc")]
 mod peek_nth;
@@ -248,6 +252,7 @@
 /// // from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3)
 /// for (i, j, k) in iproduct!(0..4, 0..4, 0..4) {
 ///    // ..
+///    # let _ = (i, j, k);
 /// }
 /// # }
 /// ```
@@ -262,7 +267,10 @@
         $crate::__std_iter::once(())
     );
     ($I:expr $(,)?) => (
-        $crate::__std_iter::IntoIterator::into_iter($I).map(|elt| (elt,))
+        $crate::__std_iter::Iterator::map(
+            $crate::__std_iter::IntoIterator::into_iter($I),
+            |elt| (elt,)
+        )
     );
     ($I:expr, $J:expr $(,)?) => (
         $crate::Itertools::cartesian_product(
@@ -330,19 +338,24 @@
 
     // binary
     ($first:expr, $second:expr $(,)*) => {
-        $crate::izip!($first)
-            .zip($second)
+        $crate::__std_iter::Iterator::zip(
+            $crate::__std_iter::IntoIterator::into_iter($first),
+            $second,
+        )
     };
 
     // n-ary where n > 2
     ( $first:expr $( , $rest:expr )* $(,)* ) => {
-        $crate::izip!($first)
+        {
+            let iter = $crate::__std_iter::IntoIterator::into_iter($first);
             $(
-                .zip($rest)
+                let iter = $crate::__std_iter::Iterator::zip(iter, $rest);
             )*
-            .map(
+            $crate::__std_iter::Iterator::map(
+                iter,
                 $crate::izip!(@closure a => (a) $( , $rest )*)
             )
+        }
     };
 }
 
@@ -367,16 +380,16 @@
 ///
 /// Invocations of `chain!` with one argument expand to [`arg.into_iter()`](IntoIterator):
 /// ```
-/// use std::{ops::Range, slice};
+/// use std::ops::Range;
 /// use itertools::chain;
-/// let _: <Range<_> as IntoIterator>::IntoIter = chain!((2..6),); // trailing comma optional!
+/// let _: <Range<_> as IntoIterator>::IntoIter = chain!(2..6,); // trailing comma optional!
 /// let _:     <&[_] as IntoIterator>::IntoIter = chain!(&[2, 3, 4]);
 /// ```
 ///
 /// Invocations of `chain!` with multiple arguments [`.into_iter()`](IntoIterator) each
 /// argument, and then [`chain`] them together:
 /// ```
-/// use std::{iter::*, ops::Range, slice};
+/// use std::{iter::*, slice};
 /// use itertools::{assert_equal, chain};
 ///
 /// // e.g., this:
@@ -393,16 +406,16 @@
 /// ```
 macro_rules! chain {
     () => {
-        core::iter::empty()
+        $crate::__std_iter::empty()
     };
     ($first:expr $(, $rest:expr )* $(,)?) => {
         {
-            let iter = core::iter::IntoIterator::into_iter($first);
+            let iter = $crate::__std_iter::IntoIterator::into_iter($first);
             $(
                 let iter =
-                    core::iter::Iterator::chain(
+                    $crate::__std_iter::Iterator::chain(
                         iter,
-                        core::iter::IntoIterator::into_iter($rest));
+                        $crate::__std_iter::IntoIterator::into_iter($rest));
             )*
             iter
         }
@@ -415,13 +428,13 @@
 /// This trait defines a number of methods. They are divided into two groups:
 ///
 /// * *Adaptors* take an iterator and parameter as input, and return
-/// a new iterator value. These are listed first in the trait. An example
-/// of an adaptor is [`.interleave()`](Itertools::interleave)
+///   a new iterator value. These are listed first in the trait. An example
+///   of an adaptor is [`.interleave()`](Itertools::interleave)
 ///
 /// * *Regular methods* are those that don't return iterators and instead
-/// return a regular value of some other kind.
-/// [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular
-/// method in the list.
+///   return a regular value of some other kind.
+///   [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular
+///   method in the list.
 pub trait Itertools: Iterator {
     // adaptors
 
@@ -1043,7 +1056,6 @@
     /// let it = a.merge_by(b, |x, y| x.1 <= y.1);
     /// itertools::assert_equal(it, vec![(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd')]);
     /// ```
-
     fn merge_by<J, F>(self, other: J, is_first: F) -> MergeBy<Self, J::IntoIter, F>
     where
         Self: Sized,
@@ -1079,7 +1091,9 @@
     /// let b = (0..10).step_by(3);
     ///
     /// itertools::assert_equal(
-    ///     a.merge_join_by(b, |i, j| i.cmp(j)),
+    ///     // This performs a diff in the style of the Unix command comm(1),
+    ///     // generalized to arbitrary types rather than text.
+    ///     a.merge_join_by(b, Ord::cmp),
     ///     vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(1), Right(9)]
     /// );
     /// ```
@@ -1111,6 +1125,7 @@
     /// );
     /// ```
     #[inline]
+    #[doc(alias = "comm")]
     fn merge_join_by<J, F, T>(self, other: J, cmp_fn: F) -> MergeJoinBy<Self, J::IntoIter, F>
     where
         J: IntoIterator,
@@ -1582,6 +1597,7 @@
     ///     .collect();
     /// let expected: Vec<_> = vec![1, 2, 3].into_iter().map(NoCloneImpl).collect();
     /// assert_eq!(filtered, expected);
+    #[doc(alias = "take_until")]
     fn take_while_inclusive<F>(self, accept: F) -> TakeWhileInclusive<Self, F>
     where
         Self: Sized,
@@ -1658,6 +1674,53 @@
         adaptors::tuple_combinations(self)
     }
 
+    /// Return an iterator adaptor that iterates over the combinations of the
+    /// elements from an iterator.
+    ///
+    /// Iterator element type is [Self::Item; K]. The iterator produces a new
+    /// array per iteration, and clones the iterator elements.
+    ///
+    /// # Guarantees
+    ///
+    /// If the adapted iterator is deterministic,
+    /// this iterator adapter yields items in a reliable order.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut v = Vec::new();
+    /// for [a, b] in (1..5).array_combinations() {
+    ///     v.push([a, b]);
+    /// }
+    /// assert_eq!(v, vec![[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]);
+    ///
+    /// let mut it = (1..5).array_combinations();
+    /// assert_eq!(Some([1, 2, 3]), it.next());
+    /// assert_eq!(Some([1, 2, 4]), it.next());
+    /// assert_eq!(Some([1, 3, 4]), it.next());
+    /// assert_eq!(Some([2, 3, 4]), it.next());
+    /// assert_eq!(None, it.next());
+    ///
+    /// // this requires a type hint
+    /// let it = (1..5).array_combinations::<3>();
+    /// itertools::assert_equal(it, vec![[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]);
+    ///
+    /// // you can also specify the complete type
+    /// use itertools::ArrayCombinations;
+    /// use std::ops::Range;
+    ///
+    /// let it: ArrayCombinations<Range<u32>, 3> = (1..5).array_combinations();
+    /// itertools::assert_equal(it, vec![[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn array_combinations<const K: usize>(self) -> ArrayCombinations<Self, K>
+    where
+        Self: Sized + Clone,
+        Self::Item: Clone,
+    {
+        combinations::array_combinations(self)
+    }
+
     /// Return an iterator adaptor that iterates over the `k`-length combinations of
     /// the elements from an iterator.
     ///
@@ -1894,7 +1957,7 @@
     /// use itertools::Itertools;
     ///
     /// let input = vec![vec![1], vec![3, 2, 1]];
-    /// let it = input.into_iter().update(|mut v| v.push(0));
+    /// let it = input.into_iter().update(|v| v.push(0));
     /// itertools::assert_equal(it, vec![vec![1, 0], vec![3, 2, 1, 0]]);
     /// ```
     fn update<F>(self, updater: F) -> Update<Self, F>
@@ -1906,6 +1969,50 @@
     }
 
     // non-adaptor methods
+    /// Advances the iterator and returns the next items grouped in an array of
+    /// a specific size.
+    ///
+    /// If there are enough elements to be grouped in an array, then the array
+    /// is returned inside `Some`, otherwise `None` is returned.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let mut iter = 1..5;
+    ///
+    /// assert_eq!(Some([1, 2]), iter.next_array());
+    /// ```
+    fn next_array<const N: usize>(&mut self) -> Option<[Self::Item; N]>
+    where
+        Self: Sized,
+    {
+        next_array::next_array(self)
+    }
+
+    /// Collects all items from the iterator into an array of a specific size.
+    ///
+    /// If the number of elements inside the iterator is **exactly** equal to
+    /// the array size, then the array is returned inside `Some`, otherwise
+    /// `None` is returned.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// let iter = 1..3;
+    ///
+    /// if let Some([x, y]) = iter.collect_array() {
+    ///     assert_eq!([x, y], [1, 2])
+    /// } else {
+    ///     panic!("Expected two elements")
+    /// }
+    /// ```
+    fn collect_array<const N: usize>(mut self) -> Option<[Self::Item; N]>
+    where
+        Self: Sized,
+    {
+        self.next_array().filter(|_| self.next().is_none())
+    }
+
     /// Advances the iterator and returns the next items grouped in a tuple of
     /// a specific size (up to 12).
     ///
@@ -1986,6 +2093,15 @@
     /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 5), Some(&4));
     /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 2), Some(&3));
     /// assert_eq!(std::iter::empty::<i32>().find_or_last(|&x| x > 5), None);
+    ///
+    /// // An iterator of Results can return the first Ok or the last Err:
+    /// let input = vec![Err(()), Ok(11), Err(()), Ok(22)];
+    /// assert_eq!(input.into_iter().find_or_last(Result::is_ok), Some(Ok(11)));
+    ///
+    /// let input: Vec<Result<(), i32>> = vec![Err(11), Err(22)];
+    /// assert_eq!(input.into_iter().find_or_last(Result::is_ok), Some(Err(22)));
+    ///
+    /// assert_eq!(std::iter::empty::<Result<(), i32>>().find_or_last(Result::is_ok), None);
     /// ```
     fn find_or_last<P>(mut self, mut predicate: P) -> Option<Self::Item>
     where
@@ -2014,6 +2130,15 @@
     /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 5), Some(&1));
     /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 2), Some(&3));
     /// assert_eq!(std::iter::empty::<i32>().find_or_first(|&x| x > 5), None);
+    ///
+    /// // An iterator of Results can return the first Ok or the first Err:
+    /// let input = vec![Err(()), Ok(11), Err(()), Ok(22)];
+    /// assert_eq!(input.into_iter().find_or_first(Result::is_ok), Some(Ok(11)));
+    ///
+    /// let input: Vec<Result<(), i32>> = vec![Err(11), Err(22)];
+    /// assert_eq!(input.into_iter().find_or_first(Result::is_ok), Some(Err(11)));
+    ///
+    /// assert_eq!(std::iter::empty::<Result<(), i32>>().find_or_first(Result::is_ok), None);
     /// ```
     fn find_or_first<P>(mut self, mut predicate: P) -> Option<Self::Item>
     where
@@ -2056,7 +2181,7 @@
     where
         Self: Sized,
         Self::Item: Borrow<Q>,
-        Q: PartialEq,
+        Q: PartialEq + ?Sized,
     {
         self.any(|x| x.borrow() == query)
     }
@@ -2154,7 +2279,7 @@
     /// ```
     /// use itertools::Itertools;
     ///
-    /// let mut iter = "αβγ".chars().dropping(2);
+    /// let iter = "αβγ".chars().dropping(2);
     /// itertools::assert_equal(iter, "γ".chars());
     /// ```
     ///
@@ -2238,14 +2363,17 @@
     ///
     /// fn process_dir_entries(entries: &[fs::DirEntry]) {
     ///     // ...
+    ///     # let _ = entries;
     /// }
     ///
-    /// fn do_stuff() -> std::io::Result<()> {
+    /// fn do_stuff() -> io::Result<()> {
     ///     let entries: Vec<_> = fs::read_dir(".")?.try_collect()?;
     ///     process_dir_entries(&entries);
     ///
     ///     Ok(())
     /// }
+    ///
+    /// # let _ = do_stuff;
     /// ```
     fn try_collect<T, U, E>(self) -> Result<U, E>
     where
@@ -2396,6 +2524,7 @@
     /// accum = f(accum, 1);
     /// accum = f(accum, 2);
     /// accum = f(accum, 3);
+    /// # let _ = accum;
     /// ```
     ///
     /// With a `start` value of 0 and an addition as folding function,
@@ -2520,34 +2649,64 @@
     ///
     /// If `f` is associative you should also decide carefully:
     ///
-    /// - if `f` is a trivial operation like `u32::wrapping_add`, prefer the normal
-    /// [`Iterator::reduce`] instead since it will most likely result in the generation of simpler
-    /// code because the compiler is able to optimize it
-    /// - otherwise if `f` is non-trivial like `format!`, you should use `tree_reduce` since it
-    /// reduces the number of operations from `O(n)` to `O(ln(n))`
+    /// For an iterator producing `n` elements, both [`Iterator::reduce`] and `tree_reduce` will
+    /// call `f` `n - 1` times. However, `tree_reduce` will call `f` on earlier intermediate
+    /// results, which is beneficial for `f` that allocate and produce longer results for longer
+    /// arguments. For example if `f` combines arguments using `format!`, then `tree_reduce` will
+    /// operate on average on shorter arguments resulting in less bytes being allocated overall.
     ///
-    /// Here "non-trivial" means:
+    /// Moreover, the output of `tree_reduce` is preferable to that of [`Iterator::reduce`] in
+    /// certain cases. For example, building a binary search tree using `tree_reduce` will result in
+    /// a balanced tree with height `O(ln(n))`, while [`Iterator::reduce`] will output a tree with
+    /// height `O(n)`, essentially a linked list.
     ///
-    /// - any allocating operation
-    /// - any function that is a composition of many operations
+    /// If `f` does not benefit from such a reordering, like `u32::wrapping_add`, prefer the
+    /// normal [`Iterator::reduce`] instead since it will most likely result in the generation of
+    /// simpler code because the compiler is able to optimize it.
     ///
     /// ```
     /// use itertools::Itertools;
     ///
-    /// // The same tree as above
-    /// let num_strings = (1..8).map(|x| x.to_string());
-    /// assert_eq!(num_strings.tree_reduce(|x, y| format!("f({}, {})", x, y)),
-    ///     Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))")));
+    /// let f = |a: String, b: String| {
+    ///     format!("f({a}, {b})")
+    /// };
     ///
-    /// // Like fold1, an empty iterator produces None
+    /// // The same tree as above
+    /// assert_eq!((1..8).map(|x| x.to_string()).tree_reduce(f),
+    ///            Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))")));
+    ///
+    /// // Like reduce, an empty iterator produces None
     /// assert_eq!((0..0).tree_reduce(|x, y| x * y), None);
     ///
-    /// // tree_reduce matches fold1 for associative operations...
+    /// // tree_reduce matches reduce for associative operations...
     /// assert_eq!((0..10).tree_reduce(|x, y| x + y),
-    ///     (0..10).fold1(|x, y| x + y));
+    ///     (0..10).reduce(|x, y| x + y));
+    ///
     /// // ...but not for non-associative ones
     /// assert_ne!((0..10).tree_reduce(|x, y| x - y),
-    ///     (0..10).fold1(|x, y| x - y));
+    ///     (0..10).reduce(|x, y| x - y));
+    ///
+    /// let mut total_len_reduce = 0;
+    /// let reduce_res = (1..100).map(|x| x.to_string())
+    ///     .reduce(|a, b| {
+    ///         let r = f(a, b);
+    ///         total_len_reduce += r.len();
+    ///         r
+    ///     })
+    ///     .unwrap();
+    ///
+    /// let mut total_len_tree_reduce = 0;
+    /// let tree_reduce_res = (1..100).map(|x| x.to_string())
+    ///     .tree_reduce(|a, b| {
+    ///         let r = f(a, b);
+    ///         total_len_tree_reduce += r.len();
+    ///         r
+    ///     })
+    ///     .unwrap();
+    ///
+    /// assert_eq!(total_len_reduce, 33299);
+    /// assert_eq!(total_len_tree_reduce, 4228);
+    /// assert_eq!(reduce_res.len(), tree_reduce_res.len());
     /// ```
     fn tree_reduce<F>(mut self, mut f: F) -> Option<Self::Item>
     where
@@ -3115,6 +3274,105 @@
         self.k_smallest_by(k, k_smallest::key_to_cmp(key))
     }
 
+    /// Sort the k smallest elements into a new iterator, in ascending order, relaxing the amount of memory required.
+    ///
+    /// **Note:** This consumes the entire iterator, and returns the result
+    /// as a new iterator that owns its elements.  If the input contains
+    /// less than k elements, the result is equivalent to `self.sorted()`.
+    ///
+    /// This is guaranteed to use `2 * k * sizeof(Self::Item) + O(1)` memory
+    /// and `O(n + k log k)` time, with `n` the number of elements in the input,
+    /// meaning it uses more memory than the minimum obtained by [`k_smallest`](Itertools::k_smallest)
+    /// but achieves linear time in the number of elements.
+    ///
+    /// The sorted iterator, if directly collected to a `Vec`, is converted
+    /// without any extra copying or allocation cost.
+    ///
+    /// **Note:** This is functionally-equivalent to `self.sorted().take(k)`
+    /// but much more efficient.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // A random permutation of 0..15
+    /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5];
+    ///
+    /// let five_smallest = numbers
+    ///     .into_iter()
+    ///     .k_smallest_relaxed(5);
+    ///
+    /// itertools::assert_equal(five_smallest, 0..5);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn k_smallest_relaxed(self, k: usize) -> VecIntoIter<Self::Item>
+    where
+        Self: Sized,
+        Self::Item: Ord,
+    {
+        self.k_smallest_relaxed_by(k, Ord::cmp)
+    }
+
+    /// Sort the k smallest elements into a new iterator using the provided comparison, relaxing the amount of memory required.
+    ///
+    /// The sorted iterator, if directly collected to a `Vec`, is converted
+    /// without any extra copying or allocation cost.
+    ///
+    /// This corresponds to `self.sorted_by(cmp).take(k)` in the same way that
+    /// [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) corresponds to `self.sorted().take(k)`,
+    /// in both semantics and complexity.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // A random permutation of 0..15
+    /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5];
+    ///
+    /// let five_smallest = numbers
+    ///     .into_iter()
+    ///     .k_smallest_relaxed_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b)));
+    ///
+    /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn k_smallest_relaxed_by<F>(self, k: usize, cmp: F) -> VecIntoIter<Self::Item>
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item, &Self::Item) -> Ordering,
+    {
+        k_smallest::k_smallest_relaxed_general(self, k, cmp).into_iter()
+    }
+
+    /// Return the elements producing the k smallest outputs of the provided function, relaxing the amount of memory required.
+    ///
+    /// The sorted iterator, if directly collected to a `Vec`, is converted
+    /// without any extra copying or allocation cost.
+    ///
+    /// This corresponds to `self.sorted_by_key(key).take(k)` in the same way that
+    /// [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) corresponds to `self.sorted().take(k)`,
+    /// in both semantics and complexity.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // A random permutation of 0..15
+    /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5];
+    ///
+    /// let five_smallest = numbers
+    ///     .into_iter()
+    ///     .k_smallest_relaxed_by_key(5, |n| (n % 7, *n));
+    ///
+    /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn k_smallest_relaxed_by_key<F, K>(self, k: usize, key: F) -> VecIntoIter<Self::Item>
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item) -> K,
+        K: Ord,
+    {
+        self.k_smallest_relaxed_by(k, k_smallest::key_to_cmp(key))
+    }
+
     /// Sort the k largest elements into a new iterator, in descending order.
     ///
     /// The sorted iterator, if directly collected to a `Vec`, is converted
@@ -3205,6 +3463,94 @@
         self.k_largest_by(k, k_smallest::key_to_cmp(key))
     }
 
+    /// Sort the k largest elements into a new iterator, in descending order, relaxing the amount of memory required.
+    ///
+    /// The sorted iterator, if directly collected to a `Vec`, is converted
+    /// without any extra copying or allocation cost.
+    ///
+    /// It is semantically equivalent to [`k_smallest_relaxed`](Itertools::k_smallest_relaxed)
+    /// with a reversed `Ord`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // A random permutation of 0..15
+    /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5];
+    ///
+    /// let five_largest = numbers
+    ///     .into_iter()
+    ///     .k_largest_relaxed(5);
+    ///
+    /// itertools::assert_equal(five_largest, vec![14, 13, 12, 11, 10]);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn k_largest_relaxed(self, k: usize) -> VecIntoIter<Self::Item>
+    where
+        Self: Sized,
+        Self::Item: Ord,
+    {
+        self.k_largest_relaxed_by(k, Self::Item::cmp)
+    }
+
+    /// Sort the k largest elements into a new iterator using the provided comparison, relaxing the amount of memory required.
+    ///
+    /// The sorted iterator, if directly collected to a `Vec`, is converted
+    /// without any extra copying or allocation cost.
+    ///
+    /// Functionally equivalent to [`k_smallest_relaxed_by`](Itertools::k_smallest_relaxed_by)
+    /// with a reversed `Ord`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // A random permutation of 0..15
+    /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5];
+    ///
+    /// let five_largest = numbers
+    ///     .into_iter()
+    ///     .k_largest_relaxed_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b)));
+    ///
+    /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn k_largest_relaxed_by<F>(self, k: usize, mut cmp: F) -> VecIntoIter<Self::Item>
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item, &Self::Item) -> Ordering,
+    {
+        self.k_smallest_relaxed_by(k, move |a, b| cmp(b, a))
+    }
+
+    /// Return the elements producing the k largest outputs of the provided function, relaxing the amount of memory required.
+    ///
+    /// The sorted iterator, if directly collected to a `Vec`, is converted
+    /// without any extra copying or allocation cost.
+    ///
+    /// Functionally equivalent to [`k_smallest_relaxed_by_key`](Itertools::k_smallest_relaxed_by_key)
+    /// with a reversed `Ord`.
+    ///
+    /// ```
+    /// use itertools::Itertools;
+    ///
+    /// // A random permutation of 0..15
+    /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5];
+    ///
+    /// let five_largest = numbers
+    ///     .into_iter()
+    ///     .k_largest_relaxed_by_key(5, |n| (n % 7, *n));
+    ///
+    /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]);
+    /// ```
+    #[cfg(feature = "use_alloc")]
+    fn k_largest_relaxed_by_key<F, K>(self, k: usize, key: F) -> VecIntoIter<Self::Item>
+    where
+        Self: Sized,
+        F: FnMut(&Self::Item) -> K,
+        K: Ord,
+    {
+        self.k_largest_relaxed_by(k, k_smallest::key_to_cmp(key))
+    }
+
     /// Consumes the iterator and return an iterator of the last `n` elements.
     ///
     /// The iterator, if directly collected to a `VecDeque`, is converted
@@ -3357,8 +3703,8 @@
         group_map::into_group_map(self)
     }
 
-    /// Return an `Iterator` on a `HashMap`. Keys mapped to `Vec`s of values. The key is specified
-    /// in the closure.
+    /// Return a `HashMap` of keys mapped to `Vec`s of values. The key is specified
+    /// in the closure. The values are taken from the input iterator.
     ///
     /// Essentially a shorthand for `.into_grouping_map_by(f).collect::<Vec<_>>()`.
     ///
@@ -3370,7 +3716,7 @@
     /// let lookup: HashMap<u32,Vec<(u32, u32)>> =
     ///     data.clone().into_iter().into_group_map_by(|a| a.0);
     ///
-    /// assert_eq!(lookup[&0], vec![(0,10),(0,20)]);
+    /// assert_eq!(lookup[&0], vec![(0,10), (0,20)]);
     /// assert_eq!(lookup.get(&1), None);
     /// assert_eq!(lookup[&2], vec![(2,12), (2,42)]);
     /// assert_eq!(lookup[&3], vec![(3,13), (3,33)]);
@@ -4125,7 +4471,7 @@
     /// # Examples
     /// ```
     /// # use itertools::Itertools;
-    /// let counts = [1, 1, 1, 3, 3, 5].into_iter().counts();
+    /// let counts = [1, 1, 1, 3, 3, 5].iter().counts();
     /// assert_eq!(counts[&1], 3);
     /// assert_eq!(counts[&3], 2);
     /// assert_eq!(counts[&5], 1);
@@ -4151,6 +4497,7 @@
     /// # use itertools::Itertools;
     /// struct Character {
     ///   first_name: &'static str,
+    ///   # #[allow(dead_code)]
     ///   last_name:  &'static str,
     /// }
     ///
@@ -4268,6 +4615,7 @@
 /// assert_equal("exceed".split('c'), "excess".split('c'));
 /// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1'.
 /// ```
+#[track_caller]
 pub fn assert_equal<I, J>(a: I, b: J)
 where
     I: IntoIterator,
diff --git a/crates/itertools/src/merge_join.rs b/crates/itertools/src/merge_join.rs
index c0de35f..5f4a605 100644
--- a/crates/itertools/src/merge_join.rs
+++ b/crates/itertools/src/merge_join.rs
@@ -31,6 +31,7 @@
 ///
 /// for elt in merge(&[1, 2, 3], &[2, 3, 4]) {
 ///     /* loop body */
+///     # let _ = elt;
 /// }
 /// ```
 pub fn merge<I, J>(
diff --git a/crates/itertools/src/next_array.rs b/crates/itertools/src/next_array.rs
new file mode 100644
index 0000000..86480b1
--- /dev/null
+++ b/crates/itertools/src/next_array.rs
@@ -0,0 +1,269 @@
+use core::mem::{self, MaybeUninit};
+
+/// An array of at most `N` elements.
+struct ArrayBuilder<T, const N: usize> {
+    /// The (possibly uninitialized) elements of the `ArrayBuilder`.
+    ///
+    /// # Safety
+    ///
+    /// The elements of `arr[..len]` are valid `T`s.
+    arr: [MaybeUninit<T>; N],
+
+    /// The number of leading elements of `arr` that are valid `T`s, len <= N.
+    len: usize,
+}
+
+impl<T, const N: usize> ArrayBuilder<T, N> {
+    /// Initializes a new, empty `ArrayBuilder`.
+    pub fn new() -> Self {
+        // SAFETY: The safety invariant of `arr` trivially holds for `len = 0`.
+        Self {
+            arr: [(); N].map(|_| MaybeUninit::uninit()),
+            len: 0,
+        }
+    }
+
+    /// Pushes `value` onto the end of the array.
+    ///
+    /// # Panics
+    ///
+    /// This panics if `self.len >= N`.
+    #[inline(always)]
+    pub fn push(&mut self, value: T) {
+        // PANICS: This will panic if `self.len >= N`.
+        let place = &mut self.arr[self.len];
+        // SAFETY: The safety invariant of `self.arr` applies to elements at
+        // indices `0..self.len` — not to the element at `self.len`. Writing to
+        // the element at index `self.len` therefore does not violate the safety
+        // invariant of `self.arr`. Even if this line panics, we have not
+        // created any intermediate invalid state.
+        *place = MaybeUninit::new(value);
+        // Lemma: `self.len < N`. By invariant, `self.len <= N`. Above, we index
+        // into `self.arr`, which has size `N`, at index `self.len`. If `self.len == N`
+        // at that point, that index would be out-of-bounds, and the index
+        // operation would panic. Thus, `self.len != N`, and since `self.len <= N`,
+        // that means that `self.len < N`.
+        //
+        // PANICS: Since `self.len < N`, and since `N <= usize::MAX`,
+        // `self.len + 1 <= usize::MAX`, and so `self.len += 1` will not
+        // overflow. Overflow is the only panic condition of `+=`.
+        //
+        // SAFETY:
+        // - We are required to uphold the invariant that `self.len <= N`.
+        //   Since, by the preceding lemma, `self.len < N` at this point in the
+        //   code, `self.len += 1` results in `self.len <= N`.
+        // - We are required to uphold the invariant that `self.arr[..self.len]`
+        //   are valid instances of `T`. Since this invariant already held when
+        //   this method was called, and since we only increment `self.len`
+        //   by 1 here, we only need to prove that the element at
+        //   `self.arr[self.len]` (using the value of `self.len` before incrementing)
+        //   is valid. Above, we construct `place` to point to `self.arr[self.len]`,
+        //   and then initialize `*place` to `MaybeUninit::new(value)`, which is
+        //   a valid `T` by construction.
+        self.len += 1;
+    }
+
+    /// Consumes the elements in the `ArrayBuilder` and returns them as an array
+    /// `[T; N]`.
+    ///
+    /// If `self.len() < N`, this returns `None`.
+    pub fn take(&mut self) -> Option<[T; N]> {
+        if self.len == N {
+            // SAFETY: Decreasing the value of `self.len` cannot violate the
+            // safety invariant on `self.arr`.
+            self.len = 0;
+
+            // SAFETY: Since `self.len` is 0, `self.arr` may safely contain
+            // uninitialized elements.
+            let arr = mem::replace(&mut self.arr, [(); N].map(|_| MaybeUninit::uninit()));
+
+            Some(arr.map(|v| {
+                // SAFETY: We know that all elements of `arr` are valid because
+                // we checked that `len == N`.
+                unsafe { v.assume_init() }
+            }))
+        } else {
+            None
+        }
+    }
+}
+
+impl<T, const N: usize> AsMut<[T]> for ArrayBuilder<T, N> {
+    fn as_mut(&mut self) -> &mut [T] {
+        let valid = &mut self.arr[..self.len];
+        // SAFETY: By invariant on `self.arr`, the elements of `self.arr` at
+        // indices `0..self.len` are in a valid state. Since `valid` references
+        // only these elements, the safety precondition of
+        // `slice_assume_init_mut` is satisfied.
+        unsafe { slice_assume_init_mut(valid) }
+    }
+}
+
+impl<T, const N: usize> Drop for ArrayBuilder<T, N> {
+    // We provide a non-trivial `Drop` impl, because the trivial impl would be a
+    // no-op; `MaybeUninit<T>` has no innate awareness of its own validity, and
+    // so it can only forget its contents. By leveraging the safety invariant of
+    // `self.arr`, we do know which elements of `self.arr` are valid, and can
+    // selectively run their destructors.
+    fn drop(&mut self) {
+        // SAFETY:
+        // - by invariant on `&mut [T]`, `self.as_mut()` is:
+        //   - valid for reads and writes
+        //   - properly aligned
+        //   - non-null
+        // - the dropped `T` are valid for dropping; they do not have any
+        //   additional library invariants that we've violated
+        // - no other pointers to `valid` exist (since we're in the context of
+        //   `drop`)
+        unsafe { core::ptr::drop_in_place(self.as_mut()) }
+    }
+}
+
+/// Assuming all the elements are initialized, get a mutable slice to them.
+///
+/// # Safety
+///
+/// The caller guarantees that the elements `T` referenced by `slice` are in a
+/// valid state.
+unsafe fn slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T] {
+    // SAFETY: Casting `&mut [MaybeUninit<T>]` to `&mut [T]` is sound, because
+    // `MaybeUninit<T>` is guaranteed to have the same size, alignment and ABI
+    // as `T`, and because the caller has guaranteed that `slice` is in the
+    // valid state.
+    unsafe { &mut *(slice as *mut [MaybeUninit<T>] as *mut [T]) }
+}
+
+/// Equivalent to `it.next_array()`.
+pub(crate) fn next_array<I, const N: usize>(it: &mut I) -> Option<[I::Item; N]>
+where
+    I: Iterator,
+{
+    let mut builder = ArrayBuilder::new();
+    for _ in 0..N {
+        builder.push(it.next()?);
+    }
+    builder.take()
+}
+
+#[cfg(test)]
+mod test {
+    use super::ArrayBuilder;
+
+    #[test]
+    fn zero_len_take() {
+        let mut builder = ArrayBuilder::<(), 0>::new();
+        let taken = builder.take();
+        assert_eq!(taken, Some([(); 0]));
+    }
+
+    #[test]
+    #[should_panic]
+    fn zero_len_push() {
+        let mut builder = ArrayBuilder::<(), 0>::new();
+        builder.push(());
+    }
+
+    #[test]
+    fn push_4() {
+        let mut builder = ArrayBuilder::<(), 4>::new();
+        assert_eq!(builder.take(), None);
+
+        builder.push(());
+        assert_eq!(builder.take(), None);
+
+        builder.push(());
+        assert_eq!(builder.take(), None);
+
+        builder.push(());
+        assert_eq!(builder.take(), None);
+
+        builder.push(());
+        assert_eq!(builder.take(), Some([(); 4]));
+    }
+
+    #[test]
+    fn tracked_drop() {
+        use std::panic::{catch_unwind, AssertUnwindSafe};
+        use std::sync::atomic::{AtomicU16, Ordering};
+
+        static DROPPED: AtomicU16 = AtomicU16::new(0);
+
+        #[derive(Debug, PartialEq)]
+        struct TrackedDrop;
+
+        impl Drop for TrackedDrop {
+            fn drop(&mut self) {
+                DROPPED.fetch_add(1, Ordering::Relaxed);
+            }
+        }
+
+        {
+            let builder = ArrayBuilder::<TrackedDrop, 0>::new();
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 0);
+            drop(builder);
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 0);
+        }
+
+        {
+            let mut builder = ArrayBuilder::<TrackedDrop, 2>::new();
+            builder.push(TrackedDrop);
+            assert_eq!(builder.take(), None);
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 0);
+            drop(builder);
+            assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 1);
+        }
+
+        {
+            let mut builder = ArrayBuilder::<TrackedDrop, 2>::new();
+            builder.push(TrackedDrop);
+            builder.push(TrackedDrop);
+            assert!(matches!(builder.take(), Some(_)));
+            assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 2);
+            drop(builder);
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 0);
+        }
+
+        {
+            let mut builder = ArrayBuilder::<TrackedDrop, 2>::new();
+
+            builder.push(TrackedDrop);
+            builder.push(TrackedDrop);
+
+            assert!(catch_unwind(AssertUnwindSafe(|| {
+                builder.push(TrackedDrop);
+            }))
+            .is_err());
+
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 1);
+
+            drop(builder);
+
+            assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 3);
+        }
+
+        {
+            let mut builder = ArrayBuilder::<TrackedDrop, 2>::new();
+
+            builder.push(TrackedDrop);
+            builder.push(TrackedDrop);
+
+            assert!(catch_unwind(AssertUnwindSafe(|| {
+                builder.push(TrackedDrop);
+            }))
+            .is_err());
+
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 1);
+
+            assert!(matches!(builder.take(), Some(_)));
+
+            assert_eq!(DROPPED.load(Ordering::Relaxed), 3);
+
+            builder.push(TrackedDrop);
+            builder.push(TrackedDrop);
+
+            assert!(matches!(builder.take(), Some(_)));
+
+            assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 5);
+        }
+    }
+}
diff --git a/crates/itertools/src/peeking_take_while.rs b/crates/itertools/src/peeking_take_while.rs
index 19872a9..f3259a9 100644
--- a/crates/itertools/src/peeking_take_while.rs
+++ b/crates/itertools/src/peeking_take_while.rs
@@ -22,7 +22,7 @@
         F: FnOnce(&Self::Item) -> bool;
 }
 
-impl<'a, I> PeekingNext for &'a mut I
+impl<I> PeekingNext for &mut I
 where
     I: PeekingNext,
 {
@@ -133,7 +133,7 @@
     PeekingTakeWhile { iter, f }
 }
 
-impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F>
+impl<I, F> Iterator for PeekingTakeWhile<'_, I, F>
 where
     I: PeekingNext,
     F: FnMut(&I::Item) -> bool,
@@ -148,7 +148,7 @@
     }
 }
 
-impl<'a, I, F> PeekingNext for PeekingTakeWhile<'a, I, F>
+impl<I, F> PeekingNext for PeekingTakeWhile<'_, I, F>
 where
     I: PeekingNext,
     F: FnMut(&I::Item) -> bool,
diff --git a/crates/itertools/src/process_results_impl.rs b/crates/itertools/src/process_results_impl.rs
index ad6c60d..31389c5 100644
--- a/crates/itertools/src/process_results_impl.rs
+++ b/crates/itertools/src/process_results_impl.rs
@@ -13,7 +13,7 @@
     iter: I,
 }
 
-impl<'a, I, E> ProcessResults<'a, I, E> {
+impl<I, E> ProcessResults<'_, I, E> {
     #[inline(always)]
     fn next_body<T>(&mut self, item: Option<Result<T, E>>) -> Option<T> {
         match item {
@@ -27,7 +27,7 @@
     }
 }
 
-impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E>
+impl<I, T, E> Iterator for ProcessResults<'_, I, E>
 where
     I: Iterator<Item = Result<T, E>>,
 {
@@ -60,7 +60,7 @@
     }
 }
 
-impl<'a, I, T, E> DoubleEndedIterator for ProcessResults<'a, I, E>
+impl<I, T, E> DoubleEndedIterator for ProcessResults<'_, I, E>
 where
     I: Iterator<Item = Result<T, E>>,
     I: DoubleEndedIterator,
diff --git a/crates/itertools/src/rciter_impl.rs b/crates/itertools/src/rciter_impl.rs
index e3b7532..96a0fd6 100644
--- a/crates/itertools/src/rciter_impl.rs
+++ b/crates/itertools/src/rciter_impl.rs
@@ -87,7 +87,7 @@
 }
 
 /// Return an iterator from `&RcIter<I>` (by simply cloning it).
-impl<'a, I> IntoIterator for &'a RcIter<I>
+impl<I> IntoIterator for &RcIter<I>
 where
     I: Iterator,
 {
diff --git a/crates/itertools/src/zip_eq_impl.rs b/crates/itertools/src/zip_eq_impl.rs
index 6d3b682..3240a40 100644
--- a/crates/itertools/src/zip_eq_impl.rs
+++ b/crates/itertools/src/zip_eq_impl.rs
@@ -21,6 +21,7 @@
 /// let data = [1, 2, 3, 4, 5];
 /// for (a, b) in zip_eq(&data[..data.len() - 1], &data[1..]) {
 ///     /* loop body */
+///     # let _ = (a, b);
 /// }
 /// ```
 pub fn zip_eq<I, J>(i: I, j: J) -> ZipEq<I::IntoIter, J::IntoIter>
diff --git a/crates/itertools/tests/macros_hygiene.rs b/crates/itertools/tests/macros_hygiene.rs
index 20b59fb..e6e8955 100644
--- a/crates/itertools/tests/macros_hygiene.rs
+++ b/crates/itertools/tests/macros_hygiene.rs
@@ -1,3 +1,8 @@
+mod alloc {}
+mod core {}
+mod either {}
+mod std {}
+
 #[test]
 fn iproduct_hygiene() {
     let _ = itertools::iproduct!();
@@ -12,3 +17,11 @@
     let _ = itertools::izip!(0..6, 0..9);
     let _ = itertools::izip!(0..6, 0..9, 0..12);
 }
+
+#[test]
+fn chain_hygiene() {
+    let _: ::std::iter::Empty<i32> = itertools::chain!();
+    let _ = itertools::chain!(0..6);
+    let _ = itertools::chain!(0..6, 0..9);
+    let _ = itertools::chain!(0..6, 0..9, 0..12);
+}
diff --git a/crates/itertools/tests/quick.rs b/crates/itertools/tests/quick.rs
index 5b8fd6a..672901e 100644
--- a/crates/itertools/tests/quick.rs
+++ b/crates/itertools/tests/quick.rs
@@ -2,7 +2,11 @@
 //! and adaptors.
 //!
 //! In particular we test the tedious size_hint and exact size correctness.
+//!
+//! **NOTE:** Due to performance limitations, these tests are not run with miri!
+//! They cannot be relied upon to discover soundness issues.
 
+#![cfg(not(miri))]
 #![allow(deprecated, unstable_name_collisions)]
 
 use itertools::free::{
@@ -253,7 +257,6 @@
         let mut it = get_it();
 
         for _ in 0..(counts.len() - 1) {
-            #[allow(clippy::manual_assert)]
             if it.next().is_none() {
                 panic!("Iterator shouldn't be finished, may not be deterministic");
             }
@@ -1512,13 +1515,12 @@
                 acc + val
             });
 
-        // TODO: Swap `fold1` with stdlib's `reduce` when it's stabilized
         let group_map_lookup = a.iter()
             .map(|&b| b as u64)
             .map(|i| (i % modulo, i))
             .into_group_map()
             .into_iter()
-            .map(|(key, vals)| (key, vals.into_iter().fold1(|acc, val| acc + val).unwrap()))
+            .map(|(key, vals)| (key, vals.into_iter().reduce(|acc, val| acc + val).unwrap()))
             .collect::<HashMap<_,_>>();
         assert_eq!(lookup, group_map_lookup);
 
diff --git a/crates/itertools/tests/specializations.rs b/crates/itertools/tests/specializations.rs
index 7123114..e6694c8 100644
--- a/crates/itertools/tests/specializations.rs
+++ b/crates/itertools/tests/specializations.rs
@@ -1,3 +1,10 @@
+//! Test specializations of methods with default impls match the behavior of the
+//! default impls.
+//!
+//! **NOTE:** Due to performance limitations, these tests are not run with miri!
+//! They cannot be relied upon to discover soundness issues.
+
+#![cfg(not(miri))]
 #![allow(unstable_name_collisions)]
 
 use itertools::Itertools;
@@ -266,6 +273,16 @@
         test_specializations(&v.into_iter().intersperse_with(|| 0));
     }
 
+    fn array_combinations(v: Vec<u8>) -> TestResult {
+        if v.len() > 10 {
+            return TestResult::discard();
+        }
+        test_specializations(&v.iter().array_combinations::<1>());
+        test_specializations(&v.iter().array_combinations::<2>());
+        test_specializations(&v.iter().array_combinations::<3>());
+        TestResult::passed()
+    }
+
     fn combinations(a: Vec<u8>, n: u8) -> TestResult {
         if n > 3 || a.len() > 8 {
             return TestResult::discard();
@@ -447,11 +464,15 @@
     }
 
     fn filter_ok(v: Vec<Result<u8, char>>) -> () {
-        test_specializations(&v.into_iter().filter_ok(|&i| i < 20));
+        let it = v.into_iter().filter_ok(|&i| i < 20);
+        test_specializations(&it);
+        test_double_ended_specializations(&it);
     }
 
     fn filter_map_ok(v: Vec<Result<u8, char>>) -> () {
-        test_specializations(&v.into_iter().filter_map_ok(|i| if i < 20 { Some(i * 2) } else { None }));
+        let it = v.into_iter().filter_map_ok(|i| if i < 20 { Some(i * 2) } else { None });
+        test_specializations(&it);
+        test_double_ended_specializations(&it);
     }
 
     // `SmallIter2<u8>` because `Vec<u8>` is too slow and we get bad coverage from a singleton like Option<u8>
diff --git a/crates/itertools/tests/test_core.rs b/crates/itertools/tests/test_core.rs
index 32af246..4936160 100644
--- a/crates/itertools/tests/test_core.rs
+++ b/crates/itertools/tests/test_core.rs
@@ -372,3 +372,28 @@
     assert_eq!(v[1..3].iter().cloned().product1::<i32>(), Some(2));
     assert_eq!(v[1..5].iter().cloned().product1::<i32>(), Some(24));
 }
+
+#[test]
+fn next_array() {
+    let v = [1, 2, 3, 4, 5];
+    let mut iter = v.iter();
+    assert_eq!(iter.next_array(), Some([]));
+    assert_eq!(iter.next_array().map(|[&x, &y]| [x, y]), Some([1, 2]));
+    assert_eq!(iter.next_array().map(|[&x, &y]| [x, y]), Some([3, 4]));
+    assert_eq!(iter.next_array::<2>(), None);
+}
+
+#[test]
+fn collect_array() {
+    let v = [1, 2];
+    let iter = v.iter().cloned();
+    assert_eq!(iter.collect_array(), Some([1, 2]));
+
+    let v = [1];
+    let iter = v.iter().cloned();
+    assert_eq!(iter.collect_array::<2>(), None);
+
+    let v = [1, 2, 3];
+    let iter = v.iter().cloned();
+    assert_eq!(iter.collect_array::<2>(), None);
+}
diff --git a/crates/itertools/tests/test_std.rs b/crates/itertools/tests/test_std.rs
index 00246d5..ad391fa 100644
--- a/crates/itertools/tests/test_std.rs
+++ b/crates/itertools/tests/test_std.rs
@@ -491,6 +491,7 @@
     it::assert_equal(v, vec![4, 3, 2, 1, 0]);
 }
 
+#[cfg(not(miri))]
 qc::quickcheck! {
     fn k_smallest_range(n: i64, m: u16, k: u16) -> () {
         // u16 is used to constrain k and m to 0..2¹⁶,
@@ -527,6 +528,42 @@
         it::assert_equal(largest_by, sorted_largest.clone());
         it::assert_equal(largest_by_key, sorted_largest);
     }
+
+    fn k_smallest_relaxed_range(n: i64, m: u16, k: u16) -> () {
+        // u16 is used to constrain k and m to 0..2¹⁶,
+        //  otherwise the test could use too much memory.
+        let (k, m) = (k as usize, m as u64);
+
+        let mut v: Vec<_> = (n..n.saturating_add(m as _)).collect();
+        // Generate a random permutation of n..n+m
+        v.shuffle(&mut thread_rng());
+
+        // Construct the right answers for the top and bottom elements
+        let mut sorted = v.clone();
+        sorted.sort();
+        // how many elements are we checking
+        let num_elements = min(k, m as _);
+
+        // Compute the top and bottom k in various combinations
+        let sorted_smallest = sorted[..num_elements].iter().cloned();
+        let smallest = v.iter().cloned().k_smallest_relaxed(k);
+        let smallest_by = v.iter().cloned().k_smallest_relaxed_by(k, Ord::cmp);
+        let smallest_by_key = v.iter().cloned().k_smallest_relaxed_by_key(k, |&x| x);
+
+        let sorted_largest = sorted[sorted.len() - num_elements..].iter().rev().cloned();
+        let largest = v.iter().cloned().k_largest_relaxed(k);
+        let largest_by = v.iter().cloned().k_largest_relaxed_by(k, Ord::cmp);
+        let largest_by_key = v.iter().cloned().k_largest_relaxed_by_key(k, |&x| x);
+
+        // Check the variations produce the same answers and that they're right
+        it::assert_equal(smallest, sorted_smallest.clone());
+        it::assert_equal(smallest_by, sorted_smallest.clone());
+        it::assert_equal(smallest_by_key, sorted_smallest);
+
+        it::assert_equal(largest, sorted_largest.clone());
+        it::assert_equal(largest_by, sorted_largest.clone());
+        it::assert_equal(largest_by_key, sorted_largest);
+    }
 }
 
 #[derive(Clone, Debug)]
@@ -571,8 +608,11 @@
     I::Item: Ord + Debug,
 {
     let j = i.clone();
+    let i1 = i.clone();
+    let j1 = i.clone();
     let k = k as usize;
-    it::assert_equal(i.k_smallest(k), j.sorted().take(k))
+    it::assert_equal(i.k_smallest(k), j.sorted().take(k));
+    it::assert_equal(i1.k_smallest_relaxed(k), j1.sorted().take(k));
 }
 
 // Similar to `k_smallest_sort` but for our custom heap implementation.
@@ -582,8 +622,11 @@
     I::Item: Ord + Debug,
 {
     let j = i.clone();
+    let i1 = i.clone();
+    let j1 = i.clone();
     let k = k as usize;
-    it::assert_equal(i.k_smallest_by(k, Ord::cmp), j.sorted().take(k))
+    it::assert_equal(i.k_smallest_by(k, Ord::cmp), j.sorted().take(k));
+    it::assert_equal(i1.k_smallest_relaxed_by(k, Ord::cmp), j1.sorted().take(k));
 }
 
 macro_rules! generic_test {
@@ -598,7 +641,9 @@
     };
 }
 
+#[cfg(not(miri))]
 generic_test!(k_smallest_sort, u8, u16, u32, u64, i8, i16, i32, i64);
+#[cfg(not(miri))]
 generic_test!(k_smallest_by_sort, u8, u16, u32, u64, i8, i16, i32, i64);
 
 #[test]
@@ -1055,8 +1100,8 @@
 
 #[test]
 fn combinations_range_count() {
-    for n in 0..=10 {
-        for k in 0..=10 {
+    for n in 0..=7 {
+        for k in 0..=7 {
             let len = binomial(n, k);
             let mut it = (0..n).combinations(k);
             assert_eq!(len, it.clone().count());
@@ -1077,7 +1122,7 @@
 
 #[test]
 fn combinations_inexact_size_hints() {
-    for k in 0..=10 {
+    for k in 0..=7 {
         let mut numbers = (0..18).filter(|i| i % 2 == 0); // 9 elements
         let mut it = numbers.clone().combinations(k);
         let real_n = numbers.clone().count();
@@ -1129,8 +1174,8 @@
 
 #[test]
 fn permutations_range_count() {
-    for n in 0..=7 {
-        for k in 0..=7 {
+    for n in 0..=4 {
+        for k in 0..=4 {
             let len = if k <= n { (n - k + 1..=n).product() } else { 0 };
             let mut it = (0..n).permutations(k);
             assert_eq!(len, it.clone().count());
@@ -1162,6 +1207,7 @@
 }
 
 #[test]
+#[cfg(not(miri))]
 fn combinations_with_replacement() {
     // Pool smaller than n
     it::assert_equal((0..1).combinations_with_replacement(2), vec![vec![0, 0]]);
@@ -1190,8 +1236,8 @@
 
 #[test]
 fn combinations_with_replacement_range_count() {
-    for n in 0..=7 {
-        for k in 0..=7 {
+    for n in 0..=4 {
+        for k in 0..=4 {
             let len = binomial(usize::saturating_sub(n + k, 1), k);
             let mut it = (0..n).combinations_with_replacement(k);
             assert_eq!(len, it.clone().count());
@@ -1236,7 +1282,7 @@
     assert_eq!((0..8).powerset().count(), 1 << 8);
     assert_eq!((0..16).powerset().count(), 1 << 16);
 
-    for n in 0..=10 {
+    for n in 0..=4 {
         let mut it = (0..n).powerset();
         let len = 2_usize.pow(n);
         assert_eq!(len, it.clone().count());
diff --git a/crates/itertools/tests/zip.rs b/crates/itertools/tests/zip.rs
index 716ac20..daed31e 100644
--- a/crates/itertools/tests/zip.rs
+++ b/crates/itertools/tests/zip.rs
@@ -20,7 +20,7 @@
     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
     let v2 = &[10, 11, 12];
 
-    assert_eq!(c.zip_longest(v.iter()).size_hint(), (std::usize::MAX, None));
+    assert_eq!(c.zip_longest(v.iter()).size_hint(), (usize::MAX, None));
 
     assert_eq!(v.iter().zip_longest(v2.iter()).size_hint(), (10, Some(10)));
 }
diff --git a/crates/litrs/.android-checksum.json b/crates/litrs/.android-checksum.json
index ac7656d..b9b03fb 100644
--- a/crates/litrs/.android-checksum.json
+++ b/crates/litrs/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"3d5b90bd6ce9063bb04fad37d7afd6f4d7a24db579f818972705943b1f4038fd","Android.bp":"34946635835e410125fdde874952a5185fc6ef6ed7eb1aea1cb5516f706088ba","CHANGELOG.md":"c561ce97f89d2c3e4d667ca03374dcd62138c2c506b8e8d22bfb214635212a8d","Cargo.toml":"429bd14ab71cb8e57c8c44ef278a7ceeaa8cbc0fb4a0de992c34a41309af4e5a","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"5431df8e7551a3ba0e6526fe532884000aa3cfe905fbf13ca66a7f8108561cb9","METADATA":"aedb495059560884f6e9fd993e189faf0d4bc93cab996974d6d618a8ee956379","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"9f9515dd556a269baffa43606eafffaa016b0fdd128b901b02cb90f2a6418a26","cargo_embargo.json":"e6e87d4bcbbf3f832b3f7823f0ddbc381fbe35c52e24d4a4fbf3aeb09b89c50e","src/bool/mod.rs":"f3bb8b87219ba2d5d8d059f43580bce3408275061a8bd82f1a0d666a7015685e","src/bool/tests.rs":"87c439a0f5b4cabedbcdec467225af1480ebe42f04eaf73a4f29e90932f293b4","src/byte/mod.rs":"c429c6d9d84c828b4f26a35b35ded7529226722a1764930c6f26021ea4ebdc55","src/byte/tests.rs":"455e83da47b0afc22bf85b8f19c89c7fd3f8e04b0f1004eff27f99e3cff11831","src/bytestr/mod.rs":"b1d73966b23de7607196d5cf5801addc51b2129f86570311b6a2803724429cc3","src/bytestr/tests.rs":"d0de0fa8c27f5ea04fc7ed70006ea6af9eaca65b208e7a11eabeb500bf5fc117","src/char/mod.rs":"2983dfb445a29d3fe2e7b8aa6a0e948c48e7aaa0a00ec61fa39b356a0fa1a3bd","src/char/tests.rs":"efb992b27824bc9c75fc54254ef6455d840075b1f7cfcd9da7f6d03282dbae43","src/err.rs":"b348412f6e2700bef152a19dcbe4836df992e7ad200bd178cbbed9711562dfe3","src/escape.rs":"0b65c042ccbd8ee350719bfa774c8c864cba30b3ff9a77f809ee0feead56bcf0","src/float/mod.rs":"6cf06c025efc91576e6f6cbb0907a4b7fe329c1900c00ce6ef7d2c40515e4738","src/float/tests.rs":"db9f8ceed54daa16a2e2429bc03966cacec83dcb4ea82736ed0ac3d80b56cd1b","src/impls.rs":"af2e13e91d8c7964a713e9d74f23f82015e4a2afa423f8e3638a82aa40fa512a","src/integer/mod.rs":"1765622faef27c5bacd2fc8e8dba8a68478972a7fdb20bfd3bee17d5622a15e7","src/integer/tests.rs":"2ebacd67502c16e373b717a7b99036b8ae34ae7f06f5453d260c97e4781b7beb","src/lib.rs":"04483e2593c446abe18943586fbfcbf701aa5ac1b5d6f89ab9b36385f34730bd","src/parse.rs":"025bdf3c402108011cac6c5094107f065d0db588dd65584b7ad94ccac32176fe","src/string/mod.rs":"7b3d4e8afac6a6432a82b32825b5cf552fc663d40d4481268934b0f94ab313de","src/string/tests.rs":"34576b9c8932d859ae68f1b08888b0ca3ab0c7e80dd5afc845b94b0db9c16386","src/test_util.rs":"f9bfe2a53a3480c3149b3264d68ccf76d493103de1d447579b3008d85b388a83","src/tests.rs":"1615f6634449ade712ad3e40a25e9504ebc0988cd4c735258787b31de27e407f"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"50fb0bbf2ab1fa41c81d92e0651fa50d7076eeaca866edca951ca95432d4bc2c","Android.bp":"81d21178cae96cc70509f5b5a317b2943cd372ef720d71d31c840be3fc830e8a","CHANGELOG.md":"57622d3aebf3ea223e1b92561e374e3ded461292fae9c6be0244c9367e2aedb1","Cargo.toml":"d19d08af5f35eb5793025f964a61c9d7ea9c36bbd0d269928314c305ab1a4525","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"5431df8e7551a3ba0e6526fe532884000aa3cfe905fbf13ca66a7f8108561cb9","METADATA":"2a7ebebaa896b165f41504d1a70155e7b86f3e706ca04751b0788047f258c22e","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"9f9515dd556a269baffa43606eafffaa016b0fdd128b901b02cb90f2a6418a26","cargo_embargo.json":"e6e87d4bcbbf3f832b3f7823f0ddbc381fbe35c52e24d4a4fbf3aeb09b89c50e","src/bool/mod.rs":"f3bb8b87219ba2d5d8d059f43580bce3408275061a8bd82f1a0d666a7015685e","src/bool/tests.rs":"87c439a0f5b4cabedbcdec467225af1480ebe42f04eaf73a4f29e90932f293b4","src/byte/mod.rs":"d9cb0a1a672f74380178c0307f4e91330b4a3b417d5397e43202dbfb95addbf2","src/byte/tests.rs":"34cc7732900a98e821c8cab370628b8990f9ced3fa90e353093beccaa36aea25","src/bytestr/mod.rs":"1d00041ac52052001f4b57561b1014578943d6bcc2b78bc0e47ac500c372a551","src/bytestr/tests.rs":"6261f1242d34bc479ae8fbbc29b49a72e3c8bb4969e14b0201ac4c6e7827a241","src/char/mod.rs":"1316ba70e7ea6eae0c98b4c49ee329f4c3bbba32b668ab7df55af867eac43f93","src/char/tests.rs":"c9ae0118a17e9735f25a78b80f3eefcdb1529a586755ee8440dab7e4ec42fa1d","src/err.rs":"f8ebb5e07ae94849b80d4b113deae04c5003bb1ebaffa0af3754b9861dae27ed","src/escape.rs":"b58e9d7b692b9180719e4c9ef42a197800307230c7d21ac14d2594b283c9cca9","src/float/mod.rs":"9c6c5e6d723fc4af01523ff28141c993f9b70e9448d84f016f8057aac9fc9636","src/float/tests.rs":"353b1f9ae589d21d145423a77360e082860094247dc72f97c86f43e495d054e9","src/impls.rs":"af2e13e91d8c7964a713e9d74f23f82015e4a2afa423f8e3638a82aa40fa512a","src/integer/mod.rs":"f27fce2145c73993313e1a65a8fd754b397756f1ba360d2be5ef9fdbc10e6f6e","src/integer/tests.rs":"d281932d124b89d41ed52fa240d8fdd61fa0fa6cffc841641a29630150c1f0db","src/lib.rs":"ac74e7b61e3330f4c28ea74379c2201a4e5b5fc6be558d538d3e55195eff5549","src/parse.rs":"aa2b773ff1a3f25cba8728415b951743fe0f4467f7a126603e20ccefeb7c85e5","src/string/mod.rs":"58c01076f8b59fdd19fef39daf5310a62d3c8b2d01967479c0e1b67716981741","src/string/tests.rs":"0c2fb0957858ee8661a7613926fbfd2aac3e9c391eec1d82c2dfcb004ebab7e0","src/test_util.rs":"f9bfe2a53a3480c3149b3264d68ccf76d493103de1d447579b3008d85b388a83","src/tests.rs":"498423bcb9e40531b3a6e9d0e1d6694b813b9b9554bb8ce7a80b9b83b4bbbc07"}}
\ No newline at end of file
diff --git a/crates/litrs/.cargo-checksum.json b/crates/litrs/.cargo-checksum.json
index 2ebdea4..d12ccff 100644
--- a/crates/litrs/.cargo-checksum.json
+++ b/crates/litrs/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"75113cfc6e895ee8e72b86e34174fd34df2d5268df1d6df01963773412b9c35b","Cargo.toml":"60e17be214a6939e3db1371b40ddbd1389e3296bf371155713cbd770780c90a9","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"7dc1552e88f49132cb358b1b962fc5e79fa42d70bcbb88c526d33e45b8e98036","README.md":"533d31adf3b4258b838cd6a1cdb58139e2cf761c3c38aa4654f66f34335c9073","src/bool/mod.rs":"53c6eedfd94552689e51233fffb8a99ce9321a32db0f08de8b18d48cda9b1877","src/bool/tests.rs":"a0e6d034036aa04aac6b847bb561bdba759d85c78d4cbb7fb93f4422efb83656","src/byte/mod.rs":"af5021c4f81e629177829fd0459ce3d164abeb23aa2d5528a2237e4e72c1fbff","src/byte/tests.rs":"cf0b4bf184a3376d5a90f8300fa51fee48849db18609dd00841084b78c4a8214","src/bytestr/mod.rs":"590d52ba2d61d10b7ad648eaac9a9ec1de7b86553c33c24c1cd7f730f8add161","src/bytestr/tests.rs":"cbc83534a52a3c909816dc00400de8f164917b2ab619f2e970cab8220ddfdd56","src/char/mod.rs":"16cb0d84945edaeff1cddc7f7a0520ab9b2afe19bec10548d4d88fb8eb5d36a6","src/char/tests.rs":"dc07b055f4c726cdcd4331aabfbc87b9f73c9f67b473c4200bc6ea15a9abe4b7","src/err.rs":"8678e3f962fcbeb01b0eb6c569912f5f3104e202c06bb3586d200019b7ff847a","src/escape.rs":"140738944527cbe552c93517cf101d4da4e75e3cf341d03825f32d790ab33600","src/float/mod.rs":"3eca51480da333dca7264223f00d80456b6fb7935eb0e799e755dfc769a66951","src/float/tests.rs":"042179ffbd7cfaba24282811207ea254f3711c2c3ebf2ae63dd8df40221b53e6","src/impls.rs":"c5dd37dd3ecd29c40a0ed243b907765a27729a1b1f73fa2c6762105feb6527bc","src/integer/mod.rs":"89cc7bc238a9f0298287fb7db3610fa69ae46fc149e40214df6aea0a3cf44782","src/integer/tests.rs":"fa7f68fdedcd53b2acaca2bd870a8d6c6bd590fead3cf81834401d7155d7b950","src/lib.rs":"6897158d3759d8c1ec19465234993a18731a0948ac33edb982bba448e4a87836","src/parse.rs":"92f8b3eb34f3b250232d104536d570c03235f79daf1d682a95504436c2482126","src/string/mod.rs":"6551733c782aa7f504f8d15ab6c5a8354d5ab9dfba64143dd5a36d24d30258ba","src/string/tests.rs":"90a4982fd7bc4e0eeca6bd41ddb71f0963af6226aeecffa4d57045f259d6e362","src/test_util.rs":"3badda83d7f256bb25b840820bc0d3a6523b4ded913555cbea5533b6ccad5654","src/tests.rs":"d13acd463be0dbb0ec67d21bd943c4eb05b918eec52a0eabe99dc7a40b3c3de3"},"package":"b487d13a3f4b465df87895a37b24e364907019afa12d943528df5b7abe0836f1"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"03cea7c394dd09087f6b2c7ba4b4641b5c2c50b32b7286cabd5be4850f62f170","Cargo.toml":"6ef884164a0139f0591a381ada2c99d850d38e5f3af3451efa12f808f8a799e0","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"7dc1552e88f49132cb358b1b962fc5e79fa42d70bcbb88c526d33e45b8e98036","README.md":"533d31adf3b4258b838cd6a1cdb58139e2cf761c3c38aa4654f66f34335c9073","src/bool/mod.rs":"53c6eedfd94552689e51233fffb8a99ce9321a32db0f08de8b18d48cda9b1877","src/bool/tests.rs":"a0e6d034036aa04aac6b847bb561bdba759d85c78d4cbb7fb93f4422efb83656","src/byte/mod.rs":"ff2a3e6108a9b32ae0d925ec34735d20194d5c6b27af060516a46d21397c75be","src/byte/tests.rs":"ac36dace42cd151ac9d26cc35701bc8b65f8f1ed6ee1cfef4eeb6caa9dd702bc","src/bytestr/mod.rs":"8fd951374f7edc2077465cd4f97001eece46358f2bb0c45fddb2942aac6ee13b","src/bytestr/tests.rs":"194b28f157196260b1c2a612dfb36fb1dace491db2ed2bbb39227771ed6baf60","src/char/mod.rs":"2bb6f25da83670f18ec40f8a38565aa2294a4cdf81c8bbaf081531a32b6c6d0c","src/char/tests.rs":"9de497c8c7d7a139ff81f3d7bf8b5c682316d983bebb58c58d2af97f4cd26c35","src/err.rs":"54d000c4f37258c6886dd5b7069e2f5282e51aec3731feb77935582ae8c18908","src/escape.rs":"a944e95344df54c16bf4cc6a8fb01a81e2eac2aacd4758b938d3339212fce60c","src/float/mod.rs":"defaf83526acdc8f9b34c7d1ac17d866a93409dc392eb608160778d6bb4a1e25","src/float/tests.rs":"5875403f1a72104973ed83d0cf29d766e7b2fa5c23615c85a5f2eeed02b115c9","src/impls.rs":"c5dd37dd3ecd29c40a0ed243b907765a27729a1b1f73fa2c6762105feb6527bc","src/integer/mod.rs":"2b9109ddd34faf76fc9ce9dfb04bcc6aed4834231c74bd8a774bd256cc57c18a","src/integer/tests.rs":"01147ce9b6742bb1614cf863090699c54bf660b9f2c6a5eb529d67ae92230c0d","src/lib.rs":"2e79c8035d0fb77db9414b5569eeef13b6db8cde48ef2a45ffcf5f2492d02a4a","src/parse.rs":"e1fa4a76331d52f711e1b06cdba853a4f815281366f4f4f68b4c0a109f8a1734","src/string/mod.rs":"52a9cda38f7cd5b025bc5ec7edb8106487ba3d141789f5bc239c4561490cdc29","src/string/tests.rs":"1e0150ddd921a74ed5ebf6216708132d7768f3beb11a8c7bbfcf4ba01db40a5b","src/test_util.rs":"3badda83d7f256bb25b840820bc0d3a6523b4ded913555cbea5533b6ccad5654","src/tests.rs":"9f0dc2fe7a0eefb6575acd824767bb7d837a584dc7999ef59a457255a2cd7f3d"},"package":"b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"}
\ No newline at end of file
diff --git a/crates/litrs/Android.bp b/crates/litrs/Android.bp
index ca7e8b2..1adc935 100644
--- a/crates/litrs/Android.bp
+++ b/crates/litrs/Android.bp
@@ -18,7 +18,7 @@
     host_cross_supported: false,
     crate_name: "litrs",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.3.0",
+    cargo_pkg_version: "0.4.1",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
diff --git a/crates/litrs/CHANGELOG.md b/crates/litrs/CHANGELOG.md
index 3d4ee99..e2927c2 100644
--- a/crates/litrs/CHANGELOG.md
+++ b/crates/litrs/CHANGELOG.md
@@ -5,6 +5,30 @@
 
 ## [Unreleased]
 
+## [0.4.1] - 2023-10-18
+- Fixed incorrectly labeling `27f32` a float literals in docs.
+- Added hint to integer literal docs about parsing as `u128`.
+
+## [0.4.0] - 2023-03-05
+### Added
+- Add ability to parse literals with arbitrary suffixes (e.g. `"foo"bla` or `23px`)
+- Add `suffix()` method to all literal types except `BoolLit`
+- Add `IntegerBase::value`
+- Add `from_suffix` and `suffix` methods to `FloatType` and `IntegerType`
+- Add `FromStr` and `Display` impls to `FloatType` and `IntegerType`
+
+### Changed
+- **Breaking**: Mark `FloatType` and `IntegerType` as `#[non_exhaustive]`
+- **Breaking**: Fix integer parsing for cases like `27f32`. `Literal::parse`
+  and `IntegerLit::parse` will both identify this as an integer literal.
+- **Breaking**: Fix float parsing by correctly rejecting inputs like `27f32`. A
+  float literal must have a period OR an exponent part, according to the spec.
+  Previously decimal integers were accepted in `FloatLit::parse`.
+- Improved some parts of the docs
+
+### Removed
+- **Breaking**: Remove `OwnedLiteral` and `SharedLiteral`
+
 ## [0.3.0] - 2022-12-19
 ### Breaking
 - Bump MSRV (minimal supported Rust version) to 1.54
@@ -68,7 +92,9 @@
 - Everything
 
 
-[Unreleased]: https://github.com/LukasKalbertodt/litrs/compare/v0.3.0...HEAD
+[Unreleased]: https://github.com/LukasKalbertodt/litrs/compare/v0.4.1...HEAD
+[0.4.1]: https://github.com/LukasKalbertodt/litrs/compare/v0.4.0...v0.4.1
+[0.4.0]: https://github.com/LukasKalbertodt/litrs/compare/v0.3.0...v0.4.0
 [0.3.0]: https://github.com/LukasKalbertodt/litrs/compare/v0.2.3...v0.3.0
 [0.2.3]: https://github.com/LukasKalbertodt/litrs/compare/v0.2.2...v0.2.3
 [0.2.2]: https://github.com/LukasKalbertodt/litrs/compare/v0.2.1...v0.2.2
diff --git a/crates/litrs/Cargo.toml b/crates/litrs/Cargo.toml
index 62e2503..6e65403 100644
--- a/crates/litrs/Cargo.toml
+++ b/crates/litrs/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.54"
 name = "litrs"
-version = "0.3.0"
+version = "0.4.1"
 authors = ["Lukas Kalbertodt <[email protected]>"]
 exclude = [".github"]
 description = """
@@ -42,5 +42,10 @@
 version = "1"
 optional = true
 
+[dependencies.unicode-xid]
+version = "0.2.4"
+optional = true
+
 [features]
+check_suffix = ["unicode-xid"]
 default = ["proc-macro2"]
diff --git a/crates/litrs/METADATA b/crates/litrs/METADATA
index fb25f66..e9503fd 100644
--- a/crates/litrs/METADATA
+++ b/crates/litrs/METADATA
@@ -1,17 +1,17 @@
 name: "litrs"
 description: "Parse and inspect Rust literals (i.e. tokens in the Rust programming language representing fixed values). Particularly useful for proc macros, but can also be used outside of a proc-macro context."
 third_party {
-  version: "0.3.0"
+  version: "0.4.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 2
-    day: 3
+    year: 2024
+    month: 12
+    day: 21
   }
   homepage: "https://crates.io/crates/litrs"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/litrs/litrs-0.3.0.crate"
-    version: "0.3.0"
+    value: "https://static.crates.io/crates/litrs/litrs-0.4.1.crate"
+    version: "0.4.1"
   }
 }
diff --git a/crates/litrs/src/byte/mod.rs b/crates/litrs/src/byte/mod.rs
index 7c64901..ffdff5d 100644
--- a/crates/litrs/src/byte/mod.rs
+++ b/crates/litrs/src/byte/mod.rs
@@ -4,6 +4,7 @@
     Buffer, ParseError,
     err::{perr, ParseErrorKind::*},
     escape::unescape,
+    parse::check_suffix,
 };
 
 
@@ -15,6 +16,8 @@
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub struct ByteLit<B: Buffer> {
     raw: B,
+    /// Start index of the suffix or `raw.len()` if there is no suffix.
+    start_suffix: usize,
     value: u8,
 }
 
@@ -29,8 +32,8 @@
             return Err(perr(None, InvalidByteLiteralStart));
         }
 
-        let value = parse_impl(&input)?;
-        Ok(Self { raw: input, value })
+        let (value, start_suffix) = parse_impl(&input)?;
+        Ok(Self { raw: input, value, start_suffix })
     }
 
     /// Returns the byte value that this literal represents.
@@ -38,6 +41,11 @@
         self.value
     }
 
+    /// The optional suffix. Returns `""` if the suffix is empty/does not exist.
+    pub fn suffix(&self) -> &str {
+        &(*self.raw)[self.start_suffix..]
+    }
+
     /// Returns the raw input that was passed to `parse`.
     pub fn raw_input(&self) -> &str {
         &self.raw
@@ -56,6 +64,7 @@
     pub fn to_owned(&self) -> ByteLit<String> {
         ByteLit {
             raw: self.raw.to_owned(),
+            start_suffix: self.start_suffix,
             value: self.value,
         }
     }
@@ -69,32 +78,29 @@
 
 /// Precondition: must start with `b'`.
 #[inline(never)]
-pub(crate) fn parse_impl(input: &str) -> Result<u8, ParseError> {
-    if input.len() == 2 {
-        return Err(perr(None, UnterminatedByteLiteral));
-    }
-    if *input.as_bytes().last().unwrap() != b'\'' {
-        return Err(perr(None, UnterminatedByteLiteral));
-    }
-
-    let inner = &input[2..input.len() - 1];
-    let first = inner.as_bytes().get(0).ok_or(perr(None, EmptyByteLiteral))?;
+pub(crate) fn parse_impl(input: &str) -> Result<(u8, usize), ParseError> {
+    let input_bytes = input.as_bytes();
+    let first = input_bytes.get(2).ok_or(perr(None, UnterminatedByteLiteral))?;
     let (c, len) = match first {
-        b'\'' => return Err(perr(2, UnescapedSingleQuote)),
-        b'\n' | b'\t' | b'\r'
-            => return Err(perr(2, UnescapedSpecialWhitespace)),
-
-        b'\\' => unescape::<u8>(inner, 2)?,
+        b'\'' if input_bytes.get(3) == Some(&b'\'') => return Err(perr(2, UnescapedSingleQuote)),
+        b'\'' => return Err(perr(None, EmptyByteLiteral)),
+        b'\n' | b'\t' | b'\r' => return Err(perr(2, UnescapedSpecialWhitespace)),
+        b'\\' => unescape::<u8>(&input[2..], 2)?,
         other if other.is_ascii() => (*other, 1),
         _ => return Err(perr(2, NonAsciiInByteLiteral)),
     };
-    let rest = &inner[len..];
 
-    if !rest.is_empty() {
-        return Err(perr(len + 2..input.len() - 1, OverlongByteLiteral));
+    match input[2 + len..].find('\'') {
+        Some(0) => {}
+        Some(_) => return Err(perr(None, OverlongByteLiteral)),
+        None => return Err(perr(None, UnterminatedByteLiteral)),
     }
 
-    Ok(c)
+    let start_suffix = 2 + len + 1;
+    let suffix = &input[start_suffix..];
+    check_suffix(suffix).map_err(|kind| perr(start_suffix, kind))?;
+
+    Ok((c, start_suffix))
 }
 
 #[cfg(test)]
diff --git a/crates/litrs/src/byte/tests.rs b/crates/litrs/src/byte/tests.rs
index 08586b0..3cf16b5 100644
--- a/crates/litrs/src/byte/tests.rs
+++ b/crates/litrs/src/byte/tests.rs
@@ -3,16 +3,20 @@
 // ===== Utility functions =======================================================================
 
 macro_rules! check {
-    ($lit:literal) => {
-        let input = stringify!($lit);
+    ($lit:literal) => { check!($lit, stringify!($lit), "") };
+    ($lit:literal, $input:expr, $suffix:literal) => {
+        let input = $input;
         let expected = ByteLit {
             raw: input,
+            start_suffix: input.len() - $suffix.len(),
             value: $lit,
         };
 
         assert_parse_ok_eq(input, ByteLit::parse(input), expected.clone(), "ByteLit::parse");
         assert_parse_ok_eq(input, Literal::parse(input), Literal::Byte(expected), "Literal::parse");
-        assert_eq!(ByteLit::parse(input).unwrap().value(), $lit);
+        let lit = ByteLit::parse(input).unwrap();
+        assert_eq!(lit.value(), $lit);
+        assert_eq!(lit.suffix(), $suffix);
         assert_roundtrip(expected.to_owned(), input);
     };
 }
@@ -114,12 +118,22 @@
 }
 
 #[test]
+fn suffixes() {
+    check!(b'a', r##"b'a'peter"##, "peter");
+    check!(b'#', r##"b'#'peter"##, "peter");
+    check!(b'\n', r##"b'\n'peter"##, "peter");
+    check!(b'\'', r##"b'\''peter"##, "peter");
+    check!(b'\"', r##"b'\"'peter"##, "peter");
+    check!(b'\xFF', r##"b'\xFF'peter"##, "peter");
+}
+
+#[test]
 fn invald_escapes() {
     assert_err!(ByteLit, r"b'\a'", UnknownEscape, 2..4);
     assert_err!(ByteLit, r"b'\y'", UnknownEscape, 2..4);
-    assert_err!(ByteLit, r"b'\", UnterminatedByteLiteral, None);
-    assert_err!(ByteLit, r"b'\x'", UnterminatedEscape, 2..4);
-    assert_err!(ByteLit, r"b'\x1'", UnterminatedEscape, 2..5);
+    assert_err!(ByteLit, r"b'\", UnterminatedEscape, 2..3);
+    assert_err!(ByteLit, r"b'\x'", UnterminatedEscape, 2..5);
+    assert_err!(ByteLit, r"b'\x1'", InvalidXEscape, 2..6);
     assert_err!(ByteLit, r"b'\xaj'", InvalidXEscape, 2..6);
     assert_err!(ByteLit, r"b'\xjb'", InvalidXEscape, 2..6);
 }
@@ -148,16 +162,16 @@
 #[test]
 fn parse_err() {
     assert_err!(ByteLit, r"b''", EmptyByteLiteral, None);
-    assert_err!(ByteLit, r"b' ''", OverlongByteLiteral, 3..4);
+    assert_err!(ByteLit, r"b' ''", UnexpectedChar, 4..5);
 
     assert_err!(ByteLit, r"b'", UnterminatedByteLiteral, None);
     assert_err!(ByteLit, r"b'a", UnterminatedByteLiteral, None);
     assert_err!(ByteLit, r"b'\n", UnterminatedByteLiteral, None);
     assert_err!(ByteLit, r"b'\x35", UnterminatedByteLiteral, None);
 
-    assert_err!(ByteLit, r"b'ab'", OverlongByteLiteral, 3..4);
-    assert_err!(ByteLit, r"b'a _'", OverlongByteLiteral, 3..5);
-    assert_err!(ByteLit, r"b'\n3'", OverlongByteLiteral, 4..5);
+    assert_err!(ByteLit, r"b'ab'", OverlongByteLiteral, None);
+    assert_err!(ByteLit, r"b'a _'", OverlongByteLiteral, None);
+    assert_err!(ByteLit, r"b'\n3'", OverlongByteLiteral, None);
 
     assert_err!(ByteLit, r"", Empty, None);
 
diff --git a/crates/litrs/src/bytestr/mod.rs b/crates/litrs/src/bytestr/mod.rs
index a2908b9..a0e0972 100644
--- a/crates/litrs/src/bytestr/mod.rs
+++ b/crates/litrs/src/bytestr/mod.rs
@@ -24,6 +24,9 @@
     /// The number of hash signs in case of a raw string literal, or `None` if
     /// it's not a raw string literal.
     num_hashes: Option<u32>,
+
+    /// Start index of the suffix or `raw.len()` if there is no suffix.
+    start_suffix: usize,
 }
 
 impl<B: Buffer> ByteStringLit<B> {
@@ -37,7 +40,8 @@
             return Err(perr(None, InvalidByteStringLiteralStart));
         }
 
-        Self::parse_impl(input)
+        let (value, num_hashes, start_suffix) = parse_impl(&input)?;
+        Ok(Self { raw: input, value, num_hashes, start_suffix })
     }
 
     /// Returns the string value this literal represents (where all escapes have
@@ -56,6 +60,11 @@
         value.map(B::ByteCow::from).unwrap_or_else(|| raw.cut(inner_range).into_byte_cow())
     }
 
+    /// The optional suffix. Returns `""` if the suffix is empty/does not exist.
+    pub fn suffix(&self) -> &str {
+        &(*self.raw)[self.start_suffix..]
+    }
+
     /// Returns whether this literal is a raw string literal (starting with
     /// `r`).
     pub fn is_raw_byte_string(&self) -> bool {
@@ -75,27 +84,8 @@
     /// The range within `self.raw` that excludes the quotes and potential `r#`.
     fn inner_range(&self) -> Range<usize> {
         match self.num_hashes {
-            None => 2..self.raw.len() - 1,
-            Some(n) => 2 + n as usize + 1..self.raw.len() - n as usize - 1,
-        }
-    }
-
-    /// Precondition: input has to start with either `b"` or `br`.
-    pub(crate) fn parse_impl(input: B) -> Result<Self, ParseError> {
-        if input.starts_with(r"br") {
-            let (value, num_hashes) = scan_raw_string::<u8>(&input, 2)?;
-            Ok(Self {
-                raw: input,
-                value: value.map(|s| s.into_bytes()),
-                num_hashes: Some(num_hashes),
-            })
-        } else {
-            let value = unescape_string::<u8>(&input, 2)?.map(|s| s.into_bytes());
-            Ok(Self {
-                raw: input,
-                value,
-                num_hashes: None,
-            })
+            None => 2..self.start_suffix - 1,
+            Some(n) => 2 + n as usize + 1..self.start_suffix - n as usize - 1,
         }
     }
 }
@@ -108,6 +98,7 @@
             raw: self.raw.to_owned(),
             value: self.value,
             num_hashes: self.num_hashes,
+            start_suffix: self.start_suffix,
         }
     }
 }
@@ -119,5 +110,17 @@
 }
 
 
+/// Precondition: input has to start with either `b"` or `br`.
+#[inline(never)]
+fn parse_impl(input: &str) -> Result<(Option<Vec<u8>>, Option<u32>, usize), ParseError> {
+    if input.starts_with("br") {
+        scan_raw_string::<u8>(&input, 2)
+            .map(|(v, num, start_suffix)| (v.map(String::into_bytes), Some(num), start_suffix))
+    } else {
+        unescape_string::<u8>(&input, 2)
+            .map(|(v, start_suffix)| (v.map(String::into_bytes), None, start_suffix))
+    }
+}
+
 #[cfg(test)]
 mod tests;
diff --git a/crates/litrs/src/bytestr/tests.rs b/crates/litrs/src/bytestr/tests.rs
index b0480fd..2afef5a 100644
--- a/crates/litrs/src/bytestr/tests.rs
+++ b/crates/litrs/src/bytestr/tests.rs
@@ -4,19 +4,25 @@
 
 macro_rules! check {
     ($lit:literal, $has_escapes:expr, $num_hashes:expr) => {
-        let input = stringify!($lit);
+        check!($lit, stringify!($lit), $has_escapes, $num_hashes, "")
+    };
+    ($lit:literal, $input:expr, $has_escapes:expr, $num_hashes:expr, $suffix:literal) => {
+        let input = $input;
         let expected = ByteStringLit {
             raw: input,
             value: if $has_escapes { Some($lit.to_vec()) } else { None },
             num_hashes: $num_hashes,
+            start_suffix: input.len() - $suffix.len(),
         };
 
         assert_parse_ok_eq(
             input, ByteStringLit::parse(input), expected.clone(), "ByteStringLit::parse");
         assert_parse_ok_eq(
             input, Literal::parse(input), Literal::ByteString(expected.clone()), "Literal::parse");
-        assert_eq!(ByteStringLit::parse(input).unwrap().value(), $lit);
-        assert_eq!(ByteStringLit::parse(input).unwrap().into_value().as_ref(), $lit);
+        let lit = ByteStringLit::parse(input).unwrap();
+        assert_eq!(lit.value(), $lit);
+        assert_eq!(lit.suffix(), $suffix);
+        assert_eq!(lit.into_value().as_ref(), $lit);
         assert_roundtrip(expected.into_owned(), input);
     };
 }
@@ -43,6 +49,7 @@
                 raw: &*input,
                 value: None,
                 num_hashes,
+                start_suffix: input.len(),
             };
             assert_parse_ok_eq(
                 &input, ByteStringLit::parse(&*input), expected.clone(), "ByteStringLit::parse");
@@ -148,16 +155,22 @@
 }
 
 #[test]
+fn suffixes() {
+    check!(b"hello", r###"b"hello"suffix"###, false, None, "suffix");
+    check!(b"fox", r#"b"fox"peter"#, false, None, "peter");
+    check!(b"a\x0cb\\", r#"b"a\x0cb\\"_jürgen"#, true, None, "_jürgen");
+    check!(br"a\x0cb\\", r###"br#"a\x0cb\\"#_jürgen"###, false, Some(1), "_jürgen");
+}
+
+#[test]
 fn parse_err() {
     assert_err!(ByteStringLit, r#"b""#, UnterminatedString, None);
     assert_err!(ByteStringLit, r#"b"cat"#, UnterminatedString, None);
     assert_err!(ByteStringLit, r#"b"Jurgen"#, UnterminatedString, None);
     assert_err!(ByteStringLit, r#"b"foo bar baz"#, UnterminatedString, None);
 
-    assert_err!(ByteStringLit, r#"b"fox"peter"#, UnexpectedChar, 6..11);
-    assert_err!(ByteStringLit, r#"b"fox"peter""#, UnexpectedChar, 6..12);
-    assert_err!(ByteStringLit, r#"b"fox"bar"#, UnexpectedChar, 6..9);
-    assert_err!(ByteStringLit, r###"br#"foo "# bar"#"###, UnexpectedChar, 10..16);
+    assert_err!(ByteStringLit, r#"b"fox"peter""#, InvalidSuffix, 6);
+    assert_err!(ByteStringLit, r###"br#"foo "# bar"#"###, UnexpectedChar, 10);
 
     assert_err!(ByteStringLit, "b\"\r\"", IsolatedCr, 2);
     assert_err!(ByteStringLit, "b\"fo\rx\"", IsolatedCr, 4);
@@ -179,10 +192,10 @@
 }
 
 #[test]
-fn invald_escapes() {
+fn invalid_escapes() {
     assert_err!(ByteStringLit, r#"b"\a""#, UnknownEscape, 2..4);
     assert_err!(ByteStringLit, r#"b"foo\y""#, UnknownEscape, 5..7);
-    assert_err!(ByteStringLit, r#"b"\"#, UnterminatedString, None);
+    assert_err!(ByteStringLit, r#"b"\"#, UnterminatedEscape, 2);
     assert_err!(ByteStringLit, r#"b"\x""#, UnterminatedEscape, 2..4);
     assert_err!(ByteStringLit, r#"b"foo\x1""#, UnterminatedEscape, 5..8);
     assert_err!(ByteStringLit, r#"b" \xaj""#, InvalidXEscape, 3..7);
diff --git a/crates/litrs/src/char/mod.rs b/crates/litrs/src/char/mod.rs
index 96d5037..54f6f11 100644
--- a/crates/litrs/src/char/mod.rs
+++ b/crates/litrs/src/char/mod.rs
@@ -4,7 +4,7 @@
     Buffer, ParseError,
     err::{perr, ParseErrorKind::*},
     escape::unescape,
-    parse::first_byte_or_empty,
+    parse::{first_byte_or_empty, check_suffix},
 };
 
 
@@ -16,6 +16,8 @@
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub struct CharLit<B: Buffer> {
     raw: B,
+    /// Start index of the suffix or `raw.len()` if there is no suffix.
+    start_suffix: usize,
     value: char,
 }
 
@@ -25,8 +27,8 @@
     pub fn parse(input: B) -> Result<Self, ParseError> {
         match first_byte_or_empty(&input)? {
             b'\'' => {
-                let value = parse_impl(&input)?;
-                Ok(Self { raw: input, value })
+                let (value, start_suffix) = parse_impl(&input)?;
+                Ok(Self { raw: input, value, start_suffix })
             },
             _ => Err(perr(0, DoesNotStartWithQuote)),
         }
@@ -37,6 +39,11 @@
         self.value
     }
 
+    /// The optional suffix. Returns `""` if the suffix is empty/does not exist.
+    pub fn suffix(&self) -> &str {
+        &(*self.raw)[self.start_suffix..]
+    }
+
     /// Returns the raw input that was passed to `parse`.
     pub fn raw_input(&self) -> &str {
         &self.raw
@@ -55,6 +62,7 @@
     pub fn to_owned(&self) -> CharLit<String> {
         CharLit {
             raw: self.raw.to_owned(),
+            start_suffix: self.start_suffix,
             value: self.value,
         }
     }
@@ -68,31 +76,29 @@
 
 /// Precondition: first character in input must be `'`.
 #[inline(never)]
-pub(crate) fn parse_impl(input: &str) -> Result<char, ParseError> {
-    if input.len() == 1 {
-        return Err(perr(None, UnterminatedCharLiteral));
-    }
-    if *input.as_bytes().last().unwrap() != b'\'' {
-        return Err(perr(None, UnterminatedCharLiteral));
-    }
-
-    let inner = &input[1..input.len() - 1];
-    let first = inner.chars().nth(0).ok_or(perr(None, EmptyCharLiteral))?;
+pub(crate) fn parse_impl(input: &str) -> Result<(char, usize), ParseError> {
+    let first = input.chars().nth(1).ok_or(perr(None, UnterminatedCharLiteral))?;
     let (c, len) = match first {
-        '\'' => return Err(perr(1, UnescapedSingleQuote)),
+        '\'' if input.chars().nth(2) == Some('\'') => return Err(perr(1, UnescapedSingleQuote)),
+        '\'' => return Err(perr(None, EmptyCharLiteral)),
         '\n' | '\t' | '\r'
             => return Err(perr(1, UnescapedSpecialWhitespace)),
 
-        '\\' => unescape::<char>(inner, 1)?,
+        '\\' => unescape::<char>(&input[1..], 1)?,
         other => (other, other.len_utf8()),
     };
-    let rest = &inner[len..];
 
-    if !rest.is_empty() {
-        return Err(perr(len + 1..input.len() - 1, OverlongCharLiteral));
+    match input[1 + len..].find('\'') {
+        Some(0) => {}
+        Some(_) => return Err(perr(None, OverlongCharLiteral)),
+        None => return Err(perr(None, UnterminatedCharLiteral)),
     }
 
-    Ok(c)
+    let start_suffix = 1 + len + 1;
+    let suffix = &input[start_suffix..];
+    check_suffix(suffix).map_err(|kind| perr(start_suffix, kind))?;
+
+    Ok((c, start_suffix))
 }
 
 #[cfg(test)]
diff --git a/crates/litrs/src/char/tests.rs b/crates/litrs/src/char/tests.rs
index bfae5e4..19219db 100644
--- a/crates/litrs/src/char/tests.rs
+++ b/crates/litrs/src/char/tests.rs
@@ -4,16 +4,20 @@
 // ===== Utility functions =======================================================================
 
 macro_rules! check {
-    ($lit:literal) => {
-        let input = stringify!($lit);
+    ($lit:literal) => { check!($lit, stringify!($lit), "") };
+    ($lit:literal, $input:expr, $suffix:literal) => {
+        let input = $input;
         let expected = CharLit {
             raw: input,
+            start_suffix: input.len() - $suffix.len(),
             value: $lit,
         };
 
         assert_parse_ok_eq(input, CharLit::parse(input), expected.clone(), "CharLit::parse");
         assert_parse_ok_eq(input, Literal::parse(input), Literal::Char(expected), "Literal::parse");
-        assert_eq!(CharLit::parse(input).unwrap().value(), $lit);
+        let lit = CharLit::parse(input).unwrap();
+        assert_eq!(lit.value(), $lit);
+        assert_eq!(lit.suffix(), $suffix);
         assert_roundtrip(expected.to_owned(), input);
     };
 }
@@ -135,6 +139,15 @@
 }
 
 #[test]
+fn suffixes() {
+    check!('a', r##"'a'peter"##, "peter");
+    check!('#', r##"'#'peter"##, "peter");
+    check!('\n', r##"'\n'peter"##, "peter");
+    check!('\'', r##"'\''peter"##, "peter");
+    check!('\"', r##"'\"'peter"##, "peter");
+}
+
+#[test]
 fn invald_ascii_escapes() {
     assert_err!(CharLit, r"'\x80'", NonAsciiXEscape, 1..5);
     assert_err!(CharLit, r"'\x81'", NonAsciiXEscape, 1..5);
@@ -151,12 +164,12 @@
 }
 
 #[test]
-fn invald_escapes() {
+fn invalid_escapes() {
     assert_err!(CharLit, r"'\a'", UnknownEscape, 1..3);
     assert_err!(CharLit, r"'\y'", UnknownEscape, 1..3);
-    assert_err!(CharLit, r"'\", UnterminatedCharLiteral, None);
-    assert_err!(CharLit, r"'\x'", UnterminatedEscape, 1..3);
-    assert_err!(CharLit, r"'\x1'", UnterminatedEscape, 1..4);
+    assert_err!(CharLit, r"'\", UnterminatedEscape, 1);
+    assert_err!(CharLit, r"'\x'", UnterminatedEscape, 1..4);
+    assert_err!(CharLit, r"'\x1'", InvalidXEscape, 1..5);
     assert_err!(CharLit, r"'\xaj'", InvalidXEscape, 1..5);
     assert_err!(CharLit, r"'\xjb'", InvalidXEscape, 1..5);
 }
@@ -167,10 +180,10 @@
     assert_err!(CharLit, r"'\u '", UnicodeEscapeWithoutBrace, 1..3);
     assert_err!(CharLit, r"'\u3'", UnicodeEscapeWithoutBrace, 1..3);
 
-    assert_err!(CharLit, r"'\u{'", UnterminatedUnicodeEscape, 1..4);
-    assert_err!(CharLit, r"'\u{12'", UnterminatedUnicodeEscape, 1..6);
-    assert_err!(CharLit, r"'\u{a0b'", UnterminatedUnicodeEscape, 1..7);
-    assert_err!(CharLit, r"'\u{a0_b  '", UnterminatedUnicodeEscape, 1..10);
+    assert_err!(CharLit, r"'\u{'", UnterminatedUnicodeEscape, 1..5);
+    assert_err!(CharLit, r"'\u{12'", UnterminatedUnicodeEscape, 1..7);
+    assert_err!(CharLit, r"'\u{a0b'", UnterminatedUnicodeEscape, 1..8);
+    assert_err!(CharLit, r"'\u{a0_b  '", UnterminatedUnicodeEscape, 1..11);
 
     assert_err!(CharLit, r"'\u{_}'", InvalidStartOfUnicodeEscape, 4);
     assert_err!(CharLit, r"'\u{_5f}'", InvalidStartOfUnicodeEscape, 4);
@@ -192,16 +205,16 @@
 #[test]
 fn parse_err() {
     assert_err!(CharLit, r"''", EmptyCharLiteral, None);
-    assert_err!(CharLit, r"' ''", OverlongCharLiteral, 2..3);
+    assert_err!(CharLit, r"' ''", UnexpectedChar, 3);
 
     assert_err!(CharLit, r"'", UnterminatedCharLiteral, None);
     assert_err!(CharLit, r"'a", UnterminatedCharLiteral, None);
     assert_err!(CharLit, r"'\n", UnterminatedCharLiteral, None);
     assert_err!(CharLit, r"'\x35", UnterminatedCharLiteral, None);
 
-    assert_err!(CharLit, r"'ab'", OverlongCharLiteral, 2..3);
-    assert_err!(CharLit, r"'a _'", OverlongCharLiteral, 2..4);
-    assert_err!(CharLit, r"'\n3'", OverlongCharLiteral, 3..4);
+    assert_err!(CharLit, r"'ab'", OverlongCharLiteral, None);
+    assert_err!(CharLit, r"'a _'", OverlongCharLiteral, None);
+    assert_err!(CharLit, r"'\n3'", OverlongCharLiteral, None);
 
     assert_err!(CharLit, r"", Empty, None);
 
diff --git a/crates/litrs/src/err.rs b/crates/litrs/src/err.rs
index 1011550..86d51dc 100644
--- a/crates/litrs/src/err.rs
+++ b/crates/litrs/src/err.rs
@@ -221,13 +221,6 @@
     /// Integer literal does not contain any valid digits.
     NoDigits,
 
-    /// Found a integer type suffix that is invalid.
-    InvalidIntegerTypeSuffix,
-
-    /// Found a float type suffix that is invalid. Only `f32` and `f64` are
-    /// valid.
-    InvalidFloatTypeSuffix,
-
     /// Exponent of a float literal does not contain any digits.
     NoExponentDigits,
 
@@ -309,6 +302,17 @@
     /// An literal `\r` character not followed by a `\n` character in a
     /// (raw) string or byte string literal.
     IsolatedCr,
+
+    /// Literal suffix is not a valid identifier.
+    InvalidSuffix,
+
+    /// Returned by `Float::parse` if an integer literal (no fractional nor
+    /// exponent part) is passed.
+    UnexpectedIntegerLit,
+
+    /// Integer suffixes cannot start with `e` or `E` as this conflicts with the
+    /// grammar for float literals.
+    IntegerSuffixStartingWithE,
 }
 
 impl std::error::Error for ParseError {}
@@ -324,8 +328,6 @@
             DoesNotStartWithDigit => "number literal does not start with decimal digit",
             InvalidDigit => "integer literal contains a digit invalid for its base",
             NoDigits => "integer literal does not contain any digits",
-            InvalidIntegerTypeSuffix => "invalid integer type suffix",
-            InvalidFloatTypeSuffix => "invalid floating point type suffix",
             NoExponentDigits => "exponent of floating point literal does not contain any digits",
             UnknownEscape => "unknown escape",
             UnterminatedEscape => "unterminated escape: input ended too soon",
@@ -354,6 +356,9 @@
             InvalidByteLiteralStart => "invalid start for byte literal",
             InvalidByteStringLiteralStart => "invalid start for byte string literal",
             IsolatedCr => r"`\r` not immediately followed by `\n` in string",
+            InvalidSuffix => "literal suffix is not a valid identifier",
+            UnexpectedIntegerLit => "expected float literal, but found integer",
+            IntegerSuffixStartingWithE => "integer literal suffix must not start with 'e' or 'E'",
         };
 
         description.fmt(f)?;
diff --git a/crates/litrs/src/escape.rs b/crates/litrs/src/escape.rs
index 19b63a1..5eb8382 100644
--- a/crates/litrs/src/escape.rs
+++ b/crates/litrs/src/escape.rs
@@ -1,4 +1,4 @@
-use crate::{ParseError, err::{perr, ParseErrorKind::*}, parse::hex_digit_value};
+use crate::{ParseError, err::{perr, ParseErrorKind::*}, parse::{hex_digit_value, check_suffix}};
 
 
 /// Must start with `\`
@@ -117,14 +117,15 @@
 pub(crate) fn unescape_string<E: Escapee>(
     input: &str,
     offset: usize,
-) -> Result<Option<String>, ParseError> {
+) -> Result<(Option<String>, usize), ParseError> {
+    let mut closing_quote_pos = None;
     let mut i = offset;
     let mut end_last_escape = offset;
     let mut value = String::new();
-    while i < input.len() - 1 {
+    while i < input.len() {
         match input.as_bytes()[i] {
             // Handle "string continue".
-            b'\\' if input.as_bytes()[i + 1] == b'\n' => {
+            b'\\' if input.as_bytes().get(i + 1) == Some(&b'\n') => {
                 value.push_str(&input[end_last_escape..i]);
 
                 // Find the first non-whitespace character.
@@ -143,7 +144,7 @@
                 end_last_escape = i;
             }
             b'\r' => {
-                if input.as_bytes()[i + 1] == b'\n' {
+                if input.as_bytes().get(i + 1) == Some(&b'\n') {
                     value.push_str(&input[end_last_escape..i]);
                     value.push('\n');
                     i += 2;
@@ -152,16 +153,21 @@
                     return Err(perr(i, IsolatedCr))
                 }
             }
-            b'"' => return Err(perr(i + 1..input.len(), UnexpectedChar)),
+            b'"' => {
+                closing_quote_pos = Some(i);
+                break;
+            },
             b if !E::SUPPORTS_UNICODE && !b.is_ascii()
                 => return Err(perr(i, NonAsciiInByteLiteral)),
             _ => i += 1,
         }
     }
 
-    if input.as_bytes()[input.len() - 1] != b'"' || input.len() == offset {
-        return Err(perr(None, UnterminatedString));
-    }
+    let closing_quote_pos = closing_quote_pos.ok_or(perr(None, UnterminatedString))?;
+
+    let start_suffix = closing_quote_pos + 1;
+    let suffix = &input[start_suffix..];
+    check_suffix(suffix).map_err(|kind| perr(start_suffix, kind))?;
 
     // `value` is only empty if there was no escape in the input string
     // (with the special case of the input being empty). This means the
@@ -171,11 +177,11 @@
     } else {
         // There was an escape in the string, so we need to push the
         // remaining unescaped part of the string still.
-        value.push_str(&input[end_last_escape..input.len() - 1]);
+        value.push_str(&input[end_last_escape..closing_quote_pos]);
         Some(value)
     };
 
-    Ok(value)
+    Ok((value, start_suffix))
 }
 
 /// Reads and checks a raw (byte) string literal, converting `\r\n` sequences to
@@ -185,7 +191,7 @@
 pub(crate) fn scan_raw_string<E: Escapee>(
     input: &str,
     offset: usize,
-) -> Result<(Option<String>, u32), ParseError> {
+) -> Result<(Option<String>, u32, usize), ParseError> {
     // Raw string literal
     let num_hashes = input[offset..].bytes().position(|b| b != b'#')
         .ok_or(perr(None, InvalidLiteral))?;
@@ -234,12 +240,11 @@
         i += 1;
     }
 
-    let closing_quote_pos = closing_quote_pos
-        .ok_or(perr(None, UnterminatedRawString))?;
+    let closing_quote_pos = closing_quote_pos.ok_or(perr(None, UnterminatedRawString))?;
 
-    if closing_quote_pos + num_hashes != input.len() - 1 {
-        return Err(perr(closing_quote_pos + num_hashes + 1..input.len(), UnexpectedChar));
-    }
+    let start_suffix = closing_quote_pos + num_hashes + 1;
+    let suffix = &input[start_suffix..];
+    check_suffix(suffix).map_err(|kind| perr(start_suffix, kind))?;
 
     // `value` is only empty if there was no \r\n in the input string (with the
     // special case of the input being empty). This means the string value
@@ -253,5 +258,5 @@
         Some(value)
     };
 
-    Ok((value, num_hashes as u32))
+    Ok((value, num_hashes as u32, start_suffix))
 }
diff --git a/crates/litrs/src/float/mod.rs b/crates/litrs/src/float/mod.rs
index b196845..0518633 100644
--- a/crates/litrs/src/float/mod.rs
+++ b/crates/litrs/src/float/mod.rs
@@ -1,21 +1,22 @@
-use std::fmt;
+use std::{fmt, str::FromStr};
 
 use crate::{
     Buffer, ParseError,
     err::{perr, ParseErrorKind::*},
-    parse::{end_dec_digits, first_byte_or_empty},
+    parse::{end_dec_digits, first_byte_or_empty, check_suffix},
 };
 
 
 
-/// A floating point literal, e.g. `3.14`, `8.`, `135e12`, `27f32` or `1.956e2f64`.
+/// A floating point literal, e.g. `3.14`, `8.`, `135e12`, or `1.956e2f64`.
 ///
 /// This kind of literal has several forms, but generally consists of a main
 /// number part, an optional exponent and an optional type suffix. See
 /// [the reference][ref] for more information.
 ///
 /// A leading minus sign `-` is not part of the literal grammar! `-3.14` are two
-/// tokens in the Rust grammar.
+/// tokens in the Rust grammar. Further, `27` and `27f32` are both not float,
+/// but integer literals! Consequently `FloatLit::parse` will reject them.
 ///
 ///
 /// [ref]: https://doc.rust-lang.org/reference/tokens.html#floating-point-literals
@@ -52,21 +53,13 @@
 
     /// The first index after the whole number part (everything except type suffix).
     end_number_part: usize,
-
-    /// Optional type suffix.
-    type_suffix: Option<FloatType>,
-}
-
-/// All possible float type suffixes.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum FloatType {
-    F32,
-    F64,
 }
 
 impl<B: Buffer> FloatLit<B> {
     /// Parses the input as a floating point literal. Returns an error if the
-    /// input is invalid or represents a different kind of literal.
+    /// input is invalid or represents a different kind of literal. Will also
+    /// reject decimal integer literals like `23` or `17f32`, in accordance
+    /// with the spec.
     pub fn parse(s: B) -> Result<Self, ParseError> {
         match first_byte_or_empty(&s)? {
             b'0'..=b'9' => {
@@ -75,26 +68,19 @@
                     end_integer_part,
                     end_fractional_part,
                     end_number_part,
-                    type_suffix,
                     ..
                 } = parse_impl(&s)?;
 
-                Ok(Self {
-                    raw: s,
-                    end_integer_part,
-                    end_fractional_part,
-                    end_number_part,
-                    type_suffix,
-                })
+                Ok(Self { raw: s, end_integer_part, end_fractional_part, end_number_part })
             },
             _ => Err(perr(0, DoesNotStartWithDigit)),
         }
     }
 
-    /// Returns the whole number part (including integer part, fractional part
-    /// and exponent), but without the type suffix. If you want an actual
-    /// floating point value, you need to parse this string, e.g. with
-    /// `f32::from_str` or an external crate.
+    /// Returns the number part (including integer part, fractional part and
+    /// exponent), but without the suffix. If you want an actual floating
+    /// point value, you need to parse this string, e.g. with `f32::from_str`
+    /// or an external crate.
     pub fn number_part(&self) -> &str {
         &(*self.raw)[..self.end_number_part]
     }
@@ -121,9 +107,9 @@
         &(*self.raw)[self.end_fractional_part..self.end_number_part]
     }
 
-    /// The optional type suffix.
-    pub fn type_suffix(&self) -> Option<FloatType> {
-        self.type_suffix
+    /// The optional suffix. Returns `""` if the suffix is empty/does not exist.
+    pub fn suffix(&self) -> &str {
+        &(*self.raw)[self.end_number_part..]
     }
 
     /// Returns the raw input that was passed to `parse`.
@@ -146,7 +132,6 @@
             end_integer_part: self.end_integer_part,
             end_fractional_part: self.end_fractional_part,
             end_number_part: self.end_number_part,
-            type_suffix: self.type_suffix,
         }
     }
 }
@@ -184,7 +169,6 @@
         return Err(perr(end_integer_part + 1, UnexpectedChar));
     }
 
-
     // Optional exponent.
     let end_number_part = if rest.starts_with('e') || rest.starts_with('E') {
         // Strip single - or + sign at the beginning.
@@ -207,23 +191,67 @@
         end_fractional_part
     };
 
+    // Make sure the suffix is valid.
+    let suffix = &input[end_number_part..];
+    check_suffix(suffix).map_err(|kind| perr(end_number_part..input.len(), kind))?;
 
-    // Type suffix
-    let type_suffix = match &input[end_number_part..] {
-        "" => None,
-        "f32" => Some(FloatType::F32),
-        "f64" => Some(FloatType::F64),
-        _ => return Err(perr(end_number_part..input.len(), InvalidFloatTypeSuffix)),
-    };
+    // A float literal needs either a fractional or exponent part, otherwise its
+    // an integer literal.
+    if end_integer_part == end_number_part {
+        return Err(perr(None, UnexpectedIntegerLit));
+    }
 
     Ok(FloatLit {
         raw: input,
         end_integer_part,
         end_fractional_part,
         end_number_part,
-        type_suffix,
     })
 }
 
+
+/// All possible float type suffixes.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[non_exhaustive]
+pub enum FloatType {
+    F32,
+    F64,
+}
+
+impl FloatType {
+    /// Returns the type corresponding to the given suffix (e.g. `"f32"` is
+    /// mapped to `Self::F32`). If the suffix is not a valid float type, `None`
+    /// is returned.
+    pub fn from_suffix(suffix: &str) -> Option<Self> {
+        match suffix {
+            "f32" => Some(FloatType::F32),
+            "f64" => Some(FloatType::F64),
+            _ => None,
+        }
+    }
+
+    /// Returns the suffix for this type, e.g. `"f32"` for `Self::F32`.
+    pub fn suffix(self) -> &'static str {
+        match self {
+            Self::F32 => "f32",
+            Self::F64 => "f64",
+        }
+    }
+}
+
+impl FromStr for FloatType {
+    type Err = ();
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        Self::from_suffix(s).ok_or(())
+    }
+}
+
+impl fmt::Display for FloatType {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.suffix().fmt(f)
+    }
+}
+
+
 #[cfg(test)]
 mod tests;
diff --git a/crates/litrs/src/float/tests.rs b/crates/litrs/src/float/tests.rs
index f15af05..f22443b 100644
--- a/crates/litrs/src/float/tests.rs
+++ b/crates/litrs/src/float/tests.rs
@@ -20,18 +20,18 @@
             end_integer_part: $intpart.len(),
             end_fractional_part: $intpart.len() + $fracpart.len(),
             end_number_part: $intpart.len() + $fracpart.len() + $exppart.len(),
-            type_suffix: check!(@ty $suffix),
         };
 
         assert_parse_ok_eq(
             input, FloatLit::parse(input), expected_float.clone(), "FloatLit::parse");
         assert_parse_ok_eq(
             input, Literal::parse(input), Literal::Float(expected_float), "Literal::parse");
+        assert_eq!(FloatLit::parse(input).unwrap().suffix(), check!(@ty $suffix));
         assert_roundtrip(expected_float.to_owned(), input);
     };
-    (@ty f32) => { Some(FloatType::F32) };
-    (@ty f64) => { Some(FloatType::F64) };
-    (@ty -) => { None };
+    (@ty f32) => { "f32" };
+    (@ty f64) => { "f64" };
+    (@ty -) => { "" };
     (@stringify_suffix -) => { "" };
     (@stringify_suffix $suffix:ident) => { stringify!($suffix) };
 }
@@ -46,42 +46,42 @@
     assert_eq!(f.integer_part(), "3");
     assert_eq!(f.fractional_part(), Some("14"));
     assert_eq!(f.exponent_part(), "");
-    assert_eq!(f.type_suffix(), None);
+    assert_eq!(f.suffix(), "");
 
     let f = FloatLit::parse("9.")?;
     assert_eq!(f.number_part(), "9.");
     assert_eq!(f.integer_part(), "9");
     assert_eq!(f.fractional_part(), Some(""));
     assert_eq!(f.exponent_part(), "");
-    assert_eq!(f.type_suffix(), None);
+    assert_eq!(f.suffix(), "");
 
     let f = FloatLit::parse("8e1")?;
     assert_eq!(f.number_part(), "8e1");
     assert_eq!(f.integer_part(), "8");
     assert_eq!(f.fractional_part(), None);
     assert_eq!(f.exponent_part(), "e1");
-    assert_eq!(f.type_suffix(), None);
+    assert_eq!(f.suffix(), "");
 
     let f = FloatLit::parse("8E3")?;
     assert_eq!(f.number_part(), "8E3");
     assert_eq!(f.integer_part(), "8");
     assert_eq!(f.fractional_part(), None);
     assert_eq!(f.exponent_part(), "E3");
-    assert_eq!(f.type_suffix(), None);
+    assert_eq!(f.suffix(), "");
 
     let f = FloatLit::parse("8_7_6.1_23e15")?;
     assert_eq!(f.number_part(), "8_7_6.1_23e15");
     assert_eq!(f.integer_part(), "8_7_6");
     assert_eq!(f.fractional_part(), Some("1_23"));
     assert_eq!(f.exponent_part(), "e15");
-    assert_eq!(f.type_suffix(), None);
+    assert_eq!(f.suffix(), "");
 
     let f = FloatLit::parse("8.2e-_04_9")?;
     assert_eq!(f.number_part(), "8.2e-_04_9");
     assert_eq!(f.integer_part(), "8");
     assert_eq!(f.fractional_part(), Some("2"));
     assert_eq!(f.exponent_part(), "e-_04_9");
-    assert_eq!(f.type_suffix(), None);
+    assert_eq!(f.suffix(), "");
 
     Ok(())
 }
@@ -93,28 +93,28 @@
     assert_eq!(f.integer_part(), "3");
     assert_eq!(f.fractional_part(), Some("14"));
     assert_eq!(f.exponent_part(), "");
-    assert_eq!(f.type_suffix(), Some(FloatType::F32));
+    assert_eq!(FloatType::from_suffix(f.suffix()), Some(FloatType::F32));
 
     let f = FloatLit::parse("8e1f64")?;
     assert_eq!(f.number_part(), "8e1");
     assert_eq!(f.integer_part(), "8");
     assert_eq!(f.fractional_part(), None);
     assert_eq!(f.exponent_part(), "e1");
-    assert_eq!(f.type_suffix(), Some(FloatType::F64));
+    assert_eq!(FloatType::from_suffix(f.suffix()), Some(FloatType::F64));
 
     let f = FloatLit::parse("8_7_6.1_23e15f32")?;
     assert_eq!(f.number_part(), "8_7_6.1_23e15");
     assert_eq!(f.integer_part(), "8_7_6");
     assert_eq!(f.fractional_part(), Some("1_23"));
     assert_eq!(f.exponent_part(), "e15");
-    assert_eq!(f.type_suffix(), Some(FloatType::F32));
+    assert_eq!(FloatType::from_suffix(f.suffix()), Some(FloatType::F32));
 
     let f = FloatLit::parse("8.2e-_04_9f64")?;
     assert_eq!(f.number_part(), "8.2e-_04_9");
     assert_eq!(f.integer_part(), "8");
     assert_eq!(f.fractional_part(), Some("2"));
     assert_eq!(f.exponent_part(), "e-_04_9");
-    assert_eq!(f.type_suffix(), Some(FloatType::F64));
+    assert_eq!(FloatType::from_suffix(f.suffix()), Some(FloatType::F64));
 
     Ok(())
 }
@@ -125,7 +125,6 @@
     check!("3" ".14" "" f32);
     check!("3" ".14" "" f64);
 
-    check!("3" "" "" f32);
     check!("3" "" "e987654321" -);
     check!("3" "" "e987654321" f64);
 
@@ -158,6 +157,47 @@
 }
 
 #[test]
+fn non_standard_suffixes() {
+    #[track_caller]
+    fn check_suffix(
+        input: &str,
+        integer_part: &str,
+        fractional_part: Option<&str>,
+        exponent_part: &str,
+        suffix: &str,
+    ) {
+        let lit = FloatLit::parse(input)
+            .unwrap_or_else(|e| panic!("expected to parse '{}' but got {}", input, e));
+        assert_eq!(lit.integer_part(), integer_part);
+        assert_eq!(lit.fractional_part(), fractional_part);
+        assert_eq!(lit.exponent_part(), exponent_part);
+        assert_eq!(lit.suffix(), suffix);
+
+        let lit = match Literal::parse(input) {
+            Ok(Literal::Float(f)) => f,
+            other => panic!("Expected float literal, but got {:?} for '{}'", other, input),
+        };
+        assert_eq!(lit.integer_part(), integer_part);
+        assert_eq!(lit.fractional_part(), fractional_part);
+        assert_eq!(lit.exponent_part(), exponent_part);
+        assert_eq!(lit.suffix(), suffix);
+    }
+
+    check_suffix("7.1f23", "7", Some("1"), "", "f23");
+    check_suffix("7.1f320", "7", Some("1"), "", "f320");
+    check_suffix("7.1f64_", "7", Some("1"), "", "f64_");
+    check_suffix("8.1f649", "8", Some("1"), "", "f649");
+    check_suffix("8.1f64f32", "8", Some("1"), "", "f64f32");
+    check_suffix("23e2_banana", "23", None, "e2_", "banana");
+    check_suffix("23.2_banana", "23", Some("2_"), "", "banana");
+    check_suffix("23e2pe55ter", "23", None, "e2", "pe55ter");
+    check_suffix("23e2p_e55ter", "23", None, "e2", "p_e55ter");
+    check_suffix("3.15Jürgen", "3", Some("15"), "", "Jürgen");
+    check_suffix("3e2e5", "3", None, "e2", "e5");
+    check_suffix("3e2e5f", "3", None, "e2", "e5f");
+}
+
+#[test]
 fn parse_err() {
     assert_err!(FloatLit, "", Empty, None);
     assert_err_single!(FloatLit::parse("."), DoesNotStartWithDigit, 0);
@@ -176,10 +216,11 @@
 
     assert_err_single!(FloatLit::parse("_2.7"), DoesNotStartWithDigit, 0);
     assert_err_single!(FloatLit::parse(".5"), DoesNotStartWithDigit, 0);
-    assert_err_single!(FloatLit::parse("0x44.5"), InvalidFloatTypeSuffix, 1..6);
     assert_err!(FloatLit, "1e", NoExponentDigits, 1..2);
     assert_err!(FloatLit, "1.e4", UnexpectedChar, 2);
     assert_err!(FloatLit, "3._4", UnexpectedChar, 2);
+    assert_err!(FloatLit, "3.f32", UnexpectedChar, 2);
+    assert_err!(FloatLit, "3.e5", UnexpectedChar, 2);
     assert_err!(FloatLit, "12345._987", UnexpectedChar, 6);
     assert_err!(FloatLit, "46._", UnexpectedChar, 3);
     assert_err!(FloatLit, "46.f32", UnexpectedChar, 3);
@@ -188,19 +229,25 @@
     assert_err!(FloatLit, "46.e3f64", UnexpectedChar, 3);
     assert_err!(FloatLit, "23.4e_", NoExponentDigits, 4..6);
     assert_err!(FloatLit, "23E___f32", NoExponentDigits, 2..6);
-    assert_err!(FloatLit, "7f23", InvalidFloatTypeSuffix, 1..4);
-    assert_err!(FloatLit, "7f320", InvalidFloatTypeSuffix, 1..5);
-    assert_err!(FloatLit, "7f64_", InvalidFloatTypeSuffix, 1..5);
-    assert_err!(FloatLit, "8f649", InvalidFloatTypeSuffix, 1..5);
-    assert_err!(FloatLit, "8f64f32", InvalidFloatTypeSuffix, 1..7);
-    assert_err!(FloatLit, "55e3.1", InvalidFloatTypeSuffix, 4..6);  // suboptimal
+    assert_err!(FloatLit, "55e3.1", UnexpectedChar, 4..6);
 
-    assert_err!(FloatLit, "3.7+", InvalidFloatTypeSuffix, 3..4);
-    assert_err!(FloatLit, "3.7+2", InvalidFloatTypeSuffix, 3..5);
-    assert_err!(FloatLit, "3.7-", InvalidFloatTypeSuffix, 3..4);
-    assert_err!(FloatLit, "3.7-2", InvalidFloatTypeSuffix, 3..5);
+    assert_err!(FloatLit, "3.7+", UnexpectedChar, 3..4);
+    assert_err!(FloatLit, "3.7+2", UnexpectedChar, 3..5);
+    assert_err!(FloatLit, "3.7-", UnexpectedChar, 3..4);
+    assert_err!(FloatLit, "3.7-2", UnexpectedChar, 3..5);
     assert_err!(FloatLit, "3.7e+", NoExponentDigits, 3..5);
     assert_err!(FloatLit, "3.7e-", NoExponentDigits, 3..5);
-    assert_err!(FloatLit, "3.7e-+3", NoExponentDigits, 3..5);  // suboptimal
-    assert_err!(FloatLit, "3.7e+-3", NoExponentDigits, 3..5);  // suboptimal
+    assert_err!(FloatLit, "3.7e-+3", NoExponentDigits, 3..5);  // suboptimal error
+    assert_err!(FloatLit, "3.7e+-3", NoExponentDigits, 3..5);  // suboptimal error
+    assert_err_single!(FloatLit::parse("0x44.5"), InvalidSuffix, 1..6);
+
+    assert_err_single!(FloatLit::parse("3"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("35_389"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("9_8_7f32"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("9_8_7banana"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("7f23"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("7f320"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("7f64_"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("8f649"), UnexpectedIntegerLit, None);
+    assert_err_single!(FloatLit::parse("8f64f32"), UnexpectedIntegerLit, None);
 }
diff --git a/crates/litrs/src/integer/mod.rs b/crates/litrs/src/integer/mod.rs
index 79f7e55..cecd79d 100644
--- a/crates/litrs/src/integer/mod.rs
+++ b/crates/litrs/src/integer/mod.rs
@@ -1,9 +1,9 @@
-use std::fmt;
+use std::{fmt, str::FromStr};
 
 use crate::{
     Buffer, ParseError,
     err::{perr, ParseErrorKind::*},
-    parse::{first_byte_or_empty, hex_digit_value},
+    parse::{first_byte_or_empty, hex_digit_value, check_suffix},
 };
 
 
@@ -25,52 +25,14 @@
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 #[non_exhaustive]
 pub struct IntegerLit<B: Buffer> {
+    /// The raw literal. Grammar: `<prefix?><main part><suffix?>`.
     raw: B,
-    // First index of the main number part (after the base prefix).
+    /// First index of the main number part (after the base prefix).
     start_main_part: usize,
-    // First index not part of the main number part.
+    /// First index not part of the main number part.
     end_main_part: usize,
+    /// Parsed `raw[..start_main_part]`.
     base: IntegerBase,
-    type_suffix: Option<IntegerType>,
-}
-
-/// The bases in which an integer can be specified.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum IntegerBase {
-    Binary,
-    Octal,
-    Decimal,
-    Hexadecimal,
-}
-
-/// All possible integer type suffixes.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum IntegerType {
-    U8,
-    U16,
-    U32,
-    U64,
-    U128,
-    Usize,
-    I8,
-    I16,
-    I32,
-    I64,
-    I128,
-    Isize,
-}
-
-impl IntegerBase {
-    /// Returns the literal prefix that indicates this base, i.e. `"0b"`,
-    /// `"0o"`, `""` and `"0x"`.
-    pub fn prefix(self) -> &'static str {
-        match self {
-            Self::Binary => "0b",
-            Self::Octal => "0o",
-            Self::Decimal => "",
-            Self::Hexadecimal => "0x",
-        }
-    }
 }
 
 impl<B: Buffer> IntegerLit<B> {
@@ -84,17 +46,10 @@
                     start_main_part,
                     end_main_part,
                     base,
-                    type_suffix,
                     ..
                 } =  parse_impl(&input, digit)?;
 
-                Ok(Self {
-                    raw: input,
-                    start_main_part,
-                    end_main_part,
-                    base,
-                    type_suffix,
-                })
+                Ok(Self { raw: input, start_main_part, end_main_part, base })
             },
             _ => Err(perr(0, DoesNotStartWithDigit)),
         }
@@ -105,13 +60,15 @@
     /// method**. This means `N` does not need to match the type suffix!
     ///
     /// Returns `None` if the literal overflows `N`.
+    ///
+    /// Hint: `u128` can represent all possible values integer literal values,
+    /// as there are no negative literals (see type docs). Thus you can, for
+    /// example, safely use `lit.value::<u128>().to_string()` to get a decimal
+    /// string. (Technically, Rust integer literals can represent arbitrarily
+    /// large numbers, but those would be rejected at a later stage by the Rust
+    /// compiler).
     pub fn value<N: FromIntegerLiteral>(&self) -> Option<N> {
-        let base = match self.base {
-            IntegerBase::Binary => N::from_small_number(2),
-            IntegerBase::Octal => N::from_small_number(8),
-            IntegerBase::Decimal => N::from_small_number(10),
-            IntegerBase::Hexadecimal => N::from_small_number(16),
-        };
+        let base = N::from_small_number(self.base.value());
 
         let mut acc = N::from_small_number(0);
         for digit in self.raw_main_part().bytes() {
@@ -142,9 +99,11 @@
         &(*self.raw)[self.start_main_part..self.end_main_part]
     }
 
-    /// The type suffix, if specified.
-    pub fn type_suffix(&self) -> Option<IntegerType> {
-        self.type_suffix
+    /// The optional suffix. Returns `""` if the suffix is empty/does not exist.
+    ///
+    /// If you want the type, try `IntegerType::from_suffix(lit.suffix())`.
+    pub fn suffix(&self) -> &str {
+        &(*self.raw)[self.end_main_part..]
     }
 
     /// Returns the raw input that was passed to `parse`.
@@ -167,7 +126,6 @@
             start_main_part: self.start_main_part,
             end_main_part: self.end_main_part,
             base: self.base,
-            type_suffix: self.type_suffix,
         }
     }
 }
@@ -248,59 +206,151 @@
     };
     let without_prefix = &input[end_prefix..];
 
-    // Find end of main part.
-    let end_main = without_prefix.bytes()
-            .position(|b| !matches!(b, b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F' | b'_'))
-            .unwrap_or(without_prefix.len());
-    let (main_part, type_suffix) = without_prefix.split_at(end_main);
 
-    // Check for invalid digits and make sure there is at least one valid digit.
-    let invalid_digit_pos = match base {
-        IntegerBase::Binary => main_part.bytes()
-            .position(|b| !matches!(b, b'0' | b'1' | b'_')),
-        IntegerBase::Octal => main_part.bytes()
-            .position(|b| !matches!(b, b'0'..=b'7' | b'_')),
-        IntegerBase::Decimal => main_part.bytes()
-            .position(|b| !matches!(b, b'0'..=b'9' | b'_')),
-        IntegerBase::Hexadecimal => None,
+    // Scan input to find the first character that's not a valid digit.
+    let is_valid_digit = match base {
+        IntegerBase::Binary => |b| matches!(b, b'0' | b'1' | b'_'),
+        IntegerBase::Octal => |b| matches!(b, b'0'..=b'7' | b'_'),
+        IntegerBase::Decimal => |b| matches!(b, b'0'..=b'9' | b'_'),
+        IntegerBase::Hexadecimal => |b| matches!(b, b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F' | b'_'),
     };
+    let end_main = without_prefix.bytes()
+        .position(|b| !is_valid_digit(b))
+        .unwrap_or(without_prefix.len());
+    let (main_part, suffix) = without_prefix.split_at(end_main);
 
-    if let Some(pos) = invalid_digit_pos {
-        return Err(perr(end_prefix + pos, InvalidDigit));
+    check_suffix(suffix).map_err(|kind| {
+        // This is just to have a nicer error kind for this special case. If the
+        // suffix is invalid, it is non-empty -> unwrap ok.
+        let first = suffix.as_bytes()[0];
+        if !is_valid_digit(first) && first.is_ascii_digit() {
+            perr(end_main + end_prefix, InvalidDigit)
+        } else {
+            perr(end_main + end_prefix..input.len(), kind)
+        }
+    })?;
+    if suffix.starts_with('e') || suffix.starts_with('E') {
+        return Err(perr(end_main, IntegerSuffixStartingWithE));
     }
 
+    // Make sure main number part is not empty.
     if main_part.bytes().filter(|&b| b != b'_').count() == 0 {
         return Err(perr(end_prefix..end_prefix + end_main, NoDigits));
     }
 
-
-    // Parse type suffix
-    let type_suffix = match type_suffix {
-        "" => None,
-        "u8" => Some(IntegerType::U8),
-        "u16" => Some(IntegerType::U16),
-        "u32" => Some(IntegerType::U32),
-        "u64" => Some(IntegerType::U64),
-        "u128" => Some(IntegerType::U128),
-        "usize" => Some(IntegerType::Usize),
-        "i8" => Some(IntegerType::I8),
-        "i16" => Some(IntegerType::I16),
-        "i32" => Some(IntegerType::I32),
-        "i64" => Some(IntegerType::I64),
-        "i128" => Some(IntegerType::I128),
-        "isize" => Some(IntegerType::Isize),
-        _ => return Err(perr(end_main + end_prefix..input.len(), InvalidIntegerTypeSuffix)),
-    };
-
     Ok(IntegerLit {
         raw: input,
         start_main_part: end_prefix,
         end_main_part: end_main + end_prefix,
         base,
-        type_suffix,
     })
 }
 
 
+/// The bases in which an integer can be specified.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum IntegerBase {
+    Binary,
+    Octal,
+    Decimal,
+    Hexadecimal,
+}
+
+impl IntegerBase {
+    /// Returns the literal prefix that indicates this base, i.e. `"0b"`,
+    /// `"0o"`, `""` and `"0x"`.
+    pub fn prefix(self) -> &'static str {
+        match self {
+            Self::Binary => "0b",
+            Self::Octal => "0o",
+            Self::Decimal => "",
+            Self::Hexadecimal => "0x",
+        }
+    }
+
+    /// Returns the base value, i.e. 2, 8, 10 or 16.
+    pub fn value(self) -> u8 {
+        match self {
+            Self::Binary => 2,
+            Self::Octal => 8,
+            Self::Decimal => 10,
+            Self::Hexadecimal => 16,
+        }
+    }
+}
+
+/// All possible integer type suffixes.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[non_exhaustive]
+pub enum IntegerType {
+    U8,
+    U16,
+    U32,
+    U64,
+    U128,
+    Usize,
+    I8,
+    I16,
+    I32,
+    I64,
+    I128,
+    Isize,
+}
+
+impl IntegerType {
+    /// Returns the type corresponding to the given suffix (e.g. `"u8"` is
+    /// mapped to `Self::U8`). If the suffix is not a valid integer type,
+    /// `None` is returned.
+    pub fn from_suffix(suffix: &str) -> Option<Self> {
+        match suffix {
+            "u8" => Some(Self::U8),
+            "u16" => Some(Self::U16),
+            "u32" => Some(Self::U32),
+            "u64" => Some(Self::U64),
+            "u128" => Some(Self::U128),
+            "usize" => Some(Self::Usize),
+            "i8" => Some(Self::I8),
+            "i16" => Some(Self::I16),
+            "i32" => Some(Self::I32),
+            "i64" => Some(Self::I64),
+            "i128" => Some(Self::I128),
+            "isize" => Some(Self::Isize),
+            _ => None,
+        }
+    }
+
+    /// Returns the suffix for this type, e.g. `"u8"` for `Self::U8`.
+    pub fn suffix(self) -> &'static str {
+        match self {
+            Self::U8 => "u8",
+            Self::U16 => "u16",
+            Self::U32 => "u32",
+            Self::U64 => "u64",
+            Self::U128 => "u128",
+            Self::Usize => "usize",
+            Self::I8 => "i8",
+            Self::I16 => "i16",
+            Self::I32 => "i32",
+            Self::I64 => "i64",
+            Self::I128 => "i128",
+            Self::Isize => "isize",
+        }
+    }
+}
+
+impl FromStr for IntegerType {
+    type Err = ();
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        Self::from_suffix(s).ok_or(())
+    }
+}
+
+impl fmt::Display for IntegerType {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.suffix().fmt(f)
+    }
+}
+
+
 #[cfg(test)]
 mod tests;
diff --git a/crates/litrs/src/integer/tests.rs b/crates/litrs/src/integer/tests.rs
index 1656345..e6dad3f 100644
--- a/crates/litrs/src/integer/tests.rs
+++ b/crates/litrs/src/integer/tests.rs
@@ -20,13 +20,13 @@
         start_main_part: base.prefix().len(),
         end_main_part: base.prefix().len() + main_part.len(),
         base,
-        type_suffix
     };
     assert_parse_ok_eq(
         input, IntegerLit::parse(input), expected_integer.clone(), "IntegerLit::parse");
     assert_parse_ok_eq(
         input, Literal::parse(input), Literal::Integer(expected_integer), "Literal::parse");
     assert_roundtrip(expected_integer.to_owned(), input);
+    assert_eq!(Ty::from_suffix(IntegerLit::parse(input).unwrap().suffix()), type_suffix);
 
     let actual_value = IntegerLit::parse(input)
         .unwrap()
@@ -101,7 +101,7 @@
     check("0b10010u8", 0b10010u8, Binary, "10010", Some(Ty::U8));
     check("0b10010i8", 0b10010u8, Binary, "10010", Some(Ty::I8));
     check("0b10010u64", 0b10010u64, Binary, "10010", Some(Ty::U64));
-    check("0b10010i64", 0b10010u64, Binary, "10010", Some(Ty::I64));
+    check("0b10010i64", 0b10010i64, Binary, "10010", Some(Ty::I64));
     check(
         "0b1011001_00110000_00101000_10100101u32",
         0b1011001_00110000_00101000_10100101u32,
@@ -197,7 +197,7 @@
         ("123u64", Ty::U64),
         ("123u128", Ty::U128),
     ].iter().for_each(|&(s, ty)| {
-        assert_eq!(IntegerLit::parse(s).unwrap().type_suffix(), Some(ty));
+        assert_eq!(Ty::from_suffix(IntegerLit::parse(s).unwrap().suffix()), Some(ty));
     });
 }
 
@@ -249,17 +249,15 @@
     assert_err!(IntegerLit, "", Empty, None);
     assert_err_single!(IntegerLit::parse("a"), DoesNotStartWithDigit, 0);
     assert_err_single!(IntegerLit::parse(";"), DoesNotStartWithDigit, 0);
-    assert_err_single!(IntegerLit::parse("0;"), InvalidIntegerTypeSuffix, 1..2);
-    assert_err_single!(IntegerLit::parse("0a"), InvalidDigit, 1);
+    assert_err_single!(IntegerLit::parse("0;"), UnexpectedChar, 1..2);
     assert_err!(IntegerLit, "0b", NoDigits, 2..2);
-    assert_err_single!(IntegerLit::parse("0z"), InvalidIntegerTypeSuffix, 1..2);
     assert_err_single!(IntegerLit::parse(" 0"), DoesNotStartWithDigit, 0);
-    assert_err_single!(IntegerLit::parse("0 "), InvalidIntegerTypeSuffix, 1);
-    assert_err_single!(IntegerLit::parse("0a3"), InvalidDigit, 1);
+    assert_err_single!(IntegerLit::parse("0 "), UnexpectedChar, 1);
     assert_err!(IntegerLit, "0b3", InvalidDigit, 2);
-    assert_err_single!(IntegerLit::parse("0z3"), InvalidIntegerTypeSuffix, 1..3);
     assert_err_single!(IntegerLit::parse("_"), DoesNotStartWithDigit, 0);
     assert_err_single!(IntegerLit::parse("_3"), DoesNotStartWithDigit, 0);
+    assert_err!(IntegerLit, "0x44.5", UnexpectedChar, 4..6);
+    assert_err_single!(IntegerLit::parse("123em"), IntegerSuffixStartingWithE, 3);
 }
 
 #[test]
@@ -267,30 +265,12 @@
     assert_err!(IntegerLit, "0b10201", InvalidDigit, 4);
     assert_err!(IntegerLit, "0b9", InvalidDigit, 2);
     assert_err!(IntegerLit, "0b07", InvalidDigit, 3);
-    assert_err!(IntegerLit, "0b0a", InvalidDigit, 3);
-    assert_err!(IntegerLit, "0b0A", InvalidDigit, 3);
-    assert_err!(IntegerLit, "0b01f", InvalidDigit, 4);
-    assert_err!(IntegerLit, "0b01F", InvalidDigit, 4);
 
     assert_err!(IntegerLit, "0o12380", InvalidDigit, 5);
     assert_err!(IntegerLit, "0o192", InvalidDigit, 3);
-    assert_err!(IntegerLit, "0o7a_", InvalidDigit, 3);
-    assert_err!(IntegerLit, "0o7A_", InvalidDigit, 3);
-    assert_err!(IntegerLit, "0o72f_0", InvalidDigit, 4);
-    assert_err!(IntegerLit, "0o72F_0", InvalidDigit, 4);
 
-    assert_err_single!(IntegerLit::parse("12a3"), InvalidDigit, 2);
-    assert_err_single!(IntegerLit::parse("12f3"), InvalidDigit, 2);
-    assert_err_single!(IntegerLit::parse("12f_"), InvalidDigit, 2);
-    assert_err_single!(IntegerLit::parse("12F_"), InvalidDigit, 2);
     assert_err_single!(IntegerLit::parse("a_123"), DoesNotStartWithDigit, 0);
     assert_err_single!(IntegerLit::parse("B_123"), DoesNotStartWithDigit, 0);
-
-    assert_err!(IntegerLit, "0x8cg", InvalidIntegerTypeSuffix, 4..5);
-    assert_err!(IntegerLit, "0x8cG", InvalidIntegerTypeSuffix, 4..5);
-    assert_err!(IntegerLit, "0x8c1h_", InvalidIntegerTypeSuffix, 5..7);
-    assert_err!(IntegerLit, "0x8c1H_", InvalidIntegerTypeSuffix, 5..7);
-    assert_err!(IntegerLit, "0x8czu16", InvalidIntegerTypeSuffix, 4..8);
 }
 
 #[test]
@@ -317,27 +297,61 @@
 }
 
 #[test]
-fn invalid_suffix() {
-    assert_err!(IntegerLit, "5u7", InvalidIntegerTypeSuffix, 1..3);
-    assert_err!(IntegerLit, "5u9", InvalidIntegerTypeSuffix, 1..3);
-    assert_err!(IntegerLit, "5u0", InvalidIntegerTypeSuffix, 1..3);
-    assert_err!(IntegerLit, "33u12", InvalidIntegerTypeSuffix, 2..5);
-    assert_err!(IntegerLit, "84u17", InvalidIntegerTypeSuffix, 2..5);
-    assert_err!(IntegerLit, "99u80", InvalidIntegerTypeSuffix, 2..5);
-    assert_err!(IntegerLit, "1234uu16", InvalidIntegerTypeSuffix, 4..8);
+fn non_standard_suffixes() {
+    #[track_caller]
+    fn check_suffix<T: FromIntegerLiteral + PartialEq + Debug + Display>(
+        input: &str,
+        value: T,
+        base: IntegerBase,
+        main_part: &str,
+        suffix: &str,
+    ) {
+        check(input, value, base, main_part, None);
+        assert_eq!(IntegerLit::parse(input).unwrap().suffix(), suffix);
+    }
 
-    assert_err!(IntegerLit, "5i7", InvalidIntegerTypeSuffix, 1..3);
-    assert_err!(IntegerLit, "5i9", InvalidIntegerTypeSuffix, 1..3);
-    assert_err!(IntegerLit, "5i0", InvalidIntegerTypeSuffix, 1..3);
-    assert_err!(IntegerLit, "33i12", InvalidIntegerTypeSuffix, 2..5);
-    assert_err!(IntegerLit, "84i17", InvalidIntegerTypeSuffix, 2..5);
-    assert_err!(IntegerLit, "99i80", InvalidIntegerTypeSuffix, 2..5);
-    assert_err!(IntegerLit, "1234ii16", InvalidIntegerTypeSuffix, 4..8);
+    check_suffix("5u7", 5, Decimal, "5", "u7");
+    check_suffix("5u7", 5, Decimal, "5", "u7");
+    check_suffix("5u9", 5, Decimal, "5", "u9");
+    check_suffix("5u0", 5, Decimal, "5", "u0");
+    check_suffix("33u12", 33, Decimal, "33", "u12");
+    check_suffix("84u17", 84, Decimal, "84", "u17");
+    check_suffix("99u80", 99, Decimal, "99", "u80");
+    check_suffix("1234uu16", 1234, Decimal, "1234", "uu16");
 
-    assert_err!(IntegerLit, "0ui32", InvalidIntegerTypeSuffix, 1..5);
-    assert_err!(IntegerLit, "1iu32", InvalidIntegerTypeSuffix, 1..5);
-    assert_err_single!(IntegerLit::parse("54321a64"), InvalidDigit, 5);
-    assert_err!(IntegerLit, "54321b64", InvalidDigit, 5);
-    assert_err!(IntegerLit, "54321x64", InvalidIntegerTypeSuffix, 5..8);
-    assert_err!(IntegerLit, "54321o64", InvalidIntegerTypeSuffix, 5..8);
+    check_suffix("5i7", 5, Decimal, "5", "i7");
+    check_suffix("5i9", 5, Decimal, "5", "i9");
+    check_suffix("5i0", 5, Decimal, "5", "i0");
+    check_suffix("33i12", 33, Decimal, "33", "i12");
+    check_suffix("84i17", 84, Decimal, "84", "i17");
+    check_suffix("99i80", 99, Decimal, "99", "i80");
+    check_suffix("1234ii16", 1234, Decimal, "1234", "ii16");
+
+    check_suffix("0ui32", 0, Decimal, "0", "ui32");
+    check_suffix("1iu32", 1, Decimal, "1", "iu32");
+    check_suffix("54321a64", 54321, Decimal, "54321", "a64");
+    check_suffix("54321b64", 54321, Decimal, "54321", "b64");
+    check_suffix("54321x64", 54321, Decimal, "54321", "x64");
+    check_suffix("54321o64", 54321, Decimal, "54321", "o64");
+
+    check_suffix("0a", 0, Decimal, "0", "a");
+    check_suffix("0a3", 0, Decimal, "0", "a3");
+    check_suffix("0z", 0, Decimal, "0", "z");
+    check_suffix("0z3", 0, Decimal, "0", "z3");
+    check_suffix("0b0a", 0, Binary, "0", "a");
+    check_suffix("0b0A", 0, Binary, "0", "A");
+    check_suffix("0b01f", 1, Binary, "01", "f");
+    check_suffix("0b01F", 1, Binary, "01", "F");
+    check_suffix("0o7a_", 7, Octal, "7", "a_");
+    check_suffix("0o7A_", 7, Octal, "7", "A_");
+    check_suffix("0o72f_0", 0o72, Octal, "72", "f_0");
+    check_suffix("0o72F_0", 0o72, Octal, "72", "F_0");
+
+    check_suffix("0x8cg", 0x8c, Hexadecimal, "8c", "g");
+    check_suffix("0x8cG", 0x8c, Hexadecimal, "8c", "G");
+    check_suffix("0x8c1h_", 0x8c1, Hexadecimal, "8c1", "h_");
+    check_suffix("0x8c1H_", 0x8c1, Hexadecimal, "8c1", "H_");
+    check_suffix("0x8czu16", 0x8c, Hexadecimal, "8c", "zu16");
+
+    check_suffix("123_foo", 123, Decimal, "123_", "foo");
 }
diff --git a/crates/litrs/src/lib.rs b/crates/litrs/src/lib.rs
index bd81f56..64ed781 100644
--- a/crates/litrs/src/lib.rs
+++ b/crates/litrs/src/lib.rs
@@ -9,7 +9,35 @@
 //! built. This crate also offers a bit more flexibility compared to `syn`
 //! (only regarding literals, of course).
 //!
-//! ---
+//!
+//! # Quick start
+//!
+//! | **`StringLit::try_from(tt)?.value()`** |
+//! | - |
+//!
+//! ... where `tt` is a `proc_macro::TokenTree` and where [`StringLit`] can be
+//! replaced with [`Literal`] or other types of literals (e.g. [`FloatLit`]).
+//! Calling `value()` returns the value that is represented by the literal.
+//!
+//! **Mini Example**
+//!
+//! ```ignore
+//! use proc_macro::TokenStream;
+//!
+//! #[proc_macro]
+//! pub fn foo(input: TokenStream) -> TokenStream {
+//!      let first_token = input.into_iter().next().unwrap(); // Do proper error handling!
+//!      let string_value = match litrs::StringLit::try_from(first_token) {
+//!          Ok(string_lit) => string_lit.value(),
+//!          Err(e) => return e.to_compile_error(),
+//!      };
+//!
+//!      // `string_value` is the string value with all escapes resolved.
+//!      todo!()
+//! }
+//! ```
+//!
+//! # Overview
 //!
 //! The main types of this library are [`Literal`], representing any kind of
 //! literal, and `*Lit`, like [`StringLit`] or [`FloatLit`], representing a
@@ -41,8 +69,8 @@
 //!
 //! **Note**: `true` and `false` are `Ident`s when passed to your proc macro.
 //! The `TryFrom<TokenTree>` impls check for those two special idents and
-//! return a `BoolLit` appropriately. For that reason, there is also no
-//! `TryFrom<proc_macro::Literal>` impl for `BoolLit`. The `proc_macro::Literal`
+//! return a [`BoolLit`] appropriately. For that reason, there is also no
+//! `TryFrom<proc_macro::Literal>` impl for [`BoolLit`]. The `proc_macro::Literal`
 //! simply cannot represent bool literals.
 //!
 //!
@@ -82,7 +110,7 @@
 //! // Parse a specific kind of literal (float in this case):
 //! let float_lit = FloatLit::parse("3.14f32");
 //! assert!(float_lit.is_ok());
-//! assert_eq!(float_lit.unwrap().type_suffix(), Some(litrs::FloatType::F32));
+//! assert_eq!(float_lit.unwrap().suffix(), "f32");
 //! assert!(FloatLit::parse("'c'").is_err());
 //!
 //! // Parse any kind of literal. After parsing, you can inspect the literal
@@ -105,6 +133,11 @@
 //!
 //! - `proc-macro2` (**default**): adds the dependency `proc_macro2`, a bunch of
 //!   `From` and `TryFrom` impls, and [`InvalidToken::to_compile_error2`].
+//! - `check_suffix`: if enabled, `parse` functions will exactly verify that the
+//!   literal suffix is valid. Adds the dependency `unicode-xid`. If disabled,
+//!   only an approximate check (only in ASCII range) is done. If you are
+//!   writing a proc macro, you don't need to enable this as the suffix is
+//!   already checked by the compiler.
 //!
 //!
 //! [ref]: https://doc.rust-lang.org/reference/tokens.html#literals
@@ -152,17 +185,10 @@
 // ===== `Literal` and type defs
 // ==============================================================================================
 
-/// A literal which owns the underlying buffer.
-pub type OwnedLiteral = Literal<String>;
-
-/// A literal whose underlying buffer is borrowed.
-pub type SharedLiteral<'a> = Literal<&'a str>;
-
 /// A literal. This is the main type of this library.
 ///
 /// This type is generic over the underlying buffer `B`, which can be `&str` or
-/// `String`. There are two useful type aliases: [`OwnedLiteral`] and
-/// [`SharedLiteral`].
+/// `String`.
 ///
 /// To create this type, you have to either call [`Literal::parse`] with an
 /// input string or use the `From<_>` impls of this type. The impls are only
@@ -179,10 +205,66 @@
     ByteString(ByteStringLit<B>),
 }
 
+impl<B: Buffer> Literal<B> {
+    /// Parses the given input as a Rust literal.
+    pub fn parse(input: B) -> Result<Self, ParseError> {
+        parse::parse(input)
+    }
+
+    /// Returns the suffix of this literal or `""` if it doesn't have one.
+    ///
+    /// Rust token grammar actually allows suffixes for all kinds of tokens.
+    /// Most Rust programmer only know the type suffixes for integer and
+    /// floats, e.g. `0u32`. And in normal Rust code, everything else causes an
+    /// error. But it is possible to pass literals with arbitrary suffixes to
+    /// proc macros, for example:
+    ///
+    /// ```ignore
+    /// some_macro!(3.14f33  16px  '🦊'good_boy  "toph"beifong);
+    /// ```
+    ///
+    /// Boolean literals, not actually being literals, but idents, cannot have
+    /// suffixes and this method always returns `""` for those.
+    ///
+    /// There are some edge cases to be aware of:
+    /// - Integer suffixes must not start with `e` or `E` as that conflicts with
+    ///   the exponent grammar for floats. `0e1` is a float; `0eel` is also
+    ///   parsed as a float and results in an error.
+    /// - Hexadecimal integers eagerly parse digits, so `0x5abcdefgh` has a
+    ///   suffix von `gh`.
+    /// - Suffixes can contain and start with `_`, but for integer and number
+    ///   literals, `_` is eagerly parsed as part of the number, so `1_x` has
+    ///   the suffix `x`.
+    /// - The input `55f32` is regarded as integer literal with suffix `f32`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use litrs::Literal;
+    ///
+    /// assert_eq!(Literal::parse(r##"3.14f33"##).unwrap().suffix(), "f33");
+    /// assert_eq!(Literal::parse(r##"123hackerman"##).unwrap().suffix(), "hackerman");
+    /// assert_eq!(Literal::parse(r##"0x0fuck"##).unwrap().suffix(), "uck");
+    /// assert_eq!(Literal::parse(r##"'🦊'good_boy"##).unwrap().suffix(), "good_boy");
+    /// assert_eq!(Literal::parse(r##""toph"beifong"##).unwrap().suffix(), "beifong");
+    /// ```
+    pub fn suffix(&self) -> &str {
+        match self {
+            Literal::Bool(_) => "",
+            Literal::Integer(l) => l.suffix(),
+            Literal::Float(l) => l.suffix(),
+            Literal::Char(l) => l.suffix(),
+            Literal::String(l) => l.suffix(),
+            Literal::Byte(l) => l.suffix(),
+            Literal::ByteString(l) => l.suffix(),
+        }
+    }
+}
+
 impl Literal<&str> {
     /// Makes a copy of the underlying buffer and returns the owned version of
     /// `Self`.
-    pub fn into_owned(self) -> OwnedLiteral {
+    pub fn into_owned(self) -> Literal<String> {
         match self {
             Literal::Bool(l) => Literal::Bool(l.to_owned()),
             Literal::Integer(l) => Literal::Integer(l.to_owned()),
@@ -218,7 +300,7 @@
 ///
 /// This is trait is implementation detail of this library, cannot be
 /// implemented in other crates and is not subject to semantic versioning.
-/// `litrs` only gurantees that this trait is implemented for `String` and
+/// `litrs` only guarantees that this trait is implemented for `String` and
 /// `for<'a> &'a str`.
 pub trait Buffer: sealed::Sealed + Deref<Target = str> {
     /// This is `Cow<'static, str>` for `String`, and `Cow<'a, str>` for `&'a str`.
diff --git a/crates/litrs/src/parse.rs b/crates/litrs/src/parse.rs
index a0266da..efc6b87 100644
--- a/crates/litrs/src/parse.rs
+++ b/crates/litrs/src/parse.rs
@@ -9,52 +9,44 @@
     IntegerLit,
     Literal,
     StringLit,
-    err::{perr, ParseErrorKind::*},
+    err::{perr, ParseErrorKind::{*, self}},
 };
 
 
-impl<B: Buffer> Literal<B> {
-    /// Parses the given input as a Rust literal.
-    pub fn parse(input: B) -> Result<Self, ParseError> {
-        let (first, rest) = input.as_bytes().split_first().ok_or(perr(None, Empty))?;
-        let second = input.as_bytes().get(1).copied();
+pub fn parse<B: Buffer>(input: B) -> Result<Literal<B>, ParseError> {
+    let (first, rest) = input.as_bytes().split_first().ok_or(perr(None, Empty))?;
+    let second = input.as_bytes().get(1).copied();
 
-        match first {
-            b'f' if &*input == "false" => Ok(Self::Bool(BoolLit::False)),
-            b't' if &*input == "true" => Ok(Self::Bool(BoolLit::True)),
+    match first {
+        b'f' if &*input == "false" => Ok(Literal::Bool(BoolLit::False)),
+        b't' if &*input == "true" => Ok(Literal::Bool(BoolLit::True)),
 
-            // A number literal (integer or float).
-            b'0'..=b'9' => {
-                // To figure out whether this is a float or integer, we do some
-                // quick inspection here. Yes, this is technically duplicate
-                // work with what is happening in the integer/float parse
-                // methods, but it makes the code way easier for now and won't
-                // be a huge performance loss.
-                let end = 1 + end_dec_digits(rest);
-                match input.as_bytes().get(end) {
-                    // Potential chars in integer literals: b, o, x for base; u
-                    // and i for type suffix.
-                    None | Some(b'b') | Some(b'o') | Some(b'x') | Some(b'u') | Some(b'i')
-                        => IntegerLit::parse(input).map(Literal::Integer),
+        // A number literal (integer or float).
+        b'0'..=b'9' => {
+            // To figure out whether this is a float or integer, we do some
+            // quick inspection here. Yes, this is technically duplicate
+            // work with what is happening in the integer/float parse
+            // methods, but it makes the code way easier for now and won't
+            // be a huge performance loss.
+            //
+            // The first non-decimal char in a float literal must
+            // be '.', 'e' or 'E'.
+            match input.as_bytes().get(1 + end_dec_digits(rest)) {
+                Some(b'.') | Some(b'e') | Some(b'E')
+                    => FloatLit::parse(input).map(Literal::Float),
 
-                    // Potential chars for float literals: `.` as fractional
-                    // period, e and E as exponent start and f as type suffix.
-                    Some(b'.') | Some(b'e') | Some(b'E') | Some(b'f')
-                        => FloatLit::parse(input).map(Literal::Float),
+                _ => IntegerLit::parse(input).map(Literal::Integer),
+            }
+        },
 
-                    _ => Err(perr(end, UnexpectedChar)),
-                }
-            },
+        b'\'' => CharLit::parse(input).map(Literal::Char),
+        b'"' | b'r' => StringLit::parse(input).map(Literal::String),
 
-            b'\'' => CharLit::parse(input).map(Literal::Char),
-            b'"' | b'r' => StringLit::parse_impl(input).map(Literal::String),
+        b'b' if second == Some(b'\'') => ByteLit::parse(input).map(Literal::Byte),
+        b'b' if second == Some(b'r') || second == Some(b'"')
+            => ByteStringLit::parse(input).map(Literal::ByteString),
 
-            b'b' if second == Some(b'\'') => ByteLit::parse(input).map(Literal::Byte),
-            b'b' if second == Some(b'r') || second == Some(b'"')
-                => ByteStringLit::parse_impl(input).map(Literal::ByteString),
-
-            _ => Err(perr(None, InvalidLiteral)),
-        }
+        _ => Err(perr(None, InvalidLiteral)),
     }
 }
 
@@ -79,3 +71,55 @@
         _ => None,
     }
 }
+
+/// Makes sure that `s` is a valid literal suffix.
+pub(crate) fn check_suffix(s: &str) -> Result<(), ParseErrorKind> {
+    if s.is_empty() {
+        return Ok(());
+    }
+
+    let mut chars = s.chars();
+    let first = chars.next().unwrap();
+    let rest = chars.as_str();
+    if first == '_' && rest.is_empty() {
+        return Err(InvalidSuffix);
+    }
+
+    // This is just an extra check to improve the error message. If the first
+    // character of the "suffix" is already some invalid ASCII
+    // char, "unexpected character" seems like the more fitting error.
+    if first.is_ascii() && !(first.is_ascii_alphabetic() || first == '_') {
+        return Err(UnexpectedChar);
+    }
+
+    // Proper check is optional as it's not really necessary in proc macro
+    // context.
+    #[cfg(feature = "check_suffix")]
+    fn is_valid_suffix(first: char, rest: &str) -> bool {
+        use unicode_xid::UnicodeXID;
+
+        (first == '_' || first.is_xid_start())
+            && rest.chars().all(|c| c.is_xid_continue())
+    }
+
+    // When avoiding the dependency on `unicode_xid`, we just do a best effort
+    // to catch the most common errors.
+    #[cfg(not(feature = "check_suffix"))]
+    fn is_valid_suffix(first: char, rest: &str) -> bool {
+        if first.is_ascii() && !(first.is_ascii_alphabetic() || first == '_') {
+            return false;
+        }
+        for c in rest.chars() {
+            if c.is_ascii() && !(c.is_ascii_alphanumeric() || c == '_') {
+                return false;
+            }
+        }
+        true
+    }
+
+    if is_valid_suffix(first, rest) {
+        Ok(())
+    } else {
+        Err(InvalidSuffix)
+    }
+}
diff --git a/crates/litrs/src/string/mod.rs b/crates/litrs/src/string/mod.rs
index ab1cc3f..d2034a6 100644
--- a/crates/litrs/src/string/mod.rs
+++ b/crates/litrs/src/string/mod.rs
@@ -18,13 +18,16 @@
     /// The raw input.
     raw: B,
 
-    /// The string value (with all escaped unescaped), or `None` if there were
-    /// no escapes. In the latter case, `input` is the string value.
+    /// The string value (with all escapes unescaped), or `None` if there were
+    /// no escapes. In the latter case, the string value is in `raw`.
     value: Option<String>,
 
     /// The number of hash signs in case of a raw string literal, or `None` if
     /// it's not a raw string literal.
     num_hashes: Option<u32>,
+
+    /// Start index of the suffix or `raw.len()` if there is no suffix.
+    start_suffix: usize,
 }
 
 impl<B: Buffer> StringLit<B> {
@@ -32,7 +35,10 @@
     /// input is invalid or represents a different kind of literal.
     pub fn parse(input: B) -> Result<Self, ParseError> {
         match first_byte_or_empty(&input)? {
-            b'r' | b'"' => Self::parse_impl(input),
+            b'r' | b'"' => {
+                let (value, num_hashes, start_suffix) = parse_impl(&input)?;
+                Ok(Self { raw: input, value, num_hashes, start_suffix })
+            }
             _ => Err(perr(0, InvalidStringLiteralStart)),
         }
     }
@@ -53,6 +59,11 @@
         value.map(B::Cow::from).unwrap_or_else(|| raw.cut(inner_range).into_cow())
     }
 
+    /// The optional suffix. Returns `""` if the suffix is empty/does not exist.
+    pub fn suffix(&self) -> &str {
+        &(*self.raw)[self.start_suffix..]
+    }
+
     /// Returns whether this literal is a raw string literal (starting with
     /// `r`).
     pub fn is_raw_string(&self) -> bool {
@@ -72,27 +83,8 @@
     /// The range within `self.raw` that excludes the quotes and potential `r#`.
     fn inner_range(&self) -> Range<usize> {
         match self.num_hashes {
-            None => 1..self.raw.len() - 1,
-            Some(n) => 1 + n as usize + 1..self.raw.len() - n as usize - 1,
-        }
-    }
-
-    /// Precondition: input has to start with either `"` or `r`.
-    pub(crate) fn parse_impl(input: B) -> Result<Self, ParseError> {
-        if input.starts_with('r') {
-            let (value, num_hashes) = scan_raw_string::<char>(&input, 1)?;
-            Ok(Self {
-                raw: input,
-                value,
-                num_hashes: Some(num_hashes),
-            })
-        } else {
-            let value = unescape_string::<char>(&input, 1)?;
-            Ok(Self {
-                raw: input,
-                value,
-                num_hashes: None,
-            })
+            None => 1..self.start_suffix - 1,
+            Some(n) => 1 + n as usize + 1..self.start_suffix - n as usize - 1,
         }
     }
 }
@@ -105,6 +97,7 @@
             raw: self.raw.to_owned(),
             value: self.value,
             num_hashes: self.num_hashes,
+            start_suffix: self.start_suffix,
         }
     }
 }
@@ -115,6 +108,18 @@
     }
 }
 
+/// Precondition: input has to start with either `"` or `r`.
+#[inline(never)]
+pub(crate) fn parse_impl(input: &str) -> Result<(Option<String>, Option<u32>, usize), ParseError> {
+    if input.starts_with('r') {
+        scan_raw_string::<char>(&input, 1)
+            .map(|(v, hashes, start_suffix)| (v, Some(hashes), start_suffix))
+    } else {
+        unescape_string::<char>(&input, 1)
+            .map(|(v, start_suffix)| (v, None, start_suffix))
+    }
+}
+
 
 #[cfg(test)]
 mod tests;
diff --git a/crates/litrs/src/string/tests.rs b/crates/litrs/src/string/tests.rs
index 51519ab..1c0cb63 100644
--- a/crates/litrs/src/string/tests.rs
+++ b/crates/litrs/src/string/tests.rs
@@ -4,18 +4,24 @@
 
 macro_rules! check {
     ($lit:literal, $has_escapes:expr, $num_hashes:expr) => {
-        let input = stringify!($lit);
+        check!($lit, stringify!($lit), $has_escapes, $num_hashes, "")
+    };
+    ($lit:literal, $input:expr, $has_escapes:expr, $num_hashes:expr, $suffix:literal) => {
+        let input = $input;
         let expected = StringLit {
             raw: input,
             value: if $has_escapes { Some($lit.to_string()) } else { None },
             num_hashes: $num_hashes,
+            start_suffix: input.len() - $suffix.len(),
         };
 
         assert_parse_ok_eq(input, StringLit::parse(input), expected.clone(), "StringLit::parse");
         assert_parse_ok_eq(
             input, Literal::parse(input), Literal::String(expected.clone()), "Literal::parse");
-        assert_eq!(StringLit::parse(input).unwrap().value(), $lit);
-        assert_eq!(StringLit::parse(input).unwrap().into_value(), $lit);
+        let lit = StringLit::parse(input).unwrap();
+        assert_eq!(lit.value(), $lit);
+        assert_eq!(lit.suffix(), $suffix);
+        assert_eq!(lit.into_value(), $lit);
         assert_roundtrip(expected.into_owned(), input);
     };
 }
@@ -47,6 +53,7 @@
                 raw: &*input,
                 value: None,
                 num_hashes,
+                start_suffix: input.len(),
             };
             assert_parse_ok_eq(
                 &input, StringLit::parse(&*input), expected.clone(), "StringLit::parse");
@@ -186,16 +193,23 @@
 }
 
 #[test]
+fn suffixes() {
+    check!("hello", r###""hello"suffix"###, false, None, "suffix");
+    check!(r"お前はもう死んでいる", r###"r"お前はもう死んでいる"_banana"###, false, Some(0), "_banana");
+    check!("fox", r#""fox"peter"#, false, None, "peter");
+    check!("🦊", r#""🦊"peter"#, false, None, "peter");
+    check!("నక్క\\\\u{0b10}", r###""నక్క\\\\u{0b10}"jü_rgen"###, true, None, "jü_rgen");
+}
+
+#[test]
 fn parse_err() {
     assert_err!(StringLit, r#"""#, UnterminatedString, None);
     assert_err!(StringLit, r#""犬"#, UnterminatedString, None);
     assert_err!(StringLit, r#""Jürgen"#, UnterminatedString, None);
     assert_err!(StringLit, r#""foo bar baz"#, UnterminatedString, None);
 
-    assert_err!(StringLit, r#""fox"peter"#, UnexpectedChar, 5..10);
-    assert_err!(StringLit, r#""fox"peter""#, UnexpectedChar, 5..11);
-    assert_err!(StringLit, r#""fox"🦊"#, UnexpectedChar, 5..9);
-    assert_err!(StringLit, r###"r#"foo "# bar"#"###, UnexpectedChar, 9..15);
+    assert_err!(StringLit, r#""fox"peter""#, InvalidSuffix, 5);
+    assert_err!(StringLit, r###"r#"foo "# bar"#"###, UnexpectedChar, 9);
 
     assert_err!(StringLit, "\"\r\"", IsolatedCr, 1);
     assert_err!(StringLit, "\"fo\rx\"", IsolatedCr, 3);
@@ -225,10 +239,10 @@
 }
 
 #[test]
-fn invald_escapes() {
+fn invalid_escapes() {
     assert_err!(StringLit, r#""\a""#, UnknownEscape, 1..3);
     assert_err!(StringLit, r#""foo\y""#, UnknownEscape, 4..6);
-    assert_err!(StringLit, r#""\"#, UnterminatedString, None);
+    assert_err!(StringLit, r#""\"#, UnterminatedEscape, 1);
     assert_err!(StringLit, r#""\x""#, UnterminatedEscape, 1..3);
     assert_err!(StringLit, r#""🦊\x1""#, UnterminatedEscape, 5..8);
     assert_err!(StringLit, r#"" \xaj""#, InvalidXEscape, 2..6);
diff --git a/crates/litrs/src/tests.rs b/crates/litrs/src/tests.rs
index 526917e..613b429 100644
--- a/crates/litrs/src/tests.rs
+++ b/crates/litrs/src/tests.rs
@@ -25,25 +25,16 @@
 
 #[test]
 fn misc() {
-    assert_err_single!(Literal::parse("0x44.5"), InvalidIntegerTypeSuffix, 4..6);
+    assert_err_single!(Literal::parse("0x44.5"), UnexpectedChar, 4..6);
     assert_err_single!(Literal::parse("a"), InvalidLiteral, None);
     assert_err_single!(Literal::parse(";"), InvalidLiteral, None);
     assert_err_single!(Literal::parse("0;"), UnexpectedChar, 1);
-    assert_err_single!(Literal::parse("0a"), UnexpectedChar, 1);
-    assert_err_single!(Literal::parse("0z"), UnexpectedChar, 1);
     assert_err_single!(Literal::parse(" 0"), InvalidLiteral, None);
     assert_err_single!(Literal::parse("0 "), UnexpectedChar, 1);
-    assert_err_single!(Literal::parse("0a3"), UnexpectedChar, 1);
-    assert_err_single!(Literal::parse("0z3"), UnexpectedChar, 1);
     assert_err_single!(Literal::parse("_"), InvalidLiteral, None);
     assert_err_single!(Literal::parse("_3"), InvalidLiteral, None);
-    assert_err_single!(Literal::parse("12a3"), UnexpectedChar, 2);
-    assert_err_single!(Literal::parse("12f3"), InvalidFloatTypeSuffix, 2..4);
-    assert_err_single!(Literal::parse("12f_"), InvalidFloatTypeSuffix, 2..4);
-    assert_err_single!(Literal::parse("12F_"), UnexpectedChar, 2);
     assert_err_single!(Literal::parse("a_123"), InvalidLiteral, None);
     assert_err_single!(Literal::parse("B_123"), InvalidLiteral, None);
-    assert_err_single!(Literal::parse("54321a64"), UnexpectedChar, 5);
 }
 
 macro_rules! assert_no_panic {
@@ -113,7 +104,11 @@
         ($input:expr, expected: $expected:path, actual: $actual:path $(,)?) => {
             let err = $input.unwrap_err();
             if err.expected != $expected {
-                panic!("err.expected was expected to be {:?}, but is {:?}", $expected, err.expected);
+                panic!(
+                    "err.expected was expected to be {:?}, but is {:?}",
+                    $expected,
+                    err.expected,
+                );
             }
             if err.actual != $actual {
                 panic!("err.actual was expected to be {:?}, but is {:?}", $actual, err.actual);
@@ -177,7 +172,10 @@
     assert_eq!(Literal::from(FloatLit::try_from(pm_f32_lit.clone()).unwrap()), f32_lit);
     assert_eq!(Literal::from(FloatLit::try_from(pm_f64_lit.clone()).unwrap()), f64_lit);
     assert_eq!(Literal::from(StringLit::try_from(pm_string_lit.clone()).unwrap()), string_lit);
-    assert_eq!(Literal::from(ByteStringLit::try_from(pm_bytestr_lit.clone()).unwrap()), bytestr_lit);
+    assert_eq!(
+        Literal::from(ByteStringLit::try_from(pm_bytestr_lit.clone()).unwrap()),
+        bytestr_lit,
+    );
     assert_eq!(Literal::from(CharLit::try_from(pm_char_lit.clone()).unwrap()), char_lit);
 
     assert_invalid_token!(
diff --git a/crates/memmap2/.android-checksum.json b/crates/memmap2/.android-checksum.json
index 1e96242..623243e 100644
--- a/crates/memmap2/.android-checksum.json
+++ b/crates/memmap2/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"9da0c63bc6b4d07cb3030ea4edf26a77880083e4e6b4614b400a73654bf360d2","Android.bp":"ec2985e9a56dd9d8daa0c5f82431a92254388e88bd7707a8baa1166341eff5a6","CHANGELOG.md":"934cf9ca000033458d856068e2692b5bf36ce369a4468dca721b8b6fea936edf","Cargo.lock":"ea130a2ceeda3356b228a05fe073c3bba58e57bb4072c23b5c4a285ce9649c09","Cargo.toml":"f069bc8f2ae01ce10cc48ae8b2a9cb857ba481fbb0603486305fa0e89591fe7a","LICENSE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-APACHE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-MIT":"834989c1a573298116f240ba61cca4dece60d84170442dcae8a6f11200f25d94","METADATA":"a4edb6901942489e6a8d585abcedb843343a208fb22e30a66f5fbbfbd4052dc2","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"aac45868339a2cd1c2b78d3cc4d7b162ba6a2d1064edf5f734c8ce4a6f6aa672","cargo_embargo.json":"47b5961cae22b0b582a8dd82651bfbf99c92a3d2003ee32c511666208375596e","examples/cat.rs":"a7402c4256080130a410f71947dc7710f9f8c91d654878ecd37b887445e16922","src/advice.rs":"42a19fd10151f57edb07f1e60217524bf1b0ea7b5e54b39b4b86faf2498f87ec","src/lib.rs":"446b3ec407267f4cb6db6f0c475403376563f3764e8337e069469447822d0b14","src/stub.rs":"e65304fb482fa326d1051363f0c009e50d099d4af0104a4db78a030e71f9fcea","src/unix.rs":"3972b64ed88389d3ba42065958830b66d6ff680c6cf62ba151f943927e8f9b89","src/windows.rs":"156f03567f466469a24cf8dd4d9b807094bc70bf0fc8241d5de4280ab33a915c"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"4e4250ae3c2467f0159657019ece7c23dc793ec787b4ed13047f10a9f350f848","Android.bp":"21b7d4c26c090ab87682050682912484dc15f54e46520c5beda5c1e2b3701377","CHANGELOG.md":"64c9a56e0cfa98a4519aa203223bace28550cf6476c9a65df9a5ba5a9fcf1942","Cargo.lock":"98d5ac2dc865a84afed79f2b7895587f3ed122743c5a751061ab284f3f20b836","Cargo.toml":"9058af16cf241fc0cf0e00226fefe07ba8697b7c12b02f641f038b84e758a9bf","LICENSE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-APACHE":"3e99c8c5c7ed0e673ff7ada34f2f91ff090dd19c25040c0ec8a191e0dababef6","LICENSE-MIT":"834989c1a573298116f240ba61cca4dece60d84170442dcae8a6f11200f25d94","METADATA":"786f96c92cfa72fb224001a517668268661eb5c87717fb5b1785ee31188b64a1","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"a169de144eb94def02d398ae2cf0be93d1c587021fabec3e7b0e47dfe67c1335","cargo_embargo.json":"47b5961cae22b0b582a8dd82651bfbf99c92a3d2003ee32c511666208375596e","examples/cat.rs":"a7402c4256080130a410f71947dc7710f9f8c91d654878ecd37b887445e16922","src/advice.rs":"77d7888e5e8616154dd41c24b61982b339d855e5cd004db409ba1ae4e5e6a42a","src/lib.rs":"55a87ed3be320d1c0387d8ae77c782395224b2f1cf043cc6ebd4c6c0fb510a8b","src/stub.rs":"92877f7c5675f415390232ea9fc2b7df5ad7409184349ba60a296cdce25c5f6c","src/unix.rs":"b8b055c27b2bbd43fa5a65582f2506b594016092d4598937b1287d0515011e6a","src/windows.rs":"3a6b2ec61a7c34cf73dae792aa5c434a6b1bdc875a52cc0850ab62f46e86d45c"}}
\ No newline at end of file
diff --git a/crates/memmap2/.cargo-checksum.json b/crates/memmap2/.cargo-checksum.json
index ee68719..f8b79fe 100644
--- a/crates/memmap2/.cargo-checksum.json
+++ b/crates/memmap2/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"d334fd0c52c9dd01592b62bb37e2bf4dd1ac176062aacfd915e90de9ffa5e376","Cargo.lock":"8634a29932d4af588c7ede3a939f725ba36455e63e2e4da76d4608e72dd8a6c2","Cargo.toml":"9e9bf7eea9db0f7d3f22aa8abaa040f7870ab8788b43d14b210f0e2ecf8f5e38","LICENSE-APACHE":"04ea4849dba9dcae07113850c6f1b1a69052c625210639914eee352023f750ad","LICENSE-MIT":"0d25d03b5ab49576178ad0cae7a2648d12c17ad0452fe49c07e55e4b59aa5257","README.md":"c7b3cd928f0d1a10faa255e2f84a2a06636e55ea3e7edd4f6334dd9215151205","examples/cat.rs":"ab0b575d19662e2d5b6c7cea2756b57530e495d56acdb4fd2b56c0ba4d768dfd","src/advice.rs":"6e88b81dcf4e7c9315484c228fe5f5a4ce5c8c06e6d8cb866e50bdd9ea8b55ec","src/lib.rs":"19b739c03e43901ce3994818b5d070d844d5a46a9b50d7e22934511722281199","src/stub.rs":"691da940edbe807a815d4a6bb3233df01bca8ab12b306ce7d67c75b4baa14e26","src/unix.rs":"f79013879989364168186dc925446a1d1f9de11999103415ae9970319fb14491","src/windows.rs":"ba820e315a31cd74fee49fcf7606af0172c0817b4a0fe3b1d113024efa79684f"},"package":"43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"1f8abe1f985284b06ac77867c8df29b695384ef7664bfcd97ccb644acd6888bf","Cargo.lock":"44ecd3998f8496243a101779f57ab7a8fbcdbed031299c5b7d4554436952fa5b","Cargo.toml":"ae196680919726dea781b749f1fea0512e35418764dda54e327f1cac7391610b","LICENSE-APACHE":"04ea4849dba9dcae07113850c6f1b1a69052c625210639914eee352023f750ad","LICENSE-MIT":"0d25d03b5ab49576178ad0cae7a2648d12c17ad0452fe49c07e55e4b59aa5257","README.md":"eca89ee9874278c7e977992dd782848c6f278f297ccc64362e6831861aaba0c3","examples/cat.rs":"ab0b575d19662e2d5b6c7cea2756b57530e495d56acdb4fd2b56c0ba4d768dfd","src/advice.rs":"bfee13815e20969cd3d32a117d9a547d281773b53266bc4ee24c2e71772b5bd9","src/lib.rs":"f97208fe36bed6e06db7185d29d2323f7df4b1c7897a7b8dcfe7a7dd94bbe9f7","src/stub.rs":"47c8e4a4bf09c1b1623f3c4e624199daa398d7919b64029e2dbbccbe26885731","src/unix.rs":"dc9a84f19e789167864a8608a46c3a9a0fcaaa9fd009e56a5480d8127f3f0617","src/windows.rs":"c27c4cbcd2311fd6cf8ebd0486d5433fbf2d7836e9aadeb26b22b469ca5dc7e1"},"package":"fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"}
\ No newline at end of file
diff --git a/crates/memmap2/Android.bp b/crates/memmap2/Android.bp
index e971262..40fb1a5 100644
--- a/crates/memmap2/Android.bp
+++ b/crates/memmap2/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "memmap2",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.0",
+    cargo_pkg_version: "0.9.5",
     crate_root: "src/lib.rs",
     edition: "2018",
     rustlibs: ["liblibc"],
@@ -36,7 +36,7 @@
     host_supported: true,
     crate_name: "memmap2",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.0",
+    cargo_pkg_version: "0.9.5",
     crate_root: "src/lib.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
diff --git a/crates/memmap2/CHANGELOG.md b/crates/memmap2/CHANGELOG.md
index acd70dd..36e80a9 100644
--- a/crates/memmap2/CHANGELOG.md
+++ b/crates/memmap2/CHANGELOG.md
@@ -6,6 +6,44 @@
 
 ## [Unreleased]
 
+## [0.9.5] - 2024-09-13
+### Added
+- `Advise::is_supported` and `UncheckedAdvice::is_supported`. Linux only.
+  [@xzfc](https://github.com/xzfc)
+- Documentation improvements.
+  [@RalfJung](https://github.com/RalfJung)
+  [@betelgeuse](https://github.com/betelgeuse)
+  [@ADSteele916](https://github.com/ADSteele916)
+
+## [0.9.4] - 2024-01-25
+### Changed
+- The `libc` crate >= 0.2.151 is required now.
+
+### Fixed
+- Build on Android with an older `libc` crate.
+
+## [0.9.3] - 2023-12-19
+### Fixed
+- Build on Android.
+
+## [0.9.2] - 2023-12-17
+### Fixed
+- Build on FreeBSD.
+
+## [0.9.1] - 2023-12-16
+### Changed
+- Added `MmapOptions::huge` method to support mapping hugetlb. Linux only.
+  [@ollie-etl](https://github.com/ollie-etl)
+  [@oliverbunting](https://github.com/oliverbunting)
+
+## [0.9.0] - 2023-10-03
+### Changed
+- The `Advice` struct was split into two enums: `Advice` and `UncheckedAdvice`.<br>
+  `Advice` can be passed to safe `advise` and `advise_range` methods.
+  And `UncheckedAdvice` can be passed to unsafe `unchecked_advise`
+  and `unchecked_advise_range` methods.<br>
+  [@adamreichold](https://github.com/adamreichold)
+
 ## [0.8.0] - 2023-09-25
 ### Changed
 - The `Advice` type is a struct and not an enum now.
@@ -174,7 +212,13 @@
 ### Removed
 - `winapi` dependency. [memmap-rs/pull/89](https://github.com/danburkert/memmap-rs/pull/89)
 
-[Unreleased]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.8.0...HEAD
+[Unreleased]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.9.5...HEAD
+[0.9.5]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.9.4...v0.9.5
+[0.9.4]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.9.3...v0.9.4
+[0.9.3]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.9.2...v0.9.3
+[0.9.2]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.9.1...v0.9.2
+[0.9.1]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.9.0...v0.9.1
+[0.9.0]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.8.0...v0.9.0
 [0.8.0]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.7.1...v0.8.0
 [0.7.1]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.7.0...v0.7.1
 [0.7.0]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.6.2...v0.7.0
diff --git a/crates/memmap2/Cargo.lock b/crates/memmap2/Cargo.lock
index 894dd2a..bd9437a 100644
--- a/crates/memmap2/Cargo.lock
+++ b/crates/memmap2/Cargo.lock
@@ -4,9 +4,9 @@
 
 [[package]]
 name = "bitflags"
-version = "1.3.2"
+version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
 [[package]]
 name = "cfg-if"
@@ -15,32 +15,36 @@
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
-name = "fastrand"
-version = "1.9.0"
+name = "errno"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
 dependencies = [
- "instant",
+ "libc",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
-name = "instant"
-version = "0.1.12"
+name = "fastrand"
+version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
+checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
 
 [[package]]
 name = "libc"
-version = "0.2.146"
+version = "0.2.158"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
 
 [[package]]
 name = "memmap2"
-version = "0.8.0"
+version = "0.9.5"
 dependencies = [
  "libc",
  "owning_ref",
@@ -49,6 +53,12 @@
 ]
 
 [[package]]
+name = "once_cell"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+[[package]]
 name = "owning_ref"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -58,21 +68,16 @@
 ]
 
 [[package]]
-name = "redox_syscall"
-version = "0.2.16"
+name = "rustix"
+version = "0.38.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
 dependencies = [
  "bitflags",
-]
-
-[[package]]
-name = "remove_dir_all"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
-dependencies = [
- "winapi",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -83,36 +88,95 @@
 
 [[package]]
 name = "tempfile"
-version = "3.3.0"
+version = "3.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
 dependencies = [
  "cfg-if",
  "fastrand",
- "libc",
- "redox_syscall",
- "remove_dir_all",
- "winapi",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
-name = "winapi"
-version = "0.3.9"
+name = "windows-sys"
+version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
+ "windows-targets",
 ]
 
 [[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
+name = "windows-sys"
+version = "0.59.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
 
 [[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
+name = "windows-targets"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
diff --git a/crates/memmap2/Cargo.toml b/crates/memmap2/Cargo.toml
index cf29e5d..0e92e1e 100644
--- a/crates/memmap2/Cargo.toml
+++ b/crates/memmap2/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2018"
 name = "memmap2"
-version = "0.8.0"
+version = "0.9.5"
 authors = [
     "Dan Burkert <[email protected]>",
     "Yevhenii Reizner <[email protected]>",
@@ -40,4 +40,4 @@
 version = "3"
 
 [target."cfg(unix)".dependencies.libc]
-version = "0.2.143"
+version = "0.2.151"
diff --git a/crates/memmap2/METADATA b/crates/memmap2/METADATA
index 06379a2..746a24f 100644
--- a/crates/memmap2/METADATA
+++ b/crates/memmap2/METADATA
@@ -1,21 +1,17 @@
 name: "memmap2"
 description: "Cross-platform Rust API for memory-mapped file IO"
 third_party {
-  identifier {
-    type: "crates.io"
-    value: "memmap2"
-  }
-  identifier {
-    type: "Archive"
-    value: "https://static.crates.io/crates/memmap2/memmap2-0.8.0.crate"
-    primary_source: true
-  }
-  version: "0.8.0"
-  # Dual-licensed, using the least restrictive per go/thirdpartylicenses#same.
+  version: "0.9.5"
   license_type: NOTICE
   last_upgrade_date {
     year: 2024
-    month: 1
-    day: 26
+    month: 12
+    day: 21
+  }
+  homepage: "https://crates.io/crates/memmap2"
+  identifier {
+    type: "Archive"
+    value: "https://static.crates.io/crates/memmap2/memmap2-0.9.5.crate"
+    version: "0.9.5"
   }
 }
diff --git a/crates/memmap2/README.md b/crates/memmap2/README.md
index df0252b..1a67fa9 100644
--- a/crates/memmap2/README.md
+++ b/crates/memmap2/README.md
@@ -17,7 +17,7 @@
 - [x] read-only memory maps
 - [x] stack support (`MAP_STACK` on unix)
 - [x] executable memory maps
-- [ ] huge page support
+- [x] huge page support (linux only)
 
 A list of supported/tested targets can be found in [Actions](https://github.com/RazrFalcon/memmap2-rs/actions).
 
diff --git a/crates/memmap2/src/advice.rs b/crates/memmap2/src/advice.rs
index 9b25e4f..60e955b 100644
--- a/crates/memmap2/src/advice.rs
+++ b/crates/memmap2/src/advice.rs
@@ -1,145 +1,32 @@
 /// Values supported by [`Mmap::advise`][crate::Mmap::advise] and [`MmapMut::advise`][crate::MmapMut::advise] functions.
+///
 /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
-#[derive(Debug, Eq, PartialEq, Hash)]
-pub struct Advice(pub(crate) libc::c_int);
-
-impl Advice {
+#[repr(i32)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+pub enum Advice {
     /// **MADV_NORMAL**
     ///
     /// No special treatment.  This is the default.
-    pub fn normal() -> Self {
-        Self(libc::MADV_NORMAL)
-    }
+    Normal = libc::MADV_NORMAL,
 
     /// **MADV_RANDOM**
     ///
     /// Expect page references in random order.  (Hence, read
     /// ahead may be less useful than normally.)
-    pub fn random() -> Self {
-        Self(libc::MADV_RANDOM)
-    }
+    Random = libc::MADV_RANDOM,
 
     /// **MADV_SEQUENTIAL**
     ///
     /// Expect page references in sequential order.  (Hence, pages
     /// in the given range can be aggressively read ahead, and may
     /// be freed soon after they are accessed.)
-    pub fn sequential() -> Self {
-        Self(libc::MADV_SEQUENTIAL)
-    }
+    Sequential = libc::MADV_SEQUENTIAL,
 
     /// **MADV_WILLNEED**
     ///
     /// Expect access in the near future.  (Hence, it might be a
     /// good idea to read some pages ahead.)
-    pub fn will_need() -> Self {
-        Self(libc::MADV_WILLNEED)
-    }
-
-    /// **MADV_DONTNEED**
-    ///
-    /// Do not expect access in the near future.  (For the time
-    /// being, the application is finished with the given range,
-    /// so the kernel can free resources associated with it.)
-    ///
-    /// After a successful MADV_DONTNEED operation, the semantics
-    /// of memory access in the specified region are changed:
-    /// subsequent accesses of pages in the range will succeed,
-    /// but will result in either repopulating the memory contents
-    /// from the up-to-date contents of the underlying mapped file
-    /// (for shared file mappings, shared anonymous mappings, and
-    /// shmem-based techniques such as System V shared memory
-    /// segments) or zero-fill-on-demand pages for anonymous
-    /// private mappings.
-    ///
-    /// Note that, when applied to shared mappings, MADV_DONTNEED
-    /// might not lead to immediate freeing of the pages in the
-    /// range.  The kernel is free to delay freeing the pages
-    /// until an appropriate moment.  The resident set size (RSS)
-    /// of the calling process will be immediately reduced
-    /// however.
-    ///
-    /// **MADV_DONTNEED** cannot be applied to locked pages, Huge TLB
-    /// pages, or VM_PFNMAP pages.  (Pages marked with the kernel-
-    /// internal VM_PFNMAP flag are special memory areas that are
-    /// not managed by the virtual memory subsystem.  Such pages
-    /// are typically created by device drivers that map the pages
-    /// into user space.)
-    ///
-    /// # Safety
-    ///
-    /// Using the returned value with conceptually write to the
-    /// mapped pages, i.e. borrowing the mapping when the pages
-    /// are freed results in undefined behaviour.
-    pub unsafe fn dont_need() -> Self {
-        Self(libc::MADV_DONTNEED)
-    }
-
-    //
-    // The rest are Linux-specific
-    //
-    /// **MADV_FREE** - Linux (since Linux 4.5) and Darwin
-    ///
-    /// The application no longer requires the pages in the range
-    /// specified by addr and len.  The kernel can thus free these
-    /// pages, but the freeing could be delayed until memory
-    /// pressure occurs.  For each of the pages that has been
-    /// marked to be freed but has not yet been freed, the free
-    /// operation will be canceled if the caller writes into the
-    /// page.  After a successful MADV_FREE operation, any stale
-    /// data (i.e., dirty, unwritten pages) will be lost when the
-    /// kernel frees the pages.  However, subsequent writes to
-    /// pages in the range will succeed and then kernel cannot
-    /// free those dirtied pages, so that the caller can always
-    /// see just written data.  If there is no subsequent write,
-    /// the kernel can free the pages at any time.  Once pages in
-    /// the range have been freed, the caller will see zero-fill-
-    /// on-demand pages upon subsequent page references.
-    ///
-    /// The MADV_FREE operation can be applied only to private
-    /// anonymous pages (see mmap(2)).  In Linux before version
-    /// 4.12, when freeing pages on a swapless system, the pages
-    /// in the given range are freed instantly, regardless of
-    /// memory pressure.
-    ///
-    /// # Safety
-    ///
-    /// Using the returned value with conceptually write to the
-    /// mapped pages, i.e. borrowing the mapping while the pages
-    /// are still being freed results in undefined behaviour.
-    #[cfg(any(target_os = "linux", target_os = "macos", target_os = "ios"))]
-    pub unsafe fn free() -> Self {
-        Self(libc::MADV_FREE)
-    }
-
-    /// **MADV_REMOVE** - Linux only (since Linux 2.6.16)
-    ///
-    /// Free up a given range of pages and its associated backing
-    /// store.  This is equivalent to punching a hole in the
-    /// corresponding byte range of the backing store (see
-    /// fallocate(2)).  Subsequent accesses in the specified
-    /// address range will see bytes containing zero.
-    ///
-    /// The specified address range must be mapped shared and
-    /// writable.  This flag cannot be applied to locked pages,
-    /// Huge TLB pages, or VM_PFNMAP pages.
-    ///
-    /// In the initial implementation, only tmpfs(5) was supported
-    /// **MADV_REMOVE**; but since Linux 3.5, any filesystem which
-    /// supports the fallocate(2) FALLOC_FL_PUNCH_HOLE mode also
-    /// supports MADV_REMOVE.  Hugetlbfs fails with the error
-    /// EINVAL and other filesystems fail with the error
-    /// EOPNOTSUPP.
-    ///
-    /// # Safety
-    ///
-    /// Using the returned value with conceptually write to the
-    /// mapped pages, i.e. borrowing the mapping when the pages
-    /// are freed results in undefined behaviour.
-    #[cfg(target_os = "linux")]
-    pub unsafe fn remove() -> Self {
-        Self(libc::MADV_REMOVE)
-    }
+    WillNeed = libc::MADV_WILLNEED,
 
     /// **MADV_DONTFORK** - Linux only (since Linux 2.6.16)
     ///
@@ -150,18 +37,14 @@
     /// relocations cause problems for hardware that DMAs into the
     /// page.)
     #[cfg(target_os = "linux")]
-    pub fn dont_fork() -> Self {
-        Self(libc::MADV_DONTFORK)
-    }
+    DontFork = libc::MADV_DONTFORK,
 
     /// **MADV_DOFORK** - Linux only (since Linux 2.6.16)
     ///
     /// Undo the effect of MADV_DONTFORK, restoring the default
     /// behavior, whereby a mapping is inherited across fork(2).
     #[cfg(target_os = "linux")]
-    pub fn do_fork() -> Self {
-        Self(libc::MADV_DOFORK)
-    }
+    DoFork = libc::MADV_DOFORK,
 
     /// **MADV_MERGEABLE** - Linux only (since Linux 2.6.32)
     ///
@@ -184,9 +67,7 @@
     /// available only if the kernel was configured with
     /// CONFIG_KSM.
     #[cfg(target_os = "linux")]
-    pub fn mergeable() -> Self {
-        Self(libc::MADV_MERGEABLE)
-    }
+    Mergeable = libc::MADV_MERGEABLE,
 
     /// **MADV_UNMERGEABLE** - Linux only (since Linux 2.6.32)
     ///
@@ -195,9 +76,7 @@
     /// it had merged in the address range specified by addr and
     /// length.
     #[cfg(target_os = "linux")]
-    pub fn unmergeable() -> Self {
-        Self(libc::MADV_UNMERGEABLE)
-    }
+    Unmergeable = libc::MADV_UNMERGEABLE,
 
     /// **MADV_HUGEPAGE** - Linux only (since Linux 2.6.38)
     ///
@@ -236,18 +115,14 @@
     /// available only if the kernel was configured with
     /// CONFIG_TRANSPARENT_HUGEPAGE.
     #[cfg(target_os = "linux")]
-    pub fn huge_page() -> Self {
-        Self(libc::MADV_HUGEPAGE)
-    }
+    HugePage = libc::MADV_HUGEPAGE,
 
     /// **MADV_NOHUGEPAGE** - Linux only (since Linux 2.6.38)
     ///
     /// Ensures that memory in the address range specified by addr
     /// and length will not be backed by transparent hugepages.
     #[cfg(target_os = "linux")]
-    pub fn no_huge_page() -> Self {
-        Self(libc::MADV_NOHUGEPAGE)
-    }
+    NoHugePage = libc::MADV_NOHUGEPAGE,
 
     /// **MADV_DONTDUMP** - Linux only (since Linux 3.4)
     ///
@@ -259,17 +134,13 @@
     /// set via the `/proc/[pid]/coredump_filter` file (see
     /// core(5)).
     #[cfg(target_os = "linux")]
-    pub fn dont_dump() -> Self {
-        Self(libc::MADV_DONTDUMP)
-    }
+    DontDump = libc::MADV_DONTDUMP,
 
     /// **MADV_DODUMP** - Linux only (since Linux 3.4)
     ///
     /// Undo the effect of an earlier MADV_DONTDUMP.
     #[cfg(target_os = "linux")]
-    pub fn do_dump() -> Self {
-        Self(libc::MADV_DODUMP)
-    }
+    DoDump = libc::MADV_DODUMP,
 
     /// **MADV_HWPOISON** - Linux only (since Linux 2.6.32)
     ///
@@ -284,9 +155,7 @@
     /// handling code; it is available only if the kernel was
     /// configured with CONFIG_MEMORY_FAILURE.
     #[cfg(target_os = "linux")]
-    pub fn hw_poison() -> Self {
-        Self(libc::MADV_HWPOISON)
-    }
+    HwPoison = libc::MADV_HWPOISON,
 
     /// **MADV_POPULATE_READ** - Linux only (since Linux 5.14)
     ///
@@ -321,9 +190,7 @@
     /// Note  that with MADV_POPULATE_READ, the process can be killed
     /// at any moment when the system runs out of memory.
     #[cfg(target_os = "linux")]
-    pub fn populate_read() -> Self {
-        Self(libc::MADV_POPULATE_READ)
-    }
+    PopulateRead = libc::MADV_POPULATE_READ,
 
     /// **MADV_POPULATE_WRITE** - Linux only (since Linux 5.14)
     ///
@@ -355,9 +222,7 @@
     /// Note that with MADV_POPULATE_WRITE, the process can be killed
     /// at any moment when the system runs out of memory.
     #[cfg(target_os = "linux")]
-    pub fn populate_write() -> Self {
-        Self(libc::MADV_POPULATE_WRITE)
-    }
+    PopulateWrite = libc::MADV_POPULATE_WRITE,
 
     /// **MADV_ZERO_WIRED_PAGES** - Darwin only
     ///
@@ -366,9 +231,123 @@
     /// a munmap(2) without a preceding munlock(2) or the application quits).  This is used
     /// with madvise() system call.
     #[cfg(any(target_os = "macos", target_os = "ios"))]
-    pub fn zero_wired_pages() -> Self {
-        Self(libc::MADV_ZERO_WIRED_PAGES)
-    }
+    ZeroWiredPages = libc::MADV_ZERO_WIRED_PAGES,
+}
+
+/// Values supported by [`Mmap::unsafe_advise`][crate::Mmap::unsafe_advise] and [`MmapMut::unsafe_advise`][crate::MmapMut::unsafe_advise] functions.
+///
+/// These flags can be passed to the [madvise (2)][man_page] system call
+/// and effects on the mapped pages which are conceptually writes,
+/// i.e. the change the observable contents of these pages which
+/// implies undefined behaviour if the mapping is still borrowed.
+///
+/// Hence, these potentially unsafe flags must be used with the unsafe
+/// methods and the programmer has to justify that the code
+/// does not keep any borrows of the mapping active while the mapped pages
+/// are updated by the kernel's memory management subsystem.
+///
+/// [man_page]: https://man7.org/linux/man-pages/man2/madvise.2.html
+#[repr(i32)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
+pub enum UncheckedAdvice {
+    /// **MADV_DONTNEED**
+    ///
+    /// Do not expect access in the near future.  (For the time
+    /// being, the application is finished with the given range,
+    /// so the kernel can free resources associated with it.)
+    ///
+    /// After a successful MADV_DONTNEED operation, the semantics
+    /// of memory access in the specified region are changed:
+    /// subsequent accesses of pages in the range will succeed,
+    /// but will result in either repopulating the memory contents
+    /// from the up-to-date contents of the underlying mapped file
+    /// (for shared file mappings, shared anonymous mappings, and
+    /// shmem-based techniques such as System V shared memory
+    /// segments) or zero-fill-on-demand pages for anonymous
+    /// private mappings.
+    ///
+    /// Note that, when applied to shared mappings, MADV_DONTNEED
+    /// might not lead to immediate freeing of the pages in the
+    /// range.  The kernel is free to delay freeing the pages
+    /// until an appropriate moment.  The resident set size (RSS)
+    /// of the calling process will be immediately reduced
+    /// however.
+    ///
+    /// **MADV_DONTNEED** cannot be applied to locked pages, Huge TLB
+    /// pages, or VM_PFNMAP pages.  (Pages marked with the kernel-
+    /// internal VM_PFNMAP flag are special memory areas that are
+    /// not managed by the virtual memory subsystem.  Such pages
+    /// are typically created by device drivers that map the pages
+    /// into user space.)
+    ///
+    /// # Safety
+    ///
+    /// Using the returned value with conceptually write to the
+    /// mapped pages, i.e. borrowing the mapping when the pages
+    /// are freed results in undefined behaviour.
+    DontNeed = libc::MADV_DONTNEED,
+
+    //
+    // The rest are Linux-specific
+    //
+    /// **MADV_FREE** - Linux (since Linux 4.5) and Darwin
+    ///
+    /// The application no longer requires the pages in the range
+    /// specified by addr and len.  The kernel can thus free these
+    /// pages, but the freeing could be delayed until memory
+    /// pressure occurs.  For each of the pages that has been
+    /// marked to be freed but has not yet been freed, the free
+    /// operation will be canceled if the caller writes into the
+    /// page.  After a successful MADV_FREE operation, any stale
+    /// data (i.e., dirty, unwritten pages) will be lost when the
+    /// kernel frees the pages.  However, subsequent writes to
+    /// pages in the range will succeed and then kernel cannot
+    /// free those dirtied pages, so that the caller can always
+    /// see just written data.  If there is no subsequent write,
+    /// the kernel can free the pages at any time.  Once pages in
+    /// the range have been freed, the caller will see zero-fill-
+    /// on-demand pages upon subsequent page references.
+    ///
+    /// The MADV_FREE operation can be applied only to private
+    /// anonymous pages (see mmap(2)).  In Linux before version
+    /// 4.12, when freeing pages on a swapless system, the pages
+    /// in the given range are freed instantly, regardless of
+    /// memory pressure.
+    ///
+    /// # Safety
+    ///
+    /// Using the returned value with conceptually write to the
+    /// mapped pages, i.e. borrowing the mapping while the pages
+    /// are still being freed results in undefined behaviour.
+    #[cfg(any(target_os = "linux", target_os = "macos", target_os = "ios"))]
+    Free = libc::MADV_FREE,
+
+    /// **MADV_REMOVE** - Linux only (since Linux 2.6.16)
+    ///
+    /// Free up a given range of pages and its associated backing
+    /// store.  This is equivalent to punching a hole in the
+    /// corresponding byte range of the backing store (see
+    /// fallocate(2)).  Subsequent accesses in the specified
+    /// address range will see bytes containing zero.
+    ///
+    /// The specified address range must be mapped shared and
+    /// writable.  This flag cannot be applied to locked pages,
+    /// Huge TLB pages, or VM_PFNMAP pages.
+    ///
+    /// In the initial implementation, only tmpfs(5) was supported
+    /// **MADV_REMOVE**; but since Linux 3.5, any filesystem which
+    /// supports the fallocate(2) FALLOC_FL_PUNCH_HOLE mode also
+    /// supports MADV_REMOVE.  Hugetlbfs fails with the error
+    /// EINVAL and other filesystems fail with the error
+    /// EOPNOTSUPP.
+    ///
+    /// # Safety
+    ///
+    /// Using the returned value with conceptually write to the
+    /// mapped pages, i.e. borrowing the mapping when the pages
+    /// are freed results in undefined behaviour.
+    #[cfg(target_os = "linux")]
+    Remove = libc::MADV_REMOVE,
 
     /// **MADV_FREE_REUSABLE** - Darwin only
     ///
@@ -380,9 +359,7 @@
     /// mapped pages, i.e. borrowing the mapping while the pages
     /// are still being freed results in undefined behaviour.
     #[cfg(any(target_os = "macos", target_os = "ios"))]
-    pub unsafe fn free_reusable() -> Self {
-        Self(libc::MADV_FREE_REUSABLE)
-    }
+    FreeReusable = libc::MADV_FREE_REUSABLE,
 
     /// **MADV_FREE_REUSE** - Darwin only
     ///
@@ -396,9 +373,7 @@
     /// mapped pages, i.e. borrowing the mapping while the pages
     /// are still being freed results in undefined behaviour.
     #[cfg(any(target_os = "macos", target_os = "ios"))]
-    pub unsafe fn free_reuse() -> Self {
-        Self(libc::MADV_FREE_REUSE)
-    }
+    FreeReuse = libc::MADV_FREE_REUSE,
 }
 
 // Future expansion:
@@ -407,3 +382,41 @@
 // MADV_KEEPONFORK  (since Linux 4.14)
 // MADV_COLD  (since Linux 5.4)
 // MADV_PAGEOUT  (since Linux 5.4)
+
+#[cfg(target_os = "linux")]
+impl Advice {
+    /// Performs a runtime check if this advice is supported by the kernel.
+    /// Only supported on Linux. See the [`madvise(2)`] man page.
+    ///
+    /// [`madvise(2)`]: https://man7.org/linux/man-pages/man2/madvise.2.html#VERSIONS
+    pub fn is_supported(self) -> bool {
+        (unsafe { libc::madvise(std::ptr::null_mut(), 0, self as libc::c_int) }) == 0
+    }
+}
+
+#[cfg(target_os = "linux")]
+impl UncheckedAdvice {
+    /// Performs a runtime check if this advice is supported by the kernel.
+    /// Only supported on Linux. See the [`madvise(2)`] man page.
+    ///
+    /// [`madvise(2)`]: https://man7.org/linux/man-pages/man2/madvise.2.html#VERSIONS
+    pub fn is_supported(self) -> bool {
+        (unsafe { libc::madvise(std::ptr::null_mut(), 0, self as libc::c_int) }) == 0
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    #[cfg(target_os = "linux")]
+    #[test]
+    fn test_is_supported() {
+        use super::*;
+
+        assert!(Advice::Normal.is_supported());
+        assert!(Advice::Random.is_supported());
+        assert!(Advice::Sequential.is_supported());
+        assert!(Advice::WillNeed.is_supported());
+
+        assert!(UncheckedAdvice::DontNeed.is_supported());
+    }
+}
diff --git a/crates/memmap2/src/lib.rs b/crates/memmap2/src/lib.rs
index 61239be..94dba24 100644
--- a/crates/memmap2/src/lib.rs
+++ b/crates/memmap2/src/lib.rs
@@ -47,7 +47,7 @@
 #[cfg(unix)]
 mod advice;
 #[cfg(unix)]
-pub use crate::advice::Advice;
+pub use crate::advice::{Advice, UncheckedAdvice};
 
 use std::fmt;
 #[cfg(not(any(unix, windows)))]
@@ -140,6 +140,7 @@
 pub struct MmapOptions {
     offset: u64,
     len: Option<usize>,
+    huge: Option<u8>,
     stack: bool,
     populate: bool,
 }
@@ -281,6 +282,32 @@
         self
     }
 
+    /// Configures the anonymous memory map to be allocated using huge pages.
+    ///
+    /// This option corresponds to the `MAP_HUGETLB` flag on Linux. It has no effect on Windows.
+    ///
+    /// The size of the requested page can be specified in page bits. If not provided, the system
+    /// default is requested. The requested length should be a multiple of this, or the mapping
+    /// will fail.
+    ///
+    /// This option has no effect on file-backed memory maps.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// use memmap2::MmapOptions;
+    ///
+    /// # fn main() -> std::io::Result<()> {
+    /// let stack = MmapOptions::new().huge(Some(21)).len(2*1024*1024).map_anon();
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// The number 21 corresponds to `MAP_HUGE_2MB`. See mmap(2) for more details.
+    pub fn huge(&mut self, page_bits: Option<u8>) -> &mut Self {
+        self.huge = Some(page_bits.unwrap_or(0));
+        self
+    }
     /// Populate (prefault) page tables for a mapping.
     ///
     /// For a file mapping, this causes read-ahead on the file. This will help to reduce blocking on page faults later.
@@ -311,6 +338,10 @@
 
     /// Creates a read-only memory map backed by a file.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][MmapOptions] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -346,6 +377,10 @@
 
     /// Creates a readable and executable memory map backed by a file.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][MmapOptions] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -359,6 +394,10 @@
 
     /// Creates a writeable memory map backed by a file.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][MmapOptions] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -402,6 +441,10 @@
     /// Data written to the memory map will not be visible by other processes,
     /// and will not be carried through to the underlying file.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][MmapOptions] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -430,6 +473,10 @@
 
     /// Creates a copy-on-write read-only memory map backed by a file.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][MmapOptions] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -484,7 +531,8 @@
             ));
         }
 
-        MmapInner::map_anon(len, self.stack, self.populate).map(|inner| MmapMut { inner })
+        MmapInner::map_anon(len, self.stack, self.populate, self.huge)
+            .map(|inner| MmapMut { inner })
     }
 
     /// Creates a raw memory map.
@@ -533,6 +581,8 @@
 ///
 /// `Mmap` is [`Sync`] and [`Send`].
 ///
+/// See [`MmapMut`] for the mutable version.
+///
 /// ## Safety
 ///
 /// All file-backed memory map constructors are marked `unsafe` because of the potential for
@@ -556,8 +606,6 @@
 /// # }
 /// ```
 ///
-/// See [`MmapMut`] for the mutable version.
-///
 /// [`map()`]: Mmap::map()
 pub struct Mmap {
     inner: MmapInner,
@@ -568,6 +616,10 @@
     ///
     /// This is equivalent to calling `MmapOptions::new().map(file)`.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][Mmap] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -639,24 +691,55 @@
         Ok(MmapMut { inner: self.inner })
     }
 
-    /// Advise OS how this memory map will be accessed. Only supported on Unix.
-    ///
-    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
-    #[cfg(unix)]
-    pub fn advise(&self, advice: Advice) -> Result<()> {
-        self.inner.advise(advice, 0, self.inner.len())
-    }
-
-    /// Advise OS how this range of memory map will be accessed.
-    ///
-    /// The offset and length must be in the bounds of the memory map.
+    /// Advise OS how this memory map will be accessed.
     ///
     /// Only supported on Unix.
     ///
     /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
     #[cfg(unix)]
+    pub fn advise(&self, advice: Advice) -> Result<()> {
+        self.inner
+            .advise(advice as libc::c_int, 0, self.inner.len())
+    }
+
+    /// Advise OS how this memory map will be accessed.
+    ///
+    /// Used with the [unchecked flags][UncheckedAdvice]. Only supported on Unix.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
+    pub unsafe fn unchecked_advise(&self, advice: UncheckedAdvice) -> Result<()> {
+        self.inner
+            .advise(advice as libc::c_int, 0, self.inner.len())
+    }
+
+    /// Advise OS how this range of memory map will be accessed.
+    ///
+    /// Only supported on Unix.
+    ///
+    /// The offset and length must be in the bounds of the memory map.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
     pub fn advise_range(&self, advice: Advice, offset: usize, len: usize) -> Result<()> {
-        self.inner.advise(advice, offset, len)
+        self.inner.advise(advice as libc::c_int, offset, len)
+    }
+
+    /// Advise OS how this range of memory map will be accessed.
+    ///
+    /// Used with the [unchecked flags][UncheckedAdvice]. Only supported on Unix.
+    ///
+    /// The offset and length must be in the bounds of the memory map.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
+    pub unsafe fn unchecked_advise_range(
+        &self,
+        advice: UncheckedAdvice,
+        offset: usize,
+        len: usize,
+    ) -> Result<()> {
+        self.inner.advise(advice as libc::c_int, offset, len)
     }
 
     /// Lock the whole memory map into RAM. Only supported on Unix.
@@ -730,6 +813,9 @@
 ///
 /// This struct never hands out references to its interior, only raw pointers.
 /// This can be helpful when creating shared memory maps between untrusted processes.
+///
+/// For the safety concerns that arise when converting these raw pointers to references,
+/// see the [`Mmap`] safety documentation.
 pub struct MmapRaw {
     inner: MmapInner,
 }
@@ -852,12 +938,26 @@
         self.inner.flush_async(offset, len)
     }
 
-    /// Advise OS how this memory map will be accessed. Only supported on Unix.
+    /// Advise OS how this memory map will be accessed.
+    ///
+    /// Only supported on Unix.
     ///
     /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
     #[cfg(unix)]
     pub fn advise(&self, advice: Advice) -> Result<()> {
-        self.inner.advise(advice, 0, self.inner.len())
+        self.inner
+            .advise(advice as libc::c_int, 0, self.inner.len())
+    }
+
+    /// Advise OS how this memory map will be accessed.
+    ///
+    /// Used with the [unchecked flags][UncheckedAdvice]. Only supported on Unix.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
+    pub unsafe fn unchecked_advise(&self, advice: UncheckedAdvice) -> Result<()> {
+        self.inner
+            .advise(advice as libc::c_int, 0, self.inner.len())
     }
 
     /// Advise OS how this range of memory map will be accessed.
@@ -869,7 +969,24 @@
     /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
     #[cfg(unix)]
     pub fn advise_range(&self, advice: Advice, offset: usize, len: usize) -> Result<()> {
-        self.inner.advise(advice, offset, len)
+        self.inner.advise(advice as libc::c_int, offset, len)
+    }
+
+    /// Advise OS how this range of memory map will be accessed.
+    ///
+    /// Used with the [unchecked flags][UncheckedAdvice]. Only supported on Unix.
+    ///
+    /// The offset and length must be in the bounds of the memory map.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
+    pub unsafe fn unchecked_advise_range(
+        &self,
+        advice: UncheckedAdvice,
+        offset: usize,
+        len: usize,
+    ) -> Result<()> {
+        self.inner.advise(advice as libc::c_int, offset, len)
     }
 
     /// Lock the whole memory map into RAM. Only supported on Unix.
@@ -948,7 +1065,7 @@
 /// Dereferencing and accessing the bytes of the buffer may result in page faults (e.g. swapping
 /// the mapped pages into physical memory) though the details of this are platform specific.
 ///
-/// `Mmap` is [`Sync`] and [`Send`].
+/// `MmapMut` is [`Sync`] and [`Send`].
 ///
 /// See [`Mmap`] for the immutable version.
 ///
@@ -968,6 +1085,10 @@
     ///
     /// This is equivalent to calling `MmapOptions::new().map_mut(file)`.
     ///
+    /// # Safety
+    ///
+    /// See the [type-level][MmapMut] docs for why this function is unsafe.
+    ///
     /// # Errors
     ///
     /// This method returns an error when the underlying system call fails, which can happen for a
@@ -1142,24 +1263,55 @@
         Ok(Mmap { inner: self.inner })
     }
 
-    /// Advise OS how this memory map will be accessed. Only supported on Unix.
-    ///
-    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
-    #[cfg(unix)]
-    pub fn advise(&self, advice: Advice) -> Result<()> {
-        self.inner.advise(advice, 0, self.inner.len())
-    }
-
-    /// Advise OS how this range of memory map will be accessed.
-    ///
-    /// The offset and length must be in the bounds of the memory map.
+    /// Advise OS how this memory map will be accessed.
     ///
     /// Only supported on Unix.
     ///
     /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
     #[cfg(unix)]
+    pub fn advise(&self, advice: Advice) -> Result<()> {
+        self.inner
+            .advise(advice as libc::c_int, 0, self.inner.len())
+    }
+
+    /// Advise OS how this memory map will be accessed.
+    ///
+    /// Used with the [unchecked flags][UncheckedAdvice]. Only supported on Unix.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
+    pub unsafe fn unchecked_advise(&self, advice: UncheckedAdvice) -> Result<()> {
+        self.inner
+            .advise(advice as libc::c_int, 0, self.inner.len())
+    }
+
+    /// Advise OS how this range of memory map will be accessed.
+    ///
+    /// Only supported on Unix.
+    ///
+    /// The offset and length must be in the bounds of the memory map.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
     pub fn advise_range(&self, advice: Advice, offset: usize, len: usize) -> Result<()> {
-        self.inner.advise(advice, offset, len)
+        self.inner.advise(advice as libc::c_int, offset, len)
+    }
+
+    /// Advise OS how this range of memory map will be accessed.
+    ///
+    /// Used with the [unchecked flags][UncheckedAdvice]. Only supported on Unix.
+    ///
+    /// The offset and length must be in the bounds of the memory map.
+    ///
+    /// See [madvise()](https://man7.org/linux/man-pages/man2/madvise.2.html) map page.
+    #[cfg(unix)]
+    pub fn unchecked_advise_range(
+        &self,
+        advice: UncheckedAdvice,
+        offset: usize,
+        len: usize,
+    ) -> Result<()> {
+        self.inner.advise(advice as libc::c_int, offset, len)
     }
 
     /// Lock the whole memory map into RAM. Only supported on Unix.
@@ -1816,7 +1968,7 @@
 
         // Test MmapMut::advise
         let mut mmap = unsafe { MmapMut::map_mut(&file).unwrap() };
-        mmap.advise(Advice::random())
+        mmap.advise(Advice::Random)
             .expect("mmap advising should be supported on unix");
 
         let len = mmap.len();
@@ -1828,7 +1980,7 @@
         // check that the mmap is empty
         assert_eq!(&zeros[..], &mmap[..]);
 
-        mmap.advise_range(Advice::sequential(), 0, mmap.len())
+        mmap.advise_range(Advice::Sequential, 0, mmap.len())
             .expect("mmap advising should be supported on unix");
 
         // write values into the mmap
@@ -1840,7 +1992,7 @@
         // Set advice and Read from the read-only map
         let mmap = unsafe { Mmap::map(&file).unwrap() };
 
-        mmap.advise(Advice::random())
+        mmap.advise(Advice::Random)
             .expect("mmap advising should be supported on unix");
 
         // read values back
@@ -1850,18 +2002,47 @@
     #[test]
     #[cfg(target_os = "linux")]
     fn advise_writes_unsafely() {
-        let mut mmap = MmapMut::map_anon(4096).unwrap();
+        let page_size = unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize };
+
+        let mut mmap = MmapMut::map_anon(page_size).unwrap();
         mmap.as_mut().fill(255);
         let mmap = mmap.make_read_only().unwrap();
 
         let a = mmap.as_ref()[0];
-        mmap.advise(unsafe { Advice::dont_need() }).unwrap();
+        unsafe {
+            mmap.unchecked_advise(crate::UncheckedAdvice::DontNeed)
+                .unwrap();
+        }
         let b = mmap.as_ref()[0];
 
         assert_eq!(a, 255);
         assert_eq!(b, 0);
     }
 
+    #[test]
+    #[cfg(target_os = "linux")]
+    fn advise_writes_unsafely_to_part_of_map() {
+        let page_size = unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize };
+
+        let mut mmap = MmapMut::map_anon(2 * page_size).unwrap();
+        mmap.as_mut().fill(255);
+        let mmap = mmap.make_read_only().unwrap();
+
+        let a = mmap.as_ref()[0];
+        let b = mmap.as_ref()[page_size];
+        unsafe {
+            mmap.unchecked_advise_range(crate::UncheckedAdvice::DontNeed, page_size, page_size)
+                .unwrap();
+        }
+        let c = mmap.as_ref()[0];
+        let d = mmap.as_ref()[page_size];
+
+        assert_eq!(a, 255);
+        assert_eq!(b, 255);
+        assert_eq!(c, 255);
+        assert_eq!(d, 0);
+    }
+
     /// Returns true if a non-zero amount of memory is locked.
     #[cfg(target_os = "linux")]
     fn is_locked() -> bool {
diff --git a/crates/memmap2/src/stub.rs b/crates/memmap2/src/stub.rs
index 3c6af0e..881983e 100644
--- a/crates/memmap2/src/stub.rs
+++ b/crates/memmap2/src/stub.rs
@@ -36,7 +36,7 @@
         MmapInner::new()
     }
 
-    pub fn map_anon(_: usize, _: bool, _: bool) -> io::Result<MmapInner> {
+    pub fn map_anon(_: usize, _: bool, _: bool, _: Option<u8>) -> io::Result<MmapInner> {
         MmapInner::new()
     }
 
diff --git a/crates/memmap2/src/unix.rs b/crates/memmap2/src/unix.rs
index 3761b27..bd8fcf3 100644
--- a/crates/memmap2/src/unix.rs
+++ b/crates/memmap2/src/unix.rs
@@ -6,8 +6,6 @@
 use std::sync::atomic::{AtomicUsize, Ordering};
 use std::{io, ptr};
 
-use crate::advice::Advice;
-
 #[cfg(any(
     all(target_os = "linux", not(target_arch = "mips")),
     target_os = "freebsd",
@@ -28,6 +26,24 @@
 #[cfg(not(any(target_os = "linux", target_os = "android")))]
 const MAP_POPULATE: libc::c_int = 0;
 
+#[cfg(any(target_os = "linux", target_os = "android"))]
+const MAP_HUGETLB: libc::c_int = libc::MAP_HUGETLB;
+
+#[cfg(target_os = "linux")]
+const MAP_HUGE_MASK: libc::c_int = libc::MAP_HUGE_MASK;
+
+#[cfg(any(target_os = "linux", target_os = "android"))]
+const MAP_HUGE_SHIFT: libc::c_int = libc::MAP_HUGE_SHIFT;
+
+#[cfg(not(any(target_os = "linux", target_os = "android")))]
+const MAP_HUGETLB: libc::c_int = 0;
+
+#[cfg(not(target_os = "linux"))]
+const MAP_HUGE_MASK: libc::c_int = 0;
+
+#[cfg(not(any(target_os = "linux", target_os = "android")))]
+const MAP_HUGE_SHIFT: libc::c_int = 0;
+
 #[cfg(any(
     target_os = "android",
     all(target_os = "linux", not(target_env = "musl"))
@@ -263,15 +279,24 @@
     }
 
     /// Open an anonymous memory map.
-    pub fn map_anon(len: usize, stack: bool, populate: bool) -> io::Result<MmapInner> {
+    pub fn map_anon(
+        len: usize,
+        stack: bool,
+        populate: bool,
+        huge: Option<u8>,
+    ) -> io::Result<MmapInner> {
         let stack = if stack { MAP_STACK } else { 0 };
         let populate = if populate { MAP_POPULATE } else { 0 };
+        let hugetlb = if huge.is_some() { MAP_HUGETLB } else { 0 };
+        let offset = huge
+            .map(|mask| ((mask as u64) & (MAP_HUGE_MASK as u64)) << MAP_HUGE_SHIFT)
+            .unwrap_or(0);
         MmapInner::new(
             len,
             libc::PROT_READ | libc::PROT_WRITE,
-            libc::MAP_PRIVATE | libc::MAP_ANON | stack | populate,
+            libc::MAP_PRIVATE | libc::MAP_ANON | stack | populate | hugetlb,
             -1,
-            0,
+            offset,
         )
     }
 
@@ -342,12 +367,12 @@
         self.len
     }
 
-    pub fn advise(&self, advice: Advice, offset: usize, len: usize) -> io::Result<()> {
+    pub fn advise(&self, advice: libc::c_int, offset: usize, len: usize) -> io::Result<()> {
         let alignment = (self.ptr as usize + offset) % page_size();
         let offset = offset as isize - alignment as isize;
         let len = len + alignment;
         unsafe {
-            if libc::madvise(self.ptr.offset(offset), len, advice.0) != 0 {
+            if libc::madvise(self.ptr.offset(offset), len, advice) != 0 {
                 Err(io::Error::last_os_error())
             } else {
                 Ok(())
diff --git a/crates/memmap2/src/windows.rs b/crates/memmap2/src/windows.rs
index 5373369..8a87095 100644
--- a/crates/memmap2/src/windows.rs
+++ b/crates/memmap2/src/windows.rs
@@ -343,7 +343,12 @@
         Ok(inner)
     }
 
-    pub fn map_anon(len: usize, _stack: bool, _populate: bool) -> io::Result<MmapInner> {
+    pub fn map_anon(
+        len: usize,
+        _stack: bool,
+        _populate: bool,
+        _huge: Option<u8>,
+    ) -> io::Result<MmapInner> {
         // Ensure a non-zero length for the underlying mapping
         let mapped_len = len.max(1);
         unsafe {
diff --git a/crates/mockall/.android-checksum.json b/crates/mockall/.android-checksum.json
index b87a534..22d4f6c 100644
--- a/crates/mockall/.android-checksum.json
+++ b/crates/mockall/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"dc10d9c9b5bd0a9c2675dd95056cbf1e87cefa2949050178f894d56c1d334717","Android.bp":"3a8ba7ebb026eef9b590ddfe624187ad7a5e6d5799454f731eb8f8638858ced2","Cargo.lock":"e4509c62cc6a24ed42b4194df50570903fce055535663c1df67bc45f5dbb3679","Cargo.toml":"361ad14be093d664a6ba0029bae6a8f0168863035f45de61cd3f959507e2e64f","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"6b5826b96c0bd71ab1c5be4637f29c5bbb37369f6a65b4fe136b70c563ac7759","METADATA":"a606a79578df98faaa537f89cfc7e5b402d66c0479a444773a8c144523171c4b","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"0952521809cc6b25360d2feaad75bd8af07f6df6ac9e7d7dbdca7b6a1f35323a","cargo_embargo.json":"9a4b9e47683e1a6fc764b578f222c6271932aeb74af7bf217d239d47d3908f30","src/examples.rs":"b1f78397b7b749c8823290eed8d14f4561f88ba8c14a4a1b34c7d3b9114d7977","src/lib.rs":"c03ec4de8092c1899c454ea0e097e7497d1cc733a79ab3be74366b1a5c4fe737"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"287d43b6b773b53c1e250678c42f291beee9609c8fc057a335d4d76aa3ddb244","Android.bp":"236a27b31ef12a784ad7152dbf039ec9f91ac6799c67325b16ba967ed635a656","Cargo.toml":"a4c2597dabec68e89c075b14ae94edec7a70165591da3a3c301721ad76ae22ec","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"6b5826b96c0bd71ab1c5be4637f29c5bbb37369f6a65b4fe136b70c563ac7759","METADATA":"2039fa76ae02ee8b0b4c39872195d65e60eb013feba897be80a0bafa225b26da","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"b74eeee33f28deaa8735d8052afc9abb68714cfba8544a68104aea7abb7e20f1","cargo_embargo.json":"9a4b9e47683e1a6fc764b578f222c6271932aeb74af7bf217d239d47d3908f30","src/examples.rs":"b1f78397b7b749c8823290eed8d14f4561f88ba8c14a4a1b34c7d3b9114d7977","src/lib.rs":"048cf4bd319a335f0a211a29639c0ee475ac964e3cdd24bd5be19560e71150b4"}}
\ No newline at end of file
diff --git a/crates/mockall/.cargo-checksum.json b/crates/mockall/.cargo-checksum.json
index 389e819..bacd202 100644
--- a/crates/mockall/.cargo-checksum.json
+++ b/crates/mockall/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.lock":"a5dc7da98f75b2ce371f5061d43cdc5e5eec5553fbc0b1f639c48010b33bef0a","Cargo.toml":"b9ad36882e9e1ba059f20d6383b14f0d43a71ebc3e3377f0f9aeca3a71256cee","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"a6ba0ec436e84b1517c6371beb6db11eab6a8e4a39d895be8584fb2c65303b5a","README.md":"8007e913a12b76eba567b1052d91325246c757d2dab8842f68df9202b9157f37","src/examples.rs":"e409a2e3e30ddfe20d2eafd922116d306169c0b3db6b5bd89964c786d743a924","src/lib.rs":"14baee6939ae7136d2ff57d5223b945559bbf57b1e73eff2af8865c230193f60"},"package":"43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48"}
\ No newline at end of file
+{"files":{"Cargo.toml":"767b1b5a26e33421cd3570866af7ef875ecffbef5951c825ca9329a471f55932","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"a6ba0ec436e84b1517c6371beb6db11eab6a8e4a39d895be8584fb2c65303b5a","README.md":"5e9cf5df381680b492510e9a552d0ef14917b6bcce6d3f29e4aee427df4b8e81","src/examples.rs":"e409a2e3e30ddfe20d2eafd922116d306169c0b3db6b5bd89964c786d743a924","src/lib.rs":"9b24ef9fd14bb7104ad4ab31cf19f402950091ca8295d93230289199f49e7f3b"},"package":"39a6bfcc6c8c7eed5ee98b9c3e33adc726054389233e201c95dab2d41a3839d2"}
\ No newline at end of file
diff --git a/crates/mockall/Android.bp b/crates/mockall/Android.bp
index 07e8e6d..9884edc 100644
--- a/crates/mockall/Android.bp
+++ b/crates/mockall/Android.bp
@@ -18,14 +18,13 @@
     host_supported: true,
     crate_name: "mockall",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.12.1",
+    cargo_pkg_version: "0.13.1",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
         "libcfg_if",
         "libdowncast",
         "libfragile",
-        "liblazy_static",
         "libpredicates",
         "libpredicates_tree",
     ],
diff --git a/crates/mockall/Cargo.lock b/crates/mockall/Cargo.lock
deleted file mode 100644
index 83f8848..0000000
--- a/crates/mockall/Cargo.lock
+++ /dev/null
@@ -1,374 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "anstyle"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
-
-[[package]]
-name = "async-trait"
-version = "0.1.73"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "downcast"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
-
-[[package]]
-name = "either"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
-
-[[package]]
-name = "fragile"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
-
-[[package]]
-name = "futures"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
-
-[[package]]
-name = "futures-task"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
-
-[[package]]
-name = "futures-util"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project-lite",
- "pin-utils",
- "slab",
-]
-
-[[package]]
-name = "itertools"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "memchr"
-version = "2.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
-
-[[package]]
-name = "mockall"
-version = "0.12.1"
-dependencies = [
- "async-trait",
- "cfg-if",
- "downcast",
- "fragile",
- "futures",
- "lazy_static",
- "mockall_derive",
- "mockall_double",
- "predicates",
- "predicates-tree",
- "serde",
- "serde_derive",
- "serde_json",
- "tracing",
-]
-
-[[package]]
-name = "mockall_derive"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2"
-dependencies = [
- "cfg-if",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "mockall_double"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1ca96e5ac35256ae3e13536edd39b172b88f41615e1d7b653c8ad24524113e8"
-dependencies = [
- "cfg-if",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "predicates"
-version = "3.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dfc28575c2e3f19cb3c73b93af36460ae898d426eba6fc15b9bd2a5220758a0"
-dependencies = [
- "anstyle",
- "itertools",
- "predicates-core",
-]
-
-[[package]]
-name = "predicates-core"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
-
-[[package]]
-name = "predicates-tree"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
-dependencies = [
- "predicates-core",
- "termtree",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.66"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
-
-[[package]]
-name = "serde"
-version = "1.0.188"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.188"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.106"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "termtree"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
-
-[[package]]
-name = "tracing"
-version = "0.1.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
-dependencies = [
- "cfg-if",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
diff --git a/crates/mockall/Cargo.toml b/crates/mockall/Cargo.toml
index a2275fe..35602f3 100644
--- a/crates/mockall/Cargo.toml
+++ b/crates/mockall/Cargo.toml
@@ -11,15 +11,21 @@
 
 [package]
 edition = "2021"
-rust-version = "1.60"
+rust-version = "1.71"
 name = "mockall"
-version = "0.12.1"
+version = "0.13.1"
 authors = ["Alan Somers <[email protected]>"]
+build = false
 exclude = [
     "examples/*",
     "tests/*",
     "tools/*",
 ]
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 A powerful mock object library for Rust.
 """
@@ -42,7 +48,7 @@
 
 [[package.metadata.release.pre-release-replacements]]
 file = "../README.md"
-replace = "mockall = \"{{version}}\""
+replace = 'mockall = "{{version}}"'
 search = 'mockall = "[a-z0-9\.-]+"'
 
 [[package.metadata.release.pre-release-replacements]]
@@ -55,10 +61,9 @@
 replace = "{{date}}"
 search = "ReleaseDate"
 
-[[example]]
-name = "serde"
-crate-type = ["lib"]
-path = "examples/serde.rs"
+[lib]
+name = "mockall"
+path = "src/lib.rs"
 
 [dependencies.cfg-if]
 version = "1.0"
@@ -69,11 +74,8 @@
 [dependencies.fragile]
 version = "2.0"
 
-[dependencies.lazy_static]
-version = "1.1"
-
 [dependencies.mockall_derive]
-version = "=0.12.1"
+version = "=0.13.1"
 
 [dependencies.predicates]
 version = "3.0.0"
@@ -85,6 +87,9 @@
 [dev-dependencies.async-trait]
 version = "0.1.38"
 
+[dev-dependencies.auto_enums]
+version = "0.8.5"
+
 [dev-dependencies.futures]
 version = "0.3.7"
 
@@ -92,16 +97,16 @@
 version = "^0.3.1"
 
 [dev-dependencies.serde]
-version = "1.0"
+version = "1.0.113"
 
 [dev-dependencies.serde_derive]
-version = "1.0"
+version = "1.0.113"
 
 [dev-dependencies.serde_json]
 version = "1.0"
 
 [dev-dependencies.tracing]
-version = "0.1.32"
+version = "0.1.35"
 
 [features]
 nightly = [
diff --git a/crates/mockall/METADATA b/crates/mockall/METADATA
index e823863..52455ec 100644
--- a/crates/mockall/METADATA
+++ b/crates/mockall/METADATA
@@ -1,17 +1,17 @@
 name: "mockall"
 description: "()"
 third_party {
-  version: "0.12.1"
+  version: "0.13.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 4
-    day: 25
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/mockall"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/mockall/mockall-0.12.1.crate"
-    version: "0.12.1"
+    value: "https://static.crates.io/crates/mockall/mockall-0.13.1.crate"
+    version: "0.13.1"
   }
 }
diff --git a/crates/mockall/README.md b/crates/mockall/README.md
index 91d2039..6284a09 100644
--- a/crates/mockall/README.md
+++ b/crates/mockall/README.md
@@ -29,7 +29,7 @@
 
 ```toml
 [dev-dependencies]
-mockall = "0.12.1"
+mockall = "0.13.1"
 ```
 
 Then use it like this:
@@ -62,7 +62,7 @@
 
 # Minimum Supported Rust Version (MSRV)
 
-Mockall is supported on Rust 1.64.0 and higher.  Mockall's MSRV will not be
+Mockall is supported on Rust 1.71.0 and higher.  Mockall's MSRV will not be
 changed in the future without bumping the major or minor version.
 
 # License
diff --git a/crates/mockall/src/lib.rs b/crates/mockall/src/lib.rs
index 742efb8..88b33dc 100644
--- a/crates/mockall/src/lib.rs
+++ b/crates/mockall/src/lib.rs
@@ -305,7 +305,7 @@
 //! specify the order by using a [`Sequence`].  Any expectations may be added to
 //! the same sequence.  They don't even need to come from the same object.
 //!
-//! ```should_panic(expected = "Method sequence violation")
+//! ```should_panic
 //! # use mockall::*;
 //! #[automock]
 //! trait Foo {
@@ -740,14 +740,14 @@
 //! ## Generic traits and structs
 //!
 //! Mocking generic structs and generic traits is not a problem.  The mock
-//! struct will be generic, too.  The same restrictions apply as with mocking
-//! generic methods: each generic parameter must be `'static`, and generic
-//! lifetime parameters are not allowed.
+//! struct will be generic, too.  As with generic methods, lifetime parameters
+//! are not allowed.  However, as long as the generic parameters are not used by
+//! any static methods, then the parameters need not be `'static'`.
 //!
 //! ```
 //! # use mockall::*;
 //! #[automock]
-//! trait Foo<T: 'static> {
+//! trait Foo<T> {
 //!     fn foo(&self, t: T) -> i32;
 //! }
 //!
@@ -899,7 +899,8 @@
 //! ### Generic static methods
 //!
 //! Mocking static methods of generic structs or traits, whether or not the
-//! methods themselves are generic, should work seamlessly.
+//! methods themselves are generic, should work seamlessly as long as the
+//! generic parameter is `'static`
 //!
 //! ```
 //! # use mockall::*;
@@ -1161,10 +1162,6 @@
 #[doc(hidden)]
 pub use fragile::Fragile;
 
-/// For mocking static methods
-#[doc(hidden)]
-pub use lazy_static::lazy_static;
-
 pub use predicates::{
     boolean::PredicateBooleanExt,
     prelude::{
@@ -1276,7 +1273,7 @@
 /// # Limitations
 ///
 /// `#[automock]` can't handle everything.  There are some cases where
-/// you will need to use [`mock`] instead:
+/// you will need to use [`mock!`] instead:
 /// * Mocking a struct that has multiple `impl` blocks, including
 ///   structs that implement traits.
 /// * Mocking a struct or trait defined in another crate.
@@ -1292,17 +1289,17 @@
 /// can't be mocked.  The downsides of using this attribute are:
 ///
 /// * Mockall can't tell if a parameter isn't `'static`, so you must annotate
-/// such methods with the `#[mockall::concretize]` attribute.
+///   such methods with the `#[mockall::concretize]` attribute.
 /// * Generic methods will share expectations for all argument types.  That is,
 ///   you won't be able to do `my_mock.expect_foo::<i32>(...)`.
 /// * It can't be used on methods with a closure argument (though this may be
-/// fixable).
+///   fixable).
 /// * Concretized methods' expectations may only be matched with `.withf` or
-/// `.withf_st`, not `.with`.
+///   `.withf_st`, not `.with`.
 /// * It only works for parameters that can be turned into a trait object.
-/// (may be fixable).
+///   (may be fixable).
 /// * Mockall needs to know how to turn the function argument into a trait
-/// object.  Given a generic parameter `T`, currently supported patterns are:
+///   object.  Given a generic parameter `T`, currently supported patterns are:
 ///   - `T`
 ///   - `&T`
 ///   - `&mut T`
@@ -1341,7 +1338,7 @@
 
 /// Manually mock a structure.
 ///
-/// Sometimes `automock` can't be used.  In those cases you can use `mock!`,
+/// Sometimes [`automock`] can't be used.  In those cases you can use `mock!`,
 /// which basically involves repeating the struct's or trait's definitions.
 ///
 /// The format is:
@@ -1371,7 +1368,7 @@
 /// }
 /// # fn main() {}
 /// ```
-/// Mocking an unsupported `#[derive(X)]` attribute, e.g. `Clone`, is
+/// Mocking an unsupported `#[derive(X)]` attribute, e.g. [`Clone`], is
 /// similar.
 /// ```
 /// # use mockall_derive::mock;
@@ -1395,8 +1392,8 @@
 /// ```
 /// # use mockall_derive::mock;
 /// mock!{
-///     pub Rc<T: 'static> {}
-///     impl<T: 'static> AsRef<T> for Rc<T> {
+///     pub Rc<T> {}
+///     impl<T> AsRef<T> for Rc<T> {
 ///         fn as_ref(&self) -> &T;
 ///     }
 /// }
@@ -1406,8 +1403,8 @@
 /// ```compile_fail
 /// # use mockall_derive::mock;
 /// mock!{
-///     pub Rc<Q: 'static> {}
-///     impl<T: 'static> AsRef<T> for Rc<T> {
+///     pub Rc<Q> {}
+///     impl<T> AsRef<T> for Rc<T> {
 ///         fn as_ref(&self) -> &T;
 ///     }
 /// }
@@ -1484,7 +1481,7 @@
 
 #[doc(hidden)]
 pub struct DebugPrint<'a, T: Debug>(pub &'a T);
-impl<'a, T> Debug for DebugPrint<'a, T> where T: Debug {
+impl<T> Debug for DebugPrint<'_, T> where T: Debug {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         Debug::fmt(self.0, f)
     }
@@ -1506,13 +1503,13 @@
 }
 #[doc(hidden)]
 pub trait ViaNothing { fn debug_string(&self) -> NothingPrint; }
-impl<'a, T> ViaNothing for ArgPrinter<'a, T> {
+impl<T> ViaNothing for ArgPrinter<'_, T> {
     fn debug_string(&self) -> NothingPrint {
         NothingPrint
     }
 }
 
-// Though it's not entirely correct, we treat usize::max_value() as
+// Though it's not entirely correct, we treat usize::MAX as
 // approximately infinity.
 #[derive(Debug)]
 #[doc(hidden)]
@@ -1521,7 +1518,7 @@
 impl Default for TimesRange {
     fn default() -> TimesRange {
         // By default, allow any number of calls
-        TimesRange(0..usize::max_value())
+        TimesRange(0..usize::MAX)
     }
 }
 
@@ -1540,13 +1537,13 @@
 
 impl From<RangeFrom<usize>> for TimesRange {
     fn from(r: RangeFrom<usize>) -> TimesRange {
-        TimesRange(r.start..usize::max_value())
+        TimesRange(r.start..usize::MAX)
     }
 }
 
 impl From<RangeFull> for TimesRange {
     fn from(_: RangeFull) -> TimesRange {
-        TimesRange(0..usize::max_value())
+        TimesRange(0..usize::MAX)
     }
 }
 
@@ -1605,7 +1602,7 @@
     }
 
     pub fn any(&mut self) {
-        self.range.0 = 0..usize::max_value();
+        self.range.0 = 0..usize::MAX;
     }
 
     /// Return how many times this expectation has been called
diff --git a/crates/no-panic/.android-checksum.json b/crates/no-panic/.android-checksum.json
index 1739cf2..b745728 100644
--- a/crates/no-panic/.android-checksum.json
+++ b/crates/no-panic/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"eb97545ac02b170f10608ed0563f2ae96d4bc3daf96704fc7f9491577495b178","Android.bp":"e795ce013cd8a4da1d99e43d01dbb6fd7e6dfb8a2277fac1aa538a71114e79d3","Cargo.toml":"f3c5940e337023a0c0f09fe3f18652a5552da6764fd3fb17c0e3026d8d1ccffa","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"ced85b82d611f1d639c2730e0bfdb9478c2d61085e023cc92628c4a112ab7530","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"a9d532dbef4bae285460087ff5e253ec66c1611de46795bb14fd78193eaee12b","TEST_MAPPING":"a1d98c3cfd1bbd4748193f02060efba5b9a53bbf4ed3e75fd1a46df8f344ad6d","build.rs":"85708d6adece84c1c1666595a6b9501f02cc5e1016aae8582e43c934f84b19cc","cargo_embargo.json":"e83649ca23319b8752e6eb8e784d06555c52745f166d66677beaac3d52b48eb4","src/lib.rs":"d729c8c0747ce89c60635306af3409d798a7ecd321c550f247609841c86fcb8d","tests/compiletest/mod.rs":"7e88f1c0dbd4e53138120be073eb944a2d33ee72f65eac203788a36743e1e278","tests/test.rs":"d9c3a19160b58e69b4eebcd2f5cb2d1c59f20672ba599de36cbca6e1d3eb7bb6","tests/ui/async-fn.rs":"f9444d0296ee3bb19c25996a1fdeb402f0c6a0ad982857eed4060fbd06aef7f6","tests/ui/async-fn.stderr":"403d15b204d7703d477afc27167bf7bf112b33433f8a75aebfd1e00020dcbfa5","tests/ui/trait-fn.rs":"906b5ac0a2c1a4df474b358784ad725e3d7abb2b61e60857e31c834a7637a1da","tests/ui/trait-fn.stderr":"9e2cd40a327a9c9e58124ec1b3dc3b1a37005724c5aa73e4aa92d8b2634b7917"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"869cf81d75b5a6264c134d2fe342b12bacb38cf7abc7d8449e071c9a0ab14811","Android.bp":"a1c2c0cf6978359cf2b704cb8289577f76db3e3f83d85a6c10d1b2b784a9efa1","Cargo.toml":"aa0eeabb4ac95a95e7a162a254d3cd84b15329d5bd866c550aa7c19db7cb4efa","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"d78795d44bf387a1d40d2bbbdb95009b52c419b21b58b18cd0b46ae734c43fc9","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"b520e5d0bea02ad6dd8b52f193fc2a7adc5eee9a299b8691046c95865b170a56","TEST_MAPPING":"a1d98c3cfd1bbd4748193f02060efba5b9a53bbf4ed3e75fd1a46df8f344ad6d","build.rs":"85708d6adece84c1c1666595a6b9501f02cc5e1016aae8582e43c934f84b19cc","cargo_embargo.json":"e83649ca23319b8752e6eb8e784d06555c52745f166d66677beaac3d52b48eb4","src/lib.rs":"aac92ca1bafaca509603d9f92060427479d0282090ba6ac325154ff1bb9dd02c","tests/compiletest/mod.rs":"7e88f1c0dbd4e53138120be073eb944a2d33ee72f65eac203788a36743e1e278","tests/test.rs":"d9c3a19160b58e69b4eebcd2f5cb2d1c59f20672ba599de36cbca6e1d3eb7bb6","tests/ui/async-fn.rs":"f9444d0296ee3bb19c25996a1fdeb402f0c6a0ad982857eed4060fbd06aef7f6","tests/ui/async-fn.stderr":"403d15b204d7703d477afc27167bf7bf112b33433f8a75aebfd1e00020dcbfa5","tests/ui/const-fn.rs":"f6aec18d4f08916f163f167cd4f83cdfe95a6b4f4019de5060d3e1d63428f1e0","tests/ui/const-fn.stderr":"fe08ebdf618720b6bf204d829de7cd8f4b259e99fb4d5b5591880a928259d7c5","tests/ui/trait-fn.rs":"906b5ac0a2c1a4df474b358784ad725e3d7abb2b61e60857e31c834a7637a1da","tests/ui/trait-fn.stderr":"9e2cd40a327a9c9e58124ec1b3dc3b1a37005724c5aa73e4aa92d8b2634b7917"}}
\ No newline at end of file
diff --git a/crates/no-panic/.cargo-checksum.json b/crates/no-panic/.cargo-checksum.json
index 9c6d991..0fc7a36 100644
--- a/crates/no-panic/.cargo-checksum.json
+++ b/crates/no-panic/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"84c87e834d11562966872c0af4dc0faba2547212ca53f0201c980385978ba339","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"dd9f016d4e5c0b6934b9632ee363d39a98da6e2ff05a99a9b20e0bef4dfd927e","build.rs":"d183bf1e325fcd8e132ec95105fdd90ef204818485b9d8ac3334f11ae2f0b6ca","src/lib.rs":"06deefa4eaa5405696334ce4f54dc5af2eaaf144bfdf2f29688a87c3b9624b63","tests/compiletest/mod.rs":"3150e73da18b506c070ea7c085380d6e6a2a00860af2a2f96554b26319b3fd0a","tests/test.rs":"5a82f041a9bed6ef3752337e8833921eebeb73fc7f26c73badc97211b00dc7fc","tests/ui/async-fn.rs":"152d5e8546b0b2016315486dddfd0cbe2d3b1a6c629faac6c8e8e645c96d6f78","tests/ui/async-fn.stderr":"2e797f13df99acd49d88c52b0d570e049f03e590f538e91409120b5a11cd3812","tests/ui/trait-fn.rs":"129f4d0dc4a227fe6cd3313a2e1835f3b1d4cec4dabb2f811e02a2a59e5e0a29","tests/ui/trait-fn.stderr":"0d7eedcce3e9d876cf2ef2940bd20224a5c0163c672ce05f8af86227347fe301"},"package":"13039f2e914d0c1b8674a6a63681cfb857c41f029920db505f850c36dee22df8"}
\ No newline at end of file
+{"files":{"Cargo.toml":"08f701a7b81e31ba31bcbe6269cef1820232722417020c8fe68bf9682dea402e","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"fde5df1ff2201ae6b6b01e6964b34040220f5c342b36ac3efe1beb542a6c8e17","build.rs":"d183bf1e325fcd8e132ec95105fdd90ef204818485b9d8ac3334f11ae2f0b6ca","src/lib.rs":"74c4e304278950c9e5b6018e884231bc3b8ca1016b4659ac89334f4d910473d7","tests/compiletest/mod.rs":"3150e73da18b506c070ea7c085380d6e6a2a00860af2a2f96554b26319b3fd0a","tests/test.rs":"5a82f041a9bed6ef3752337e8833921eebeb73fc7f26c73badc97211b00dc7fc","tests/ui/async-fn.rs":"152d5e8546b0b2016315486dddfd0cbe2d3b1a6c629faac6c8e8e645c96d6f78","tests/ui/async-fn.stderr":"2e797f13df99acd49d88c52b0d570e049f03e590f538e91409120b5a11cd3812","tests/ui/const-fn.rs":"b5e4d1d0ae2290d7bbd3a671d3dae2e44c4931b8ca61a7c0cbf9683d9a634866","tests/ui/const-fn.stderr":"e62e6fb411e8faea2879875a2f1c463fa1b41e50d3ff9126bbb0bd69cb6e4530","tests/ui/trait-fn.rs":"129f4d0dc4a227fe6cd3313a2e1835f3b1d4cec4dabb2f811e02a2a59e5e0a29","tests/ui/trait-fn.stderr":"0d7eedcce3e9d876cf2ef2940bd20224a5c0163c672ce05f8af86227347fe301"},"package":"8f7da86466fe446079286ef4b2f6d789755b610a9d85da8477633f734d2697e8"}
\ No newline at end of file
diff --git a/crates/no-panic/Android.bp b/crates/no-panic/Android.bp
index 617939a..0c73578 100644
--- a/crates/no-panic/Android.bp
+++ b/crates/no-panic/Android.bp
@@ -17,7 +17,7 @@
     name: "libno_panic",
     crate_name: "no_panic",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
diff --git a/crates/no-panic/Cargo.toml b/crates/no-panic/Cargo.toml
index a896e91..0a4222a 100644
--- a/crates/no-panic/Cargo.toml
+++ b/crates/no-panic/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.56"
 name = "no-panic"
-version = "0.1.32"
+version = "0.1.33"
 authors = ["David Tolnay <[email protected]>"]
 build = "build.rs"
 autolib = false
diff --git a/crates/no-panic/METADATA b/crates/no-panic/METADATA
index 4e35567..f762493 100644
--- a/crates/no-panic/METADATA
+++ b/crates/no-panic/METADATA
@@ -1,17 +1,17 @@
 name: "no-panic"
 description: "Attribute macro to require that the compiler prove a function can\'t ever panic."
 third_party {
-  version: "0.1.32"
+  version: "0.1.33"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 21
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/no-panic"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/no-panic/no-panic-0.1.32.crate"
-    version: "0.1.32"
+    value: "https://static.crates.io/crates/no-panic/no-panic-0.1.33.crate"
+    version: "0.1.33"
   }
 }
diff --git a/crates/no-panic/README.md b/crates/no-panic/README.md
index f54663d..01ad392 100644
--- a/crates/no-panic/README.md
+++ b/crates/no-panic/README.md
@@ -70,7 +70,13 @@
   detection. This includes `cargo build` of library crates and `cargo check` of
   binary and library crates.
 
-- The attribute is useless in code built with `panic = "abort"`.
+- The attribute is useless in code built with `panic = "abort"`. Code must be
+  built with `panic = "unwind"` (the default) in order for any panics to be
+  detected. After confirming absence of panics, you can of course still ship
+  your software as a `panic = "abort"` build.
+
+- Const functions are not supported. The attribute will fail to compile if
+  placed on a `const fn`.
 
 If you find that code requires optimization to pass `#[no_panic]`, either make
 no-panic an optional dependency that you only enable in release builds, or add a
diff --git a/crates/no-panic/src/lib.rs b/crates/no-panic/src/lib.rs
index 07823cd..65d0608 100644
--- a/crates/no-panic/src/lib.rs
+++ b/crates/no-panic/src/lib.rs
@@ -79,7 +79,13 @@
 //!   detection. This includes `cargo build` of library crates and `cargo check`
 //!   of binary and library crates.
 //!
-//! - The attribute is useless in code built with `panic = "abort"`.
+//! - The attribute is useless in code built with `panic = "abort"`. Code must
+//!   be built with `panic = "unwind"` (the default) in order for any panics to
+//!   be detected. After confirming absence of panics, you can of course still
+//!   ship your software as a `panic = "abort"` build.
+//!
+//! - Const functions are not supported. The attribute will fail to compile if
+//!   placed on a `const fn`.
 //!
 //! If you find that code requires optimization to pass `#[no_panic]`, either
 //! make no-panic an optional dependency that you only enable in release builds,
@@ -126,7 +132,7 @@
 //! [Kixunil]: https://github.com/Kixunil
 //! [`dont_panic`]: https://github.com/Kixunil/dont_panic
 
-#![doc(html_root_url = "https://docs.rs/no-panic/0.1.32")]
+#![doc(html_root_url = "https://docs.rs/no-panic/0.1.33")]
 #![allow(
     clippy::doc_markdown,
     clippy::match_same_arms,
@@ -162,6 +168,12 @@
 fn parse(args: TokenStream2, input: TokenStream2) -> Result<ItemFn> {
     let function: ItemFn = syn::parse2(input)?;
     let _: Nothing = syn::parse2::<Nothing>(args)?;
+    if function.sig.constness.is_some() {
+        return Err(Error::new(
+            Span::call_site(),
+            "no_panic attribute on const fn is not supported",
+        ));
+    }
     if function.sig.asyncness.is_some() {
         return Err(Error::new(
             Span::call_site(),
diff --git a/crates/no-panic/tests/ui/const-fn.rs b/crates/no-panic/tests/ui/const-fn.rs
new file mode 100644
index 0000000..650d01a
--- /dev/null
+++ b/crates/no-panic/tests/ui/const-fn.rs
@@ -0,0 +1,6 @@
+use no_panic::no_panic;
+
+#[no_panic]
+const fn f() {}
+
+fn main() {}
diff --git a/crates/no-panic/tests/ui/const-fn.stderr b/crates/no-panic/tests/ui/const-fn.stderr
new file mode 100644
index 0000000..16c4c81
--- /dev/null
+++ b/crates/no-panic/tests/ui/const-fn.stderr
@@ -0,0 +1,7 @@
+error: no_panic attribute on const fn is not supported
+ --> tests/ui/const-fn.rs:3:1
+  |
+3 | #[no_panic]
+  | ^^^^^^^^^^^
+  |
+  = note: this error originates in the attribute macro `no_panic` (in Nightly builds, run with -Z macro-backtrace for more info)
diff --git a/crates/octets/.android-checksum.json b/crates/octets/.android-checksum.json
index 0f9e02a..5b82728 100644
--- a/crates/octets/.android-checksum.json
+++ b/crates/octets/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"ffe01f78c9cab12b869074930e05091ac50744d9ea75c09c50b0fd6dee8fcd3e","Android.bp":"1f8dcd82e227682a2f3c23a1ddc630fdd7ed37b79148b9943f29466dab9ebb1f","Cargo.toml":"d31ba17604b27f60ea27a4685ff81c52f6da7d7fa3e2b407cbc69ce9828193b3","LICENSE":"6b317ab75fb501c637b6056cc2066682b1c8d413bb4e86c9884b8d5120c55634","METADATA":"e33d90c42dbdf1dd5ab78213c1269f56f44196e3dda55ccc0fdec2b73292aeae","MODULE_LICENSE_BSD":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"605c8fba601fb7db8d7c083c40d9bc2df6e4e96a06ce9cb577317a4595dfd0b9","cargo_embargo.json":"9dc193953246dbbfe9d62639be0a770b1a9044278a546ae5a4eb8d5ffaf4b329","patches/LICENSE.patch":"6c5dab8ef9535bc6c36b8a081fca8c68f852b69eea5a3cf5f353c8248a8d6005","src/lib.rs":"ca40eff409f7a3aee2553a83e2c2780144388cf04e25c82e2b532ef1555be2d0"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"df88671bc2c3354d62c6e85d9eff440f93cf01dcf5f5972cea410f7a35e6e0f6","Android.bp":"4e177cb3ac078e38542d90b99c45d817f7fe0290f97463e55139ba6ce5f26091","Cargo.toml":"48daf0f5bbfdbc50a44e188058bfb439bc85a36a2b53de3cf777e23983a771dc","LICENSE":"6b317ab75fb501c637b6056cc2066682b1c8d413bb4e86c9884b8d5120c55634","METADATA":"7d4ce123428276231c5bbc03d78d3dab23312e118f885fb17036577c9adc8ef9","MODULE_LICENSE_BSD":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"605c8fba601fb7db8d7c083c40d9bc2df6e4e96a06ce9cb577317a4595dfd0b9","cargo_embargo.json":"9dc193953246dbbfe9d62639be0a770b1a9044278a546ae5a4eb8d5ffaf4b329","patches/LICENSE.patch":"6c5dab8ef9535bc6c36b8a081fca8c68f852b69eea5a3cf5f353c8248a8d6005","src/lib.rs":"65e8287dc99adc163f04d7255578e7d0b8f03ce5a9c59dd6156e9d2c049a18e2"}}
\ No newline at end of file
diff --git a/crates/octets/.cargo-checksum.json b/crates/octets/.cargo-checksum.json
index 0e309f0..443c86e 100644
--- a/crates/octets/.cargo-checksum.json
+++ b/crates/octets/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"85ab4a1236a2cddc4fb2dc1a2ad1f73ef446d89f452dae96c8b07eea9b167301","src/lib.rs":"e43c030955fc494246514b2ccd8e8d0dda2e1125de091bde0eeef126ba438102"},"package":"3a74f2cda724d43a0a63140af89836d4e7db6138ef67c9f96d3a0f0150d05000"}
\ No newline at end of file
+{"files":{"Cargo.toml":"5754c7ab81cc01796970a27051afcb1c384bf55e23b60c8551801af17721bc30","src/lib.rs":"f0000bc4efc12feade1d9084b84bd9fff44ee4e37d730fb5bdf533ba0d8c1b69"},"package":"109983a091271ee8916076731ba5fdc9ee22fea871bc7c6ceab9bfd423eb1d99"}
\ No newline at end of file
diff --git a/crates/octets/Android.bp b/crates/octets/Android.bp
index c94fae6..4f7c5a2 100644
--- a/crates/octets/Android.bp
+++ b/crates/octets/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "octets",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.2.0",
+    cargo_pkg_version: "0.3.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     apex_available: [
@@ -35,7 +35,7 @@
     host_supported: true,
     crate_name: "octets",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.2.0",
+    cargo_pkg_version: "0.3.0",
     crate_root: "src/lib.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
diff --git a/crates/octets/Cargo.toml b/crates/octets/Cargo.toml
index 680f1f4..dcde97d 100644
--- a/crates/octets/Cargo.toml
+++ b/crates/octets/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2018"
 name = "octets"
-version = "0.2.0"
+version = "0.3.0"
 authors = ["Alessandro Ghedini <[email protected]>"]
 description = "Zero-copy abstraction for parsing and constructing network packets"
 keywords = [
diff --git a/crates/octets/METADATA b/crates/octets/METADATA
index 7ed4cbc..4e92f64 100644
--- a/crates/octets/METADATA
+++ b/crates/octets/METADATA
@@ -1,17 +1,17 @@
 name: "octets"
 description: "Zero-copy abstraction for parsing and constructing network packets"
 third_party {
-  version: "0.2.0"
+  version: "0.3.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2022
+    year: 2024
     month: 12
-    day: 13
+    day: 21
   }
   homepage: "https://crates.io/crates/octets"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/octets/octets-0.2.0.crate"
-    version: "0.2.0"
+    value: "https://static.crates.io/crates/octets/octets-0.3.0.crate"
+    version: "0.3.0"
   }
 }
diff --git a/crates/octets/src/lib.rs b/crates/octets/src/lib.rs
index 4f504bf..f1133f3 100644
--- a/crates/octets/src/lib.rs
+++ b/crates/octets/src/lib.rs
@@ -37,7 +37,7 @@
 /// An error indicating that the provided [`OctetsMut`] is not big enough.
 ///
 /// [`OctetsMut`]: struct.OctetsMut.html
-#[derive(Clone, Copy, Debug, PartialEq)]
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
 pub struct BufferTooShortError;
 
 impl std::fmt::Display for BufferTooShortError {
@@ -118,7 +118,7 @@
 /// Additionally, an offset (initially set to the start of the buffer) is
 /// incremented as bytes are read from / written to the buffer, to allow for
 /// sequential operations.
-#[derive(Debug, PartialEq)]
+#[derive(Debug, PartialEq, Eq)]
 pub struct Octets<'a> {
     buf: &'a [u8],
     off: usize,
@@ -127,8 +127,8 @@
 impl<'a> Octets<'a> {
     /// Creates an `Octets` from the given slice, without copying.
     ///
-    /// Since there's no copy, the input slice needs to be mutable to allow
-    /// modifications.
+    /// Since the `Octets` is immutable, the input slice needs to be
+    /// immutable.
     pub fn with_slice(buf: &'a [u8]) -> Self {
         Octets { buf, off: 0 }
     }
@@ -251,7 +251,7 @@
     }
 
     /// Returns a slice of `len` elements from the current offset.
-    pub fn slice(&'a self, len: usize) -> Result<&'a [u8]> {
+    pub fn slice(&self, len: usize) -> Result<&'a [u8]> {
         if len > self.cap() {
             return Err(BufferTooShortError);
         }
@@ -260,7 +260,7 @@
     }
 
     /// Returns a slice of `len` elements from the end of the buffer.
-    pub fn slice_last(&'a self, len: usize) -> Result<&'a [u8]> {
+    pub fn slice_last(&self, len: usize) -> Result<&'a [u8]> {
         if len > self.cap() {
             return Err(BufferTooShortError);
         }
@@ -320,7 +320,7 @@
 /// A zero-copy mutable byte buffer.
 ///
 /// Like `Octets` but mutable.
-#[derive(Debug, PartialEq)]
+#[derive(Debug, PartialEq, Eq)]
 pub struct OctetsMut<'a> {
     buf: &'a mut [u8],
     off: usize,
@@ -666,7 +666,7 @@
 
 /// Returns how many bytes it would take to encode `v` as a variable-length
 /// integer.
-pub fn varint_len(v: u64) -> usize {
+pub const fn varint_len(v: u64) -> usize {
     if v <= 63 {
         1
     } else if v <= 16383 {
@@ -681,7 +681,7 @@
 }
 
 /// Returns how long the variable-length integer is, given its first byte.
-pub fn varint_parse_len(first: u8) -> usize {
+pub const fn varint_parse_len(first: u8) -> usize {
     match first >> 6 {
         0 => 1,
         1 => 2,
@@ -1023,7 +1023,7 @@
     fn varint_too_large() {
         let mut d = [0; 3];
         let mut b = OctetsMut::with_slice(&mut d);
-        assert!(b.put_varint(std::u64::MAX).is_err());
+        assert!(b.put_varint(u64::MAX).is_err());
     }
 
     #[test]
diff --git a/crates/openssl-macros/.android-checksum.json b/crates/openssl-macros/.android-checksum.json
index 888a05d..897b0ef 100644
--- a/crates/openssl-macros/.android-checksum.json
+++ b/crates/openssl-macros/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"6e8b1f2cc56bf66fe4f09f03b7b80b7120203679529acf71f4023a74ad6f4bff","Android.bp":"1ea7f057a81fe1f9d651c3cc7307d3479cec86a4d43ea03952eb850a1ca76c1d","Cargo.toml":"c9b7d30f9579d68c578562a31da4c1fc6d1dcd0dd7b082d7a8e38f151ad97025","LICENSE":"c2ebd6cb7687cda790d2f36bb2ca8a7af4f7a966d940c9c49b37f28b5b78055f","LICENSE-APACHE":"e4493d0badd82c469fd611cf0c31ea8a74cce85c52c4a4c2579e344226f0602e","LICENSE-MIT":"1d057abfd1dbefed706768f504a66520124f1ce2dfa2e1b5bb05e34311f8e835","METADATA":"c209f44130db61213eedf24be16015da63280a979d3de4d93f9895c6f2bd3b3d","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","cargo_embargo.json":"e44a8a1d69d43d9fa3235eef2f9186e58c04e127e2ef602bd6453655591a9736","patches/LICENSE.patch":"81a9acfae604fda2609da4fc8bf03d39657d8228afd78a15150aac1f24e8925e","rules.mk":"5d2a7fbd618fc57ecee3f46279e54808542ffc7f7d8b7161807c2451cf5a44c6","src/lib.rs":"1fbacf625030cbec8d60d04aff202b59499398dbfc1b6dcadbbffb9a55f03861"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"ff1316dd0ecf02f2ced9fafd10191c9747e660109fa71fa732725f2733141dcd","Android.bp":"b0a39521727d3015d096c38e8ef070a6b52c621c583d2b0a0e26a5944f012cb1","Cargo.toml":"7fb5232b58f1e2eaaf30eb021026cdedf013176b655578dac38140b9286ce842","LICENSE":"c2ebd6cb7687cda790d2f36bb2ca8a7af4f7a966d940c9c49b37f28b5b78055f","LICENSE-APACHE":"e4493d0badd82c469fd611cf0c31ea8a74cce85c52c4a4c2579e344226f0602e","LICENSE-MIT":"1d057abfd1dbefed706768f504a66520124f1ce2dfa2e1b5bb05e34311f8e835","METADATA":"777f76ce10afaa48cad00d7bbc08dd05855a5cb6665aecf0ecacf658afd50f01","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","cargo_embargo.json":"e44a8a1d69d43d9fa3235eef2f9186e58c04e127e2ef602bd6453655591a9736","patches/LICENSE.patch":"81a9acfae604fda2609da4fc8bf03d39657d8228afd78a15150aac1f24e8925e","rules.mk":"5d2a7fbd618fc57ecee3f46279e54808542ffc7f7d8b7161807c2451cf5a44c6","src/lib.rs":"3a36900018ca347d4a8d566d2c342ae92e429c1bb54353c1075cc7eb5a7ac27a"}}
\ No newline at end of file
diff --git a/crates/openssl-macros/.cargo-checksum.json b/crates/openssl-macros/.cargo-checksum.json
index a7b938e..8d99014 100644
--- a/crates/openssl-macros/.cargo-checksum.json
+++ b/crates/openssl-macros/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"59438de390082830c79c453063e7b9f3264d17c42468ff0ac99cc509968440ce","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"ea5ab440900ab271811d5c2dc02a9de6e03a6956ac5727e85c11d76df5883d30","src/lib.rs":"3c8538a4b42a866b88164bcb5fa0a168b674a3ac7000af9738f688b8d6500dbb"},"package":"b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"}
\ No newline at end of file
+{"files":{"Cargo.toml":"a0f4f5f613ead670c0512bf5f42c0426c8c3ab119f3737c6119190a5a34b657d","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"ea5ab440900ab271811d5c2dc02a9de6e03a6956ac5727e85c11d76df5883d30","src/lib.rs":"a53de10a52f0870e854ed7575d35eba46165f9eaf9f69d1abfff141d2e2aaf33"},"package":"a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"}
\ No newline at end of file
diff --git a/crates/openssl-macros/Android.bp b/crates/openssl-macros/Android.bp
index 67b25cb..31e8bf8 100644
--- a/crates/openssl-macros/Android.bp
+++ b/crates/openssl-macros/Android.bp
@@ -17,7 +17,7 @@
     name: "libopenssl_macros",
     crate_name: "openssl_macros",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.0",
+    cargo_pkg_version: "0.1.1",
     crate_root: "src/lib.rs",
     edition: "2018",
     rustlibs: [
diff --git a/crates/openssl-macros/Cargo.toml b/crates/openssl-macros/Cargo.toml
index fc791e3..5dac6cb 100644
--- a/crates/openssl-macros/Cargo.toml
+++ b/crates/openssl-macros/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2018"
 name = "openssl-macros"
-version = "0.1.0"
+version = "0.1.1"
 description = "Internal macros used by the openssl crate."
 license = "MIT/Apache-2.0"
 
@@ -26,5 +26,5 @@
 version = "1"
 
 [dependencies.syn]
-version = "1"
+version = "2"
 features = ["full"]
diff --git a/crates/openssl-macros/METADATA b/crates/openssl-macros/METADATA
index 7d9eca9..67e3d17 100644
--- a/crates/openssl-macros/METADATA
+++ b/crates/openssl-macros/METADATA
@@ -1,17 +1,17 @@
 name: "openssl-macros"
 description: "Internal macros used by the openssl crate."
 third_party {
-  version: "0.1.0"
+  version: "0.1.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2022
-    month: 11
-    day: 30
+    year: 2024
+    month: 12
+    day: 21
   }
   homepage: "https://crates.io/crates/openssl-macros"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/openssl-macros/openssl-macros-0.1.0.crate"
-    version: "0.1.0"
+    value: "https://static.crates.io/crates/openssl-macros/openssl-macros-0.1.1.crate"
+    version: "0.1.1"
   }
 }
diff --git a/crates/openssl-macros/src/lib.rs b/crates/openssl-macros/src/lib.rs
index c007409..99db988 100644
--- a/crates/openssl-macros/src/lib.rs
+++ b/crates/openssl-macros/src/lib.rs
@@ -1,3 +1,5 @@
+#![allow(clippy::uninlined_format_args)]
+
 use proc_macro::TokenStream;
 use proc_macro2::Ident;
 use quote::quote;
diff --git a/crates/parking_lot_core/.android-checksum.json b/crates/parking_lot_core/.android-checksum.json
index 0cf9d69..1b4f182 100644
--- a/crates/parking_lot_core/.android-checksum.json
+++ b/crates/parking_lot_core/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"31fe7cc156312313c578088456c8018e09fc9dcd8eb10e265776bd7950b8a17c","Android.bp":"c13e41433f4f53eadf34c3d0a1045bbbaa93329d7031d9ee827ef96f4df94857","Cargo.toml":"375afe76b5fb1ae9076a73b7c0f3ba38be29d8aeabfb2e964dd689e49018eade","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"e17148c150ed6e1f84ea8f6eb3a11c3f2817c4ea663012777bdcb8e9629b6e20","METADATA":"670fed3694396ac67fee386458e24fd2bc136d47fa56d364d2eb012195e88fdc","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"6dd8ebfabf35665f12319b5fd6d67eaca35d434f93aa650d0402be4efb63362e","build.rs":"e64398051a14cd1dbf19dac62797278469c32917a7189ee591e022e1b49c24ef","cargo_embargo.json":"81dac50c56c34d5846286bcc1d253e7e5044332422d7d5ae1534178e2eea828e","src/lib.rs":"8ec8cbe27f4817b9efde359fc7c4584bcf4300cd9c38913f988035d4e74fdcab","src/parking_lot.rs":"027e1f7c98db965b3c293fe97125c236b61e96e3a63991cbdb18eadff4231fba","src/spinwait.rs":"56c79e5446b358a3e14e9c1d3c99c508c108aa68ea8ab9014a048c1216bb8949","src/thread_parker/generic.rs":"c9c199c22cff15ee358d53e8698350416b0338750b5184f781a9f76872430ab4","src/thread_parker/linux.rs":"eaa56f8a7b1d5455a1b93ca53e8f223e5176ebc66f7d34aebf6448f32b38cf7f","src/thread_parker/mod.rs":"629df7b56f7721564942ff7ef2964987a548739a631c64a385a49814c176bc24","src/thread_parker/redox.rs":"d5a3be60cd9ce7f3502c0a0c2cd85959baeeb055697e6ddd98dd98c6c4817140","src/thread_parker/sgx.rs":"64f20919e36e597c0800857f8662f575472d36d742c02a9265b7366e15cc71a4","src/thread_parker/unix.rs":"1c98b3d032040220ff277a9537f8298245c7b8f33871d3dc153b6331b2308809","src/thread_parker/wasm.rs":"a944db7dd900b67616b19669ad3b48b4337691fa7b4f0baed6074b27811797a1","src/thread_parker/wasm_atomic.rs":"2b8d640fa2d4211f3cab383151d8a15d5975be1b0f388fcb389169425f205ec9","src/thread_parker/windows/bindings.rs":"cfbe1da4cff44342ce5e315980c8a388411de5980a36857932ef5441a8e3ff02","src/thread_parker/windows/keyed_event.rs":"3464736866a9ad844d7325f688b6ae31deaf6644992bc3be07c1c12c7467f821","src/thread_parker/windows/mod.rs":"c4778988d00f7ef18fa68e5d5762133240aa4c313e8890e6501b8b0fc7fabaaf","src/thread_parker/windows/waitaddress.rs":"c36e2d6308f5bb73abad6921188d261e7b9170c47074beb36a3265687ce92dbc","src/util.rs":"a794bf6dd68a0f813328da3cb6f6957877b4060207e87f05c7cb25e807ef4705","src/word_lock.rs":"6c639340c788980319557c53588799c24280487d652d554744e6e7697f7130e2"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"29c36e510baf8613f6b00bea2902924ff87128de78eaf6642ae00e49b6dc5406","Android.bp":"87c3d5fb4f62ededaf9a00450fe659b57df5172e390600a1c95e347aee97fb60","Cargo.toml":"6fa724c74f306263eb9c774b98cef41cd1a163dd483c8b13a9cdad0500060469","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"e17148c150ed6e1f84ea8f6eb3a11c3f2817c4ea663012777bdcb8e9629b6e20","METADATA":"54fe6127e9293bffb66352e3e5bfe85aae56aca39e5e3349935461cdcebd9691","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"6dd8ebfabf35665f12319b5fd6d67eaca35d434f93aa650d0402be4efb63362e","build.rs":"e64398051a14cd1dbf19dac62797278469c32917a7189ee591e022e1b49c24ef","cargo_embargo.json":"81dac50c56c34d5846286bcc1d253e7e5044332422d7d5ae1534178e2eea828e","src/lib.rs":"3abf05f2468e6326efe5d139ec4bd71b445374d5c58d5a728eccb9a1514415d2","src/parking_lot.rs":"b814dfbd7b894f960ad7611589c9301fb1efca014cd63fbdfa6135636c7c5709","src/spinwait.rs":"56c79e5446b358a3e14e9c1d3c99c508c108aa68ea8ab9014a048c1216bb8949","src/thread_parker/generic.rs":"c9c199c22cff15ee358d53e8698350416b0338750b5184f781a9f76872430ab4","src/thread_parker/linux.rs":"eaa56f8a7b1d5455a1b93ca53e8f223e5176ebc66f7d34aebf6448f32b38cf7f","src/thread_parker/mod.rs":"767fb75ddccf5574f2aafb7680d8c33fb53d877e3c07235c55f201c768dc73e8","src/thread_parker/redox.rs":"d5a3be60cd9ce7f3502c0a0c2cd85959baeeb055697e6ddd98dd98c6c4817140","src/thread_parker/sgx.rs":"64f20919e36e597c0800857f8662f575472d36d742c02a9265b7366e15cc71a4","src/thread_parker/unix.rs":"9e439d63b24188fe4b7411f5ab17f543c668c3d6758b778ee1421fac702230f6","src/thread_parker/wasm.rs":"a944db7dd900b67616b19669ad3b48b4337691fa7b4f0baed6074b27811797a1","src/thread_parker/wasm_atomic.rs":"2b8d640fa2d4211f3cab383151d8a15d5975be1b0f388fcb389169425f205ec9","src/thread_parker/windows/bindings.rs":"5edc98c8c978763465b73fa1bd4d86560af836b29ed23bcf5dc6d2e0abfb1933","src/thread_parker/windows/keyed_event.rs":"3464736866a9ad844d7325f688b6ae31deaf6644992bc3be07c1c12c7467f821","src/thread_parker/windows/mod.rs":"c4778988d00f7ef18fa68e5d5762133240aa4c313e8890e6501b8b0fc7fabaaf","src/thread_parker/windows/waitaddress.rs":"c36e2d6308f5bb73abad6921188d261e7b9170c47074beb36a3265687ce92dbc","src/util.rs":"a794bf6dd68a0f813328da3cb6f6957877b4060207e87f05c7cb25e807ef4705","src/word_lock.rs":"c51a98ca895d18f1718b67ca1c32c899c398259801121cd9f6f370a1abf81ff2"}}
\ No newline at end of file
diff --git a/crates/parking_lot_core/.cargo-checksum.json b/crates/parking_lot_core/.cargo-checksum.json
index 1845325..48b6458 100644
--- a/crates/parking_lot_core/.cargo-checksum.json
+++ b/crates/parking_lot_core/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"771414b831b5789b1c0eb6dcb215008226b0998a242e530c4881e94e49231744","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","build.rs":"29e629057144d1238dcd8ea70ad6cbb6ec14ca742797af3fa9335710ff5cbaaa","src/lib.rs":"def53c1ff1d4a05e6261aa9b75ac089a51ecc15642e1320202e5c6836e2bb732","src/parking_lot.rs":"212165669beacb6299c959a2965516cda6b444467aed877889d9545c01e4bc3a","src/spinwait.rs":"0d73980c72e84fd75c73693f0b351e097353b46f4b8aaa67b3dde7c721817bf7","src/thread_parker/generic.rs":"414bd3114b40f7665efe59fa4c5033d2401eafc58b57a9ba5803949d26cc0454","src/thread_parker/linux.rs":"70bfe6c168fc431965374d921e33b3e04536cb68fde3e807a837aa38a65772b0","src/thread_parker/mod.rs":"afaf652e242d5235d38f5749f3b12dc6def793dee40cd6c820e1dd45a70a5ac8","src/thread_parker/redox.rs":"38fbede41817b6606a5612ee9456940eaf627540a4aa39de8452e355ca1df306","src/thread_parker/sgx.rs":"3b6190eb90fd88d5eee5370213a1de408cce24ded04bfb0f374c3bbf10752187","src/thread_parker/unix.rs":"0cc4ab7761fb1ce5d4dd4e41f3d8dcaa01933602505e6c55edfb58e4d4a4e1f2","src/thread_parker/wasm.rs":"86e954d009d57d2dfdbca71e5c0f116a99a182af83b7e51ed5b14fc55b2f7b01","src/thread_parker/wasm_atomic.rs":"6fbc09accc9df9d42444cec6f55d3eed2c7078a474485fa269a9f503da2ee1c5","src/thread_parker/windows/bindings.rs":"a33ce84b9e046d1984bed2270382049b7fc8e9163e034a6caa9c7ba72acd342a","src/thread_parker/windows/keyed_event.rs":"12b72b70ad9d58d943b51246621ac73223debb0b37abff990fa0f895c575f7c7","src/thread_parker/windows/mod.rs":"9cd50a3cad6afb68272dbff0f2e83b24353f8b1d35cce6ac2834216a26840d36","src/thread_parker/windows/waitaddress.rs":"9ab190cd9aaaf89bed4535f8a0ccb81102b7abb64d4f94b31aa98f8a2acaf8de","src/util.rs":"285e6133150645525f2ca1ece41f6d35bad4e7c5e08b42b20c99d2a97e04a974","src/word_lock.rs":"9ba49082359c35ad5b4e8d219fede1ffca75225f9ccb971cbba01f20e2ed2738"},"package":"4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"}
\ No newline at end of file
+{"files":{"Cargo.toml":"60064195165e41eee9dca4fda86b9f3497d965913ba908b4fa0482cbe911c08d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","build.rs":"29e629057144d1238dcd8ea70ad6cbb6ec14ca742797af3fa9335710ff5cbaaa","src/lib.rs":"c8c164deb6369857838b886423918383fb80ab4153e7eac5fffacbed12a533e7","src/parking_lot.rs":"0a81d007fad119ec0203bf962760c876462009e9eca78e1bdbfa9cb6921c709a","src/spinwait.rs":"0d73980c72e84fd75c73693f0b351e097353b46f4b8aaa67b3dde7c721817bf7","src/thread_parker/generic.rs":"414bd3114b40f7665efe59fa4c5033d2401eafc58b57a9ba5803949d26cc0454","src/thread_parker/linux.rs":"70bfe6c168fc431965374d921e33b3e04536cb68fde3e807a837aa38a65772b0","src/thread_parker/mod.rs":"87b1dd61ffadced5c8984c4fccf4253689b2cb2360ba6064d067821868129495","src/thread_parker/redox.rs":"38fbede41817b6606a5612ee9456940eaf627540a4aa39de8452e355ca1df306","src/thread_parker/sgx.rs":"3b6190eb90fd88d5eee5370213a1de408cce24ded04bfb0f374c3bbf10752187","src/thread_parker/unix.rs":"4cd468fcee83f29e9c923c5a574d0f5cbff0207741dae2eba99b16509fdb6ffa","src/thread_parker/wasm.rs":"86e954d009d57d2dfdbca71e5c0f116a99a182af83b7e51ed5b14fc55b2f7b01","src/thread_parker/wasm_atomic.rs":"6fbc09accc9df9d42444cec6f55d3eed2c7078a474485fa269a9f503da2ee1c5","src/thread_parker/windows/bindings.rs":"14fe29c67ab821b4cd5aa999fede6799598eaa1c03e6f71879023c90e21f9093","src/thread_parker/windows/keyed_event.rs":"12b72b70ad9d58d943b51246621ac73223debb0b37abff990fa0f895c575f7c7","src/thread_parker/windows/mod.rs":"9cd50a3cad6afb68272dbff0f2e83b24353f8b1d35cce6ac2834216a26840d36","src/thread_parker/windows/waitaddress.rs":"9ab190cd9aaaf89bed4535f8a0ccb81102b7abb64d4f94b31aa98f8a2acaf8de","src/util.rs":"285e6133150645525f2ca1ece41f6d35bad4e7c5e08b42b20c99d2a97e04a974","src/word_lock.rs":"57133a9da052d8e86eb38ff1968129149838918d69f52761dc8757b541f9d044"},"package":"1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"}
\ No newline at end of file
diff --git a/crates/parking_lot_core/Android.bp b/crates/parking_lot_core/Android.bp
index f330f8f..c4d7e57 100644
--- a/crates/parking_lot_core/Android.bp
+++ b/crates/parking_lot_core/Android.bp
@@ -18,9 +18,9 @@
     host_supported: true,
     crate_name: "parking_lot_core",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.9.9",
+    cargo_pkg_version: "0.9.10",
     crate_root: "src/lib.rs",
-    edition: "2018",
+    edition: "2021",
     rustlibs: [
         "libcfg_if",
         "liblibc",
@@ -40,14 +40,14 @@
     host_supported: true,
     crate_name: "parking_lot_core",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.9.9",
+    cargo_pkg_version: "0.9.10",
     crate_root: "src/lib.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
     test_options: {
         unit_test: true,
     },
-    edition: "2018",
+    edition: "2021",
     rustlibs: [
         "libcfg_if",
         "liblibc",
diff --git a/crates/parking_lot_core/Cargo.toml b/crates/parking_lot_core/Cargo.toml
index 83d9f23..3111f2b 100644
--- a/crates/parking_lot_core/Cargo.toml
+++ b/crates/parking_lot_core/Cargo.toml
@@ -10,10 +10,10 @@
 # See Cargo.toml.orig for the original contents.
 
 [package]
-edition = "2018"
-rust-version = "1.49.0"
+edition = "2021"
+rust-version = "1.56.0"
 name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
 authors = ["Amanieu d'Antras <[email protected]>"]
 description = "An advanced API for creating custom synchronization primitives."
 keywords = [
@@ -57,10 +57,10 @@
 nightly = []
 
 [target."cfg(target_os = \"redox\")".dependencies.redox_syscall]
-version = "0.4"
+version = "0.5"
 
 [target."cfg(unix)".dependencies.libc]
 version = "0.2.95"
 
 [target."cfg(windows)".dependencies.windows-targets]
-version = "0.48.0"
+version = "0.52.0"
diff --git a/crates/parking_lot_core/METADATA b/crates/parking_lot_core/METADATA
index cb24db5..8c0baee 100644
--- a/crates/parking_lot_core/METADATA
+++ b/crates/parking_lot_core/METADATA
@@ -1,17 +1,17 @@
 name: "parking_lot_core"
 description: "An advanced API for creating custom synchronization primitives."
 third_party {
-  version: "0.9.9"
+  version: "0.9.10"
   license_type: NOTICE
   last_upgrade_date {
     year: 2024
-    month: 2
-    day: 5
+    month: 12
+    day: 20
   }
   homepage: "https://crates.io/crates/parking_lot_core"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/parking_lot_core/parking_lot_core-0.9.9.crate"
-    version: "0.9.9"
+    value: "https://static.crates.io/crates/parking_lot_core/parking_lot_core-0.9.10.crate"
+    version: "0.9.10"
   }
 }
diff --git a/crates/parking_lot_core/src/lib.rs b/crates/parking_lot_core/src/lib.rs
index 4845356..7376e04 100644
--- a/crates/parking_lot_core/src/lib.rs
+++ b/crates/parking_lot_core/src/lib.rs
@@ -49,7 +49,7 @@
         target_family = "wasm",
         target_feature = "atomics"
     ),
-    feature(stdsimd)
+    feature(stdarch_wasm_atomic_wait)
 )]
 
 mod parking_lot;
diff --git a/crates/parking_lot_core/src/parking_lot.rs b/crates/parking_lot_core/src/parking_lot.rs
index d74b439..2eabf69 100644
--- a/crates/parking_lot_core/src/parking_lot.rs
+++ b/crates/parking_lot_core/src/parking_lot.rs
@@ -1103,7 +1103,7 @@
     pub(super) use super::deadlock_impl::DeadlockData;
 
     /// Acquire a resource identified by key in the deadlock detector
-    /// Noop if deadlock_detection feature isn't enabled.
+    /// Noop if `deadlock_detection` feature isn't enabled.
     ///
     /// # Safety
     ///
@@ -1115,7 +1115,7 @@
     }
 
     /// Release a resource identified by key in the deadlock detector.
-    /// Noop if deadlock_detection feature isn't enabled.
+    /// Noop if `deadlock_detection` feature isn't enabled.
     ///
     /// # Panics
     ///
diff --git a/crates/parking_lot_core/src/thread_parker/mod.rs b/crates/parking_lot_core/src/thread_parker/mod.rs
index fc162f4..230986b 100644
--- a/crates/parking_lot_core/src/thread_parker/mod.rs
+++ b/crates/parking_lot_core/src/thread_parker/mod.rs
@@ -20,7 +20,7 @@
     unsafe fn prepare_park(&self);
 
     /// Checks if the park timed out. This should be called while holding the
-    /// queue lock after park_until has returned false.
+    /// queue lock after `park_until` has returned false.
     unsafe fn timed_out(&self) -> bool;
 
     /// Parks the thread until it is unparked. This should be called after it has
@@ -33,7 +33,7 @@
     unsafe fn park_until(&self, timeout: Instant) -> bool;
 
     /// Locks the parker to prevent the target thread from exiting. This is
-    /// necessary to ensure that thread-local ThreadData objects remain valid.
+    /// necessary to ensure that thread-local `ThreadData` objects remain valid.
     /// This should be called while holding the queue lock.
     unsafe fn unpark_lock(&self) -> Self::UnparkHandle;
 }
diff --git a/crates/parking_lot_core/src/thread_parker/unix.rs b/crates/parking_lot_core/src/thread_parker/unix.rs
index fdc1ed9..5953cf3 100644
--- a/crates/parking_lot_core/src/thread_parker/unix.rs
+++ b/crates/parking_lot_core/src/thread_parker/unix.rs
@@ -5,7 +5,7 @@
 // http://opensource.org/licenses/MIT>, at your option. This file may not be
 // copied, modified, or distributed except according to those terms.
 
-#[cfg(any(target_os = "macos", target_os = "tvos", target_os = "ios", target_os = "watchos"))]
+#[cfg(target_vendor = "apple")]
 use core::ptr;
 use core::{
     cell::{Cell, UnsafeCell},
@@ -127,26 +127,12 @@
 
 impl ThreadParker {
     /// Initializes the condvar to use CLOCK_MONOTONIC instead of CLOCK_REALTIME.
-    #[cfg(any(
-        target_os = "macos",
-        target_os = "ios",
-        target_os = "tvos",
-        target_os = "watchos",
-        target_os = "android",
-        target_os = "espidf"
-    ))]
+    #[cfg(any(target_vendor = "apple", target_os = "android", target_os = "espidf"))]
     #[inline]
     unsafe fn init(&self) {}
 
     /// Initializes the condvar to use CLOCK_MONOTONIC instead of CLOCK_REALTIME.
-    #[cfg(not(any(
-        target_os = "macos",
-        target_os = "ios",
-        target_os = "tvos",
-        target_os = "watchos",
-        target_os = "android",
-        target_os = "espidf"
-    )))]
+    #[cfg(not(any(target_vendor = "apple", target_os = "android", target_os = "espidf")))]
     #[inline]
     unsafe fn init(&self) {
         let mut attr = MaybeUninit::<libc::pthread_condattr_t>::uninit();
@@ -197,7 +183,7 @@
 }
 
 // Returns the current time on the clock used by pthread_cond_t as a timespec.
-#[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos", target_os = "watchos"))]
+#[cfg(target_vendor = "apple")]
 #[inline]
 fn timespec_now() -> libc::timespec {
     let mut now = MaybeUninit::<libc::timeval>::uninit();
@@ -210,7 +196,7 @@
         tv_nsec: now.tv_usec as tv_nsec_t * 1000,
     }
 }
-#[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "tvos", target_os = "watchos")))]
+#[cfg(not(target_vendor = "apple"))]
 #[inline]
 fn timespec_now() -> libc::timespec {
     let mut now = MaybeUninit::<libc::timespec>::uninit();
diff --git a/crates/parking_lot_core/src/thread_parker/windows/bindings.rs b/crates/parking_lot_core/src/thread_parker/windows/bindings.rs
index 3c37dfa..a7502ac 100644
--- a/crates/parking_lot_core/src/thread_parker/windows/bindings.rs
+++ b/crates/parking_lot_core/src/thread_parker/windows/bindings.rs
@@ -1,5 +1,5 @@
 //! Manual bindings to the win32 API to avoid dependencies on windows-sys or winapi
-//! as these bindings will **never** change and parking_lot_core is a foundational
+//! as these bindings will **never** change and `parking_lot_core` is a foundational
 //! dependency for the Rust ecosystem, so the dependencies used by it have an
 //! outsize affect
 
diff --git a/crates/parking_lot_core/src/word_lock.rs b/crates/parking_lot_core/src/word_lock.rs
index 1109401..ac4f0a2 100644
--- a/crates/parking_lot_core/src/word_lock.rs
+++ b/crates/parking_lot_core/src/word_lock.rs
@@ -78,7 +78,7 @@
 }
 
 impl WordLock {
-    /// Returns a new, unlocked, WordLock.
+    /// Returns a new, unlocked, `WordLock`.
     pub const fn new() -> Self {
         WordLock {
             state: AtomicUsize::new(0),
diff --git a/crates/pathdiff/.android-checksum.json b/crates/pathdiff/.android-checksum.json
index 6d15f7b..380b038 100644
--- a/crates/pathdiff/.android-checksum.json
+++ b/crates/pathdiff/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"b43304228cb81dd23793aa9c70d47bbac3a90753be877ac406dad5ff6d54d321","Android.bp":"8e9f68a0fdb1ccde090d8deafa960c4da7ff542fb227d3e1d380cd811032b44a","Cargo.toml":"b3f78219896bd14dc0195cc7f93aded875648468343eda528bbd607ce539fa32","LICENSE":"ef00093c3850b9bce90c03998704f3fd5bf08133e07c4f5f40ac0b4b9d663212","LICENSE-APACHE":"ef00093c3850b9bce90c03998704f3fd5bf08133e07c4f5f40ac0b4b9d663212","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"5737795e876fa7c08642bb736c5656cb24ed7670f28d34bd61edfb4b552e9ed6","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","cargo_embargo.json":"46a3de12a464198fb4e0e31013517abb7a8d76515177ef7ec661e08d06be346f","src/lib.rs":"4e078abec5ca4074106361d16992872f97723f3abe08a5eb6704ff6476da2dc0"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"bd122efa417eefa3d8059c0f844a7a9045895127c51693d5443088164a9a2b3d","Android.bp":"77605033c980035fd60c75f0ee655b3a53673964c48b84e920bab7784c4b6f81","Cargo.toml":"56891ec57fd38664164416765af817cd422635df05a1980b76b98b9b56790bb2","LICENSE":"ef00093c3850b9bce90c03998704f3fd5bf08133e07c4f5f40ac0b4b9d663212","LICENSE-APACHE":"ef00093c3850b9bce90c03998704f3fd5bf08133e07c4f5f40ac0b4b9d663212","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"753a7659d5f1d7ef76ce3f31a1b36077ccdb63ccc3b7db0d8f23f356672ca86f","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","cargo_embargo.json":"46a3de12a464198fb4e0e31013517abb7a8d76515177ef7ec661e08d06be346f","src/lib.rs":"c9d4eb8c2250597b10252eeaf5ac1b9c87ce0e4bc4da43a7390ad544b567c065"}}
\ No newline at end of file
diff --git a/crates/pathdiff/.cargo-checksum.json b/crates/pathdiff/.cargo-checksum.json
index 3b9cf94..f51dd97 100644
--- a/crates/pathdiff/.cargo-checksum.json
+++ b/crates/pathdiff/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"faa72c2540b42ee2f069c9307597415f32855a160aae54992171c1a4af3e97bc","LICENSE-APACHE":"dd7818e575815db1fc6ba5ae894cd1674dfbff78562407b1f9f44da0fb857fe4","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/lib.rs":"e1dfb7552c32e1ddd3affd99185dee01391564ee9ea795a805712de87485d877"},"package":"8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"}
\ No newline at end of file
+{"files":{"Cargo.toml":"ad2ad198407c22fba987850f596f4d82200cce67daaea0f9a81ca288b0e2f70c","LICENSE-APACHE":"dd7818e575815db1fc6ba5ae894cd1674dfbff78562407b1f9f44da0fb857fe4","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/lib.rs":"c44b3fc6053f9a5b0bacc9097257685f6f0edb88dd098f06d4d8fa5575c2b574"},"package":"df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"}
\ No newline at end of file
diff --git a/crates/pathdiff/Android.bp b/crates/pathdiff/Android.bp
index 6777928..0ac8b1b 100644
--- a/crates/pathdiff/Android.bp
+++ b/crates/pathdiff/Android.bp
@@ -17,7 +17,7 @@
     name: "libpathdiff",
     crate_name: "pathdiff",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.2.1",
+    cargo_pkg_version: "0.2.3",
     crate_root: "src/lib.rs",
     edition: "2018",
 }
diff --git a/crates/pathdiff/Cargo.toml b/crates/pathdiff/Cargo.toml
index 0f82445..0971126 100644
--- a/crates/pathdiff/Cargo.toml
+++ b/crates/pathdiff/Cargo.toml
@@ -12,15 +12,33 @@
 [package]
 edition = "2018"
 name = "pathdiff"
-version = "0.2.1"
+version = "0.2.3"
 authors = ["Manish Goregaokar <[email protected]>"]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "Library for diffing paths to obtain relative paths"
 documentation = "https://docs.rs/pathdiff/"
-keywords = ["path", "relative"]
+readme = false
+keywords = [
+    "path",
+    "relative",
+]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/Manishearth/pathdiff"
+
 [package.metadata.docs.rs]
 all-features = true
+
+[lib]
+name = "pathdiff"
+path = "src/lib.rs"
+
 [dependencies.camino]
 version = "1.0.5"
 optional = true
+
+[dev-dependencies.cfg-if]
+version = "1.0.0"
diff --git a/crates/pathdiff/METADATA b/crates/pathdiff/METADATA
index 818d733..c61e8be 100644
--- a/crates/pathdiff/METADATA
+++ b/crates/pathdiff/METADATA
@@ -1,17 +1,17 @@
 name: "pathdiff"
 description: "Library for diffing paths to obtain relative paths"
 third_party {
-  version: "0.2.1"
+  version: "0.2.3"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 6
-    day: 12
+    year: 2024
+    month: 12
+    day: 20
   }
   homepage: "https://crates.io/crates/pathdiff"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/pathdiff/pathdiff-0.2.1.crate"
-    version: "0.2.1"
+    value: "https://static.crates.io/crates/pathdiff/pathdiff-0.2.3.crate"
+    version: "0.2.3"
   }
 }
diff --git a/crates/pathdiff/src/lib.rs b/crates/pathdiff/src/lib.rs
index 3860c2d..34233b3 100644
--- a/crates/pathdiff/src/lib.rs
+++ b/crates/pathdiff/src/lib.rs
@@ -11,6 +11,8 @@
 // Adapted from rustc's path_relative_from
 // https://github.com/rust-lang/rust/blob/e1d0de82cc40b666b88d4a6d2c9dcbc81d7ed27f/src/librustc_back/rpath.rs#L116-L158
 
+#![cfg_attr(docsrs, feature(doc_cfg))]
+
 use std::path::*;
 
 /// Construct a relative path from a provided base directory path to the provided path.
@@ -19,17 +21,24 @@
 /// use pathdiff::diff_paths;
 /// use std::path::*;
 ///
-/// let baz = "/foo/bar/baz";
-/// let bar = "/foo/bar";
-/// let quux = "/foo/bar/quux";
-/// assert_eq!(diff_paths(bar, baz), Some("../".into()));
-/// assert_eq!(diff_paths(baz, bar), Some("baz".into()));
-/// assert_eq!(diff_paths(quux, baz), Some("../quux".into()));
-/// assert_eq!(diff_paths(baz, quux), Some("../baz".into()));
-/// assert_eq!(diff_paths(bar, quux), Some("../".into()));
+/// assert_eq!(diff_paths("/foo/bar",      "/foo/bar/baz"),  Some("../".into()));
+/// assert_eq!(diff_paths("/foo/bar/baz",  "/foo/bar"),      Some("baz".into()));
+/// assert_eq!(diff_paths("/foo/bar/quux", "/foo/bar/baz"),  Some("../quux".into()));
+/// assert_eq!(diff_paths("/foo/bar/baz",  "/foo/bar/quux"), Some("../baz".into()));
+/// assert_eq!(diff_paths("/foo/bar",      "/foo/bar/quux"), Some("../".into()));
 ///
-/// assert_eq!(diff_paths(&baz, &bar.to_string()), Some("baz".into()));
-/// assert_eq!(diff_paths(Path::new(baz), Path::new(bar).to_path_buf()), Some("baz".into()));
+/// assert_eq!(diff_paths("/foo/bar",      "baz"),           Some("/foo/bar".into()));
+/// assert_eq!(diff_paths("/foo/bar",      "/baz"),          Some("../foo/bar".into()));
+/// assert_eq!(diff_paths("foo",           "bar"),           Some("../foo".into()));
+///
+/// assert_eq!(
+///     diff_paths(&"/foo/bar/baz", "/foo/bar".to_string()),
+///     Some("baz".into())
+/// );
+/// assert_eq!(
+///     diff_paths(Path::new("/foo/bar/baz"), Path::new("/foo/bar").to_path_buf()),
+///     Some("baz".into())
+/// );
 /// ```
 pub fn diff_paths<P, B>(path: P, base: B) -> Option<PathBuf>
 where
@@ -82,22 +91,31 @@
 
     /// Construct a relative UTF-8 path from a provided base directory path to the provided path.
     ///
+    /// Requires the `camino` feature.
+    ///
     /// ```rust
     /// # extern crate camino;
     /// use camino::*;
     /// use pathdiff::diff_utf8_paths;
     ///
-    /// let baz = "/foo/bar/baz";
-    /// let bar = "/foo/bar";
-    /// let quux = "/foo/bar/quux";
-    /// assert_eq!(diff_utf8_paths(bar, baz), Some("../".into()));
-    /// assert_eq!(diff_utf8_paths(baz, bar), Some("baz".into()));
-    /// assert_eq!(diff_utf8_paths(quux, baz), Some("../quux".into()));
-    /// assert_eq!(diff_utf8_paths(baz, quux), Some("../baz".into()));
-    /// assert_eq!(diff_utf8_paths(bar, quux), Some("../".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar",      "/foo/bar/baz"),  Some("../".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar/baz",  "/foo/bar"),      Some("baz".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar/quux", "/foo/bar/baz"),  Some("../quux".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar/baz",  "/foo/bar/quux"), Some("../baz".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar",      "/foo/bar/quux"), Some("../".into()));
     ///
-    /// assert_eq!(diff_utf8_paths(&baz, &bar.to_string()), Some("baz".into()));
-    /// assert_eq!(diff_utf8_paths(Utf8Path::new(baz), Utf8Path::new(bar).to_path_buf()), Some("baz".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar",      "baz"),           Some("/foo/bar".into()));
+    /// assert_eq!(diff_utf8_paths("/foo/bar",      "/baz"),          Some("../foo/bar".into()));
+    /// assert_eq!(diff_utf8_paths("foo",           "bar"),           Some("../foo".into()));
+    ///
+    /// assert_eq!(
+    ///     diff_utf8_paths(&"/foo/bar/baz", "/foo/bar".to_string()),
+    ///     Some("baz".into())
+    /// );
+    /// assert_eq!(
+    ///     diff_utf8_paths(Utf8Path::new("/foo/bar/baz"), Utf8Path::new("/foo/bar").to_path_buf()),
+    ///     Some("baz".into())
+    /// );
     /// ```
     #[cfg_attr(docsrs, doc(cfg(feature = "camino")))]
     pub fn diff_utf8_paths<P, B>(path: P, base: B) -> Option<Utf8PathBuf>
@@ -152,12 +170,24 @@
 #[cfg(test)]
 mod tests {
     use super::*;
+    use cfg_if::cfg_if;
 
     #[test]
     fn test_absolute() {
-        assert_diff_paths("/foo", "/bar", Some("../foo"));
-        assert_diff_paths("/foo", "bar", Some("/foo"));
-        assert_diff_paths("foo", "/bar", None);
+        fn abs(path: &str) -> String {
+            // Absolute paths look different on Windows vs Unix.
+            cfg_if! {
+                if #[cfg(windows)] {
+                    format!("C:\\{}", path)
+                } else {
+                    format!("/{}", path)
+                }
+            }
+        }
+
+        assert_diff_paths(&abs("foo"), &abs("bar"), Some("../foo"));
+        assert_diff_paths(&abs("foo"), "bar", Some(&abs("foo")));
+        assert_diff_paths("foo", &abs("bar"), None);
         assert_diff_paths("foo", "bar", Some("../foo"));
     }
 
diff --git a/crates/pest_meta/.android-checksum.json b/crates/pest_meta/.android-checksum.json
index b07d72d..2f9f4ea 100644
--- a/crates/pest_meta/.android-checksum.json
+++ b/crates/pest_meta/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"728deb077efbf0ff6f05279cdce76927e5ed63208e50b7334ea829d21d798296","Android.bp":"cb10bb239aecf9719541ab6a8de39d9082b7e8f15bf1ebb802b52670eb543bb2","Cargo.toml":"72a99595341687abe21c931c3151f1b5898dcafc61f343f2269be6b72ff8cb0e","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"e4aa0957bcbdf64ce6b8a7a099561b6d49c0e465ec8678f4f1b69b70c432b6a7","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","_README.md":"6b973bfc5a49b890c6c47d4705f7f6ae59ec30552d0c3fd0fccf77bb1c694157","cargo_embargo.json":"c5d605ed2e9d4fee60736ad7fb51cae33b2e26c246def1fc511c1a97ddd8f82b","src/ast.rs":"9f9429e6156dd2404d50d1be2cb35074b35a575df1b92054c447fb9f13a59715","src/grammar.pest":"c251b4227b1f7bde4a8ce51da0dbda6f0b74e1a3656a0f89dc102059f45592b2","src/grammar.rs":"9bdd8d8b3e4b32ec02c30aa4ec6a6037a3be390b27a9f45dece6598a2e30aa9f","src/lib.rs":"94ee7173be768deddc652da00c552c66478322b9cb78c9e26b6fcffcd62fda08","src/optimizer/concatenator.rs":"f9274358964959ce93b448c76cd113d11bb4283ca1229ad74e240fa4b0f5b24d","src/optimizer/factorizer.rs":"0a867ef8594e8889b56e5dae47fd6b110caa27b4f44bcc1ebd9702aea05191c6","src/optimizer/lister.rs":"19543cd8a7fc8f77a02743ba2c11442df575e44efd02875ffdf763e34d7b8052","src/optimizer/mod.rs":"ae1e9246205ffc03462c568a2553e8e491c511a4d3ec0130c6003d8c2b2460b7","src/optimizer/restorer.rs":"03387bfe3184875c2669b9c3bb9e0e8edeed11649c3f0c68c8639dd18b928b9a","src/optimizer/rotater.rs":"da08287b320acdfabfac863afe93e5069f9f7f57d5ba26fac9f0465b0fa70e0a","src/optimizer/skipper.rs":"6e1197dd225be0ba44e401e1cbe0e4ed761a204e2abb8a3b3fcdfd7dc9b2d420","src/optimizer/unroller.rs":"5f1d2e532cee022c01c6ebd2d5b54c54c34903fefe386fb107a9791610729176","src/parser.rs":"711acef9d6395f885bb6b626f845f0f3da6cf98dd04ffc0cb1474e492b1b159d","src/validator.rs":"c753a92d07c5830819e447bd7187f5c6ff04483756d5a072d1e80f5bebf6809c"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"f64d124d3ae1a57dc3edabaec567b4788b07969eb5315553de5b1ec350e08d9d","Android.bp":"a2da9cb831076114cc9834b3b18af2eba09ad60f91486f75074cbf030d56cd65","Cargo.toml":"9d91c8c69fee2f7faf898dcdc11eb3750a4e3c41af6a4e046d6ce4d8d055178a","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"3c7d45f633c1ead8559a6f768f050573fc500a821368e0fe9b7336b52633f930","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","_README.md":"6b973bfc5a49b890c6c47d4705f7f6ae59ec30552d0c3fd0fccf77bb1c694157","cargo_embargo.json":"c5d605ed2e9d4fee60736ad7fb51cae33b2e26c246def1fc511c1a97ddd8f82b","src/ast.rs":"9f9429e6156dd2404d50d1be2cb35074b35a575df1b92054c447fb9f13a59715","src/grammar.pest":"c251b4227b1f7bde4a8ce51da0dbda6f0b74e1a3656a0f89dc102059f45592b2","src/grammar.rs":"d14610fdea41c41ea535ad86ada51f161f97e733aaf828d00f72201b15aeec41","src/lib.rs":"94ee7173be768deddc652da00c552c66478322b9cb78c9e26b6fcffcd62fda08","src/optimizer/concatenator.rs":"f9274358964959ce93b448c76cd113d11bb4283ca1229ad74e240fa4b0f5b24d","src/optimizer/factorizer.rs":"0a867ef8594e8889b56e5dae47fd6b110caa27b4f44bcc1ebd9702aea05191c6","src/optimizer/lister.rs":"19543cd8a7fc8f77a02743ba2c11442df575e44efd02875ffdf763e34d7b8052","src/optimizer/mod.rs":"fbb59c9d221bfd5a7b9a6645893c0ae3340d6c082de9965c5a298a35df49f759","src/optimizer/restorer.rs":"3b3b8818ea675061d279160a32ccdaed91896b528ba0d31f9f221514aee54fba","src/optimizer/rotater.rs":"da08287b320acdfabfac863afe93e5069f9f7f57d5ba26fac9f0465b0fa70e0a","src/optimizer/skipper.rs":"29b1f89b19798ca8e5204fe7abcb6b9d27da75ae9181bf1edf2799253ea73469","src/optimizer/unroller.rs":"5f1d2e532cee022c01c6ebd2d5b54c54c34903fefe386fb107a9791610729176","src/parser.rs":"0bfe373c4a60a86eca455a09878b07755683e31ac4a461b27401e6cf8d2c40cc","src/validator.rs":"b269baa100abfe80892853302a22c283cab3c26ce339169836a010aa0cccbef8"}}
\ No newline at end of file
diff --git a/crates/pest_meta/.cargo-checksum.json b/crates/pest_meta/.cargo-checksum.json
index 487346d..65fa7b3 100644
--- a/crates/pest_meta/.cargo-checksum.json
+++ b/crates/pest_meta/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"838c43e98436996c366fb27b44e148d43930bf6d7df263899c0438faab46c64d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","_README.md":"bde746653575153be4ae26ce950963ced5034449e352e60cfd8825260c666c16","src/ast.rs":"5787ea2618f7da5a7d9c63a8a9440d22a8f8676b33629ecfc4551b27475a522a","src/grammar.pest":"90077510db0513bed4eb723548aee349e85837ab3a4286a6379b32b9bc237ac8","src/grammar.rs":"d45d92df133c776d9dc5f0dc8638bbac2fe9914f19f50ba2cee60f5b8b0a0cf5","src/lib.rs":"a8cfd7c64bbd2b9dc9f0d21b4f3a6139095ead0964f12da86f4ee8079e546c1e","src/optimizer/concatenator.rs":"ab613bedc7001ab2057a8afee295ee72fc5ba7fc1017f6806477b8caa37af3c8","src/optimizer/factorizer.rs":"b79591db09a2066315f30398a5a2911db19c982ce49bbc7aa6acce894b4e3ede","src/optimizer/lister.rs":"01acfdcadd197c6a1d9dcf313ea9d0bf13983ef34a1c8638e5b439036b7ee924","src/optimizer/mod.rs":"4231e15d3cb283d49310bbe73f0ab39bd47d8f9922d3d4d4bd7f062e20dfb9c0","src/optimizer/restorer.rs":"8b65cfe7dfd4d812bee6ac3cdbcc3d0026e03fd2b456a7c866dd83e6fdbf26a7","src/optimizer/rotater.rs":"08da3716296a6bd7d1872b3dacd961814b87854cdd0d9c714974507fe7aca307","src/optimizer/skipper.rs":"4e9b01e93eac9225d4e05481ce362003bad05121f45543f55f58e5da89857a15","src/optimizer/unroller.rs":"f032acb6b13cfd12aaada312209db8c23e54d5159d9e7283c59887fe5b03aba0","src/parser.rs":"25d1970afde206d7f000cf67854632cd6ecbd6d1cae03ce9251191ae61044131","src/validator.rs":"98b02bead02f8d1dc36245dafb02658c63324a4549ee98f2c942b8356923c5d4"},"package":"a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d"}
\ No newline at end of file
+{"files":{"Cargo.toml":"7a19ed2c2474eb135ef362839128e4bafef4e4e8066e0cfd2500e9bee6459efc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","_README.md":"bde746653575153be4ae26ce950963ced5034449e352e60cfd8825260c666c16","src/ast.rs":"5787ea2618f7da5a7d9c63a8a9440d22a8f8676b33629ecfc4551b27475a522a","src/grammar.pest":"90077510db0513bed4eb723548aee349e85837ab3a4286a6379b32b9bc237ac8","src/grammar.rs":"e0c279feaa90be246169e38a366f99819643034adbb222dadb77c6f9614f01b7","src/lib.rs":"a8cfd7c64bbd2b9dc9f0d21b4f3a6139095ead0964f12da86f4ee8079e546c1e","src/optimizer/concatenator.rs":"ab613bedc7001ab2057a8afee295ee72fc5ba7fc1017f6806477b8caa37af3c8","src/optimizer/factorizer.rs":"b79591db09a2066315f30398a5a2911db19c982ce49bbc7aa6acce894b4e3ede","src/optimizer/lister.rs":"01acfdcadd197c6a1d9dcf313ea9d0bf13983ef34a1c8638e5b439036b7ee924","src/optimizer/mod.rs":"9cad0db9ae289493c3ef67ebe7075291a36005da530f4696ba5300bfd933d96c","src/optimizer/restorer.rs":"04c966b5add5b4b48eb7ffe5d4e3c05729fb09478609e6c77c6b723ec17dbd64","src/optimizer/rotater.rs":"08da3716296a6bd7d1872b3dacd961814b87854cdd0d9c714974507fe7aca307","src/optimizer/skipper.rs":"d786647fa1fdd541015bc195f9ff18ea5618ccca9dcb70ee13638813a89c5936","src/optimizer/unroller.rs":"f032acb6b13cfd12aaada312209db8c23e54d5159d9e7283c59887fe5b03aba0","src/parser.rs":"cfbbdf92047fd09a681f9e63468dc32fd763f6a85ccba8a88d76621ba3a816cb","src/validator.rs":"b0f450cda9e60e74ad51f091b28f496e194f14fb651df3a4ab15ed7fa6a432e6"},"package":"e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea"}
\ No newline at end of file
diff --git a/crates/pest_meta/Android.bp b/crates/pest_meta/Android.bp
index 0fd5041..dfefe3e 100644
--- a/crates/pest_meta/Android.bp
+++ b/crates/pest_meta/Android.bp
@@ -17,7 +17,7 @@
     name: "libpest_meta",
     crate_name: "pest_meta",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.7.6",
+    cargo_pkg_version: "2.7.15",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: ["default"],
diff --git a/crates/pest_meta/Cargo.toml b/crates/pest_meta/Cargo.toml
index 2f5f2c5..05183f2 100644
--- a/crates/pest_meta/Cargo.toml
+++ b/crates/pest_meta/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "pest_meta"
-version = "2.7.6"
+version = "2.7.15"
 authors = ["Dragoș Tiselice <[email protected]>"]
 exclude = ["src/grammar.pest"]
 include = [
@@ -41,10 +41,10 @@
 version = "1.8.0"
 
 [dependencies.pest]
-version = "2.7.6"
+version = "2.7.15"
 
 [build-dependencies.cargo]
-version = "0.72.2"
+version = "0.81.0"
 optional = true
 
 [build-dependencies.sha2]
diff --git a/crates/pest_meta/METADATA b/crates/pest_meta/METADATA
index b03b94f..c2c6d19 100644
--- a/crates/pest_meta/METADATA
+++ b/crates/pest_meta/METADATA
@@ -1,17 +1,17 @@
 name: "pest_meta"
 description: "pest meta language parser and validator"
 third_party {
-  version: "2.7.6"
+  version: "2.7.15"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 2
-    day: 5
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/pest_meta"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/pest_meta/pest_meta-2.7.6.crate"
-    version: "2.7.6"
+    value: "https://static.crates.io/crates/pest_meta/pest_meta-2.7.15.crate"
+    version: "2.7.15"
   }
 }
diff --git a/crates/pest_meta/src/grammar.rs b/crates/pest_meta/src/grammar.rs
index 58cf5ff..3fcf4ab 100644
--- a/crates/pest_meta/src/grammar.rs
+++ b/crates/pest_meta/src/grammar.rs
@@ -1,2 +1,2 @@
 pub struct PestParser;
-# [doc = "Pest meta-grammar\n\n# Warning: Semantic Versioning\nThere may be non-breaking changes to the meta-grammar\nbetween minor versions. Those non-breaking changes, however,\nmay translate into semver-breaking changes due to the additional variants\nadded to the `Rule` enum. This is a known issue and will be fixed in the\nfuture (e.g. by increasing MSRV and non_exhaustive annotations)."] # [allow (dead_code , non_camel_case_types , clippy :: upper_case_acronyms)] # [derive (Clone , Copy , Debug , Eq , Hash , Ord , PartialEq , PartialOrd)] pub enum Rule { # [doc = "End-of-input"] EOI , # [doc = "The top-level rule of a grammar."] r#grammar_rules , # [doc = "A rule of a grammar."] r#grammar_rule , # [doc = "Assignment operator."] r#assignment_operator , # [doc = "Opening brace for a rule."] r#opening_brace , # [doc = "Closing brace for a rule."] r#closing_brace , # [doc = "Opening parenthesis for a branch, PUSH, etc."] r#opening_paren , # [doc = "Closing parenthesis for a branch, PUSH, etc."] r#closing_paren , # [doc = "Opening bracket for PEEK (slice inside)."] r#opening_brack , # [doc = "Closing bracket for PEEK (slice inside)."] r#closing_brack , # [doc = "A rule modifier."] r#modifier , # [doc = "Silent rule prefix."] r#silent_modifier , # [doc = "Atomic rule prefix."] r#atomic_modifier , # [doc = "Compound atomic rule prefix."] r#compound_atomic_modifier , # [doc = "Non-atomic rule prefix."] r#non_atomic_modifier , # [doc = "A tag label."] r#tag_id , # [doc = "For assigning labels to nodes."] r#node_tag , # [doc = "A rule expression."] r#expression , # [doc = "A rule term."] r#term , # [doc = "A rule node (inside terms)."] r#node , # [doc = "A terminal expression."] r#terminal , # [doc = "Possible predicates for a rule."] r#prefix_operator , # [doc = "Branches or sequences."] r#infix_operator , # [doc = "Possible modifiers for a rule."] r#postfix_operator , # [doc = "A positive predicate."] r#positive_predicate_operator , # [doc = "A negative predicate."] r#negative_predicate_operator , # [doc = "A sequence operator."] r#sequence_operator , # [doc = "A choice operator."] r#choice_operator , # [doc = "An optional operator."] r#optional_operator , # [doc = "A repeat operator."] r#repeat_operator , # [doc = "A repeat at least once operator."] r#repeat_once_operator , # [doc = "A repeat exact times."] r#repeat_exact , # [doc = "A repeat at least times."] r#repeat_min , # [doc = "A repeat at most times."] r#repeat_max , # [doc = "A repeat in a range."] r#repeat_min_max , # [doc = "A number."] r#number , # [doc = "An integer number (positive or negative)."] r#integer , # [doc = "A comma terminal."] r#comma , # [doc = "A PUSH expression."] r#_push , # [doc = "A PEEK expression."] r#peek_slice , # [doc = "An identifier."] r#identifier , # [doc = "An alpha character."] r#alpha , # [doc = "An alphanumeric character."] r#alpha_num , # [doc = "A string."] r#string , # [doc = "An insensitive string."] r#insensitive_string , # [doc = "A character range."] r#range , # [doc = "A single quoted character"] r#character , # [doc = "A quoted string."] r#inner_str , # [doc = "An escaped or any character."] r#inner_chr , # [doc = "An escape sequence."] r#escape , # [doc = "A hexadecimal code."] r#code , # [doc = "A unicode code."] r#unicode , # [doc = "A hexadecimal digit."] r#hex_digit , # [doc = "A double quote."] r#quote , # [doc = "A single quote."] r#single_quote , # [doc = "A range operator."] r#range_operator , # [doc = "A newline character."] r#newline , # [doc = "A whitespace character."] r#WHITESPACE , # [doc = "A single line comment."] r#line_comment , # [doc = "A multi-line comment."] r#block_comment , # [doc = "A grammar comment."] r#COMMENT , # [doc = "A space character."] r#space , # [doc = "A top-level comment."] r#grammar_doc , # [doc = "A rule comment."] r#line_doc , # [doc = "A comment content."] r#inner_doc } impl Rule { pub fn all_rules () -> & 'static [Rule] { & [Rule :: r#grammar_rules , Rule :: r#grammar_rule , Rule :: r#assignment_operator , Rule :: r#opening_brace , Rule :: r#closing_brace , Rule :: r#opening_paren , Rule :: r#closing_paren , Rule :: r#opening_brack , Rule :: r#closing_brack , Rule :: r#modifier , Rule :: r#silent_modifier , Rule :: r#atomic_modifier , Rule :: r#compound_atomic_modifier , Rule :: r#non_atomic_modifier , Rule :: r#tag_id , Rule :: r#node_tag , Rule :: r#expression , Rule :: r#term , Rule :: r#node , Rule :: r#terminal , Rule :: r#prefix_operator , Rule :: r#infix_operator , Rule :: r#postfix_operator , Rule :: r#positive_predicate_operator , Rule :: r#negative_predicate_operator , Rule :: r#sequence_operator , Rule :: r#choice_operator , Rule :: r#optional_operator , Rule :: r#repeat_operator , Rule :: r#repeat_once_operator , Rule :: r#repeat_exact , Rule :: r#repeat_min , Rule :: r#repeat_max , Rule :: r#repeat_min_max , Rule :: r#number , Rule :: r#integer , Rule :: r#comma , Rule :: r#_push , Rule :: r#peek_slice , Rule :: r#identifier , Rule :: r#alpha , Rule :: r#alpha_num , Rule :: r#string , Rule :: r#insensitive_string , Rule :: r#range , Rule :: r#character , Rule :: r#inner_str , Rule :: r#inner_chr , Rule :: r#escape , Rule :: r#code , Rule :: r#unicode , Rule :: r#hex_digit , Rule :: r#quote , Rule :: r#single_quote , Rule :: r#range_operator , Rule :: r#newline , Rule :: r#WHITESPACE , Rule :: r#line_comment , Rule :: r#block_comment , Rule :: r#COMMENT , Rule :: r#space , Rule :: r#grammar_doc , Rule :: r#line_doc , Rule :: r#inner_doc] } } # [allow (clippy :: all)] impl :: pest :: Parser < Rule > for PestParser { fn parse < 'i > (rule : Rule , input : & 'i str) -> :: std :: result :: Result < :: pest :: iterators :: Pairs < 'i , Rule > , :: pest :: error :: Error < Rule > > { mod rules { # ! [allow (clippy :: upper_case_acronyms)] pub mod hidden { use super :: super :: Rule ; # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn skip (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { if state . atomicity () == :: pest :: Atomicity :: NonAtomic { state . sequence (| state | { state . repeat (| state | super :: visible :: WHITESPACE (state)) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: visible :: COMMENT (state) . and_then (| state | { state . repeat (| state | super :: visible :: WHITESPACE (state)) }) }) }) }) }) } else { Ok (state) } } } pub mod visible { use super :: super :: Rule ; # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#grammar_rules (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { self :: r#SOI (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#grammar_doc (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#grammar_doc (state) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#grammar_rule (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#grammar_rule (state) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#EOI (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#grammar_rule (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#grammar_rule , | state | { state . sequence (| state | { self :: r#identifier (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#assignment_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . optional (| state | { self :: r#modifier (state) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#opening_brace (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#expression (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) . or_else (| state | { self :: r#line_doc (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#assignment_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#assignment_operator , | state | { state . match_string ("=") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#opening_brace (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#opening_brace , | state | { state . match_string ("{") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#closing_brace (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#closing_brace , | state | { state . match_string ("}") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#opening_paren (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#opening_paren , | state | { state . match_string ("(") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#closing_paren (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#closing_paren , | state | { state . match_string (")") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#opening_brack (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#opening_brack , | state | { state . match_string ("[") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#closing_brack (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#closing_brack , | state | { state . match_string ("]") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#silent_modifier (state) . or_else (| state | { self :: r#atomic_modifier (state) }) . or_else (| state | { self :: r#compound_atomic_modifier (state) }) . or_else (| state | { self :: r#non_atomic_modifier (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#silent_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#silent_modifier , | state | { state . match_string ("_") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#atomic_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#atomic_modifier , | state | { state . match_string ("@") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#compound_atomic_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#compound_atomic_modifier , | state | { state . match_string ("$") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#non_atomic_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#non_atomic_modifier , | state | { state . match_string ("!") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#tag_id (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#tag_id , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("#") . and_then (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha (state) }) }) . and_then (| state | { state . repeat (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha_num (state) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#node_tag (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { self :: r#tag_id (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#assignment_operator (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#expression (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#expression , | state | { state . sequence (| state | { state . optional (| state | { self :: r#choice_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#term (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { state . sequence (| state | { self :: r#infix_operator (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#term (state) }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { state . sequence (| state | { self :: r#infix_operator (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#term (state) }) }) }) }) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#term (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#term , | state | { state . sequence (| state | { state . optional (| state | { self :: r#node_tag (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#prefix_operator (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#prefix_operator (state) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#node (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#postfix_operator (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#postfix_operator (state) }) }) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#node (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { self :: r#opening_paren (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#expression (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_paren (state) }) }) . or_else (| state | { self :: r#terminal (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#terminal (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#_push (state) . or_else (| state | { self :: r#peek_slice (state) }) . or_else (| state | { self :: r#identifier (state) }) . or_else (| state | { self :: r#string (state) }) . or_else (| state | { self :: r#insensitive_string (state) }) . or_else (| state | { self :: r#range (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#prefix_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#positive_predicate_operator (state) . or_else (| state | { self :: r#negative_predicate_operator (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#infix_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#sequence_operator (state) . or_else (| state | { self :: r#choice_operator (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#postfix_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#optional_operator (state) . or_else (| state | { self :: r#repeat_operator (state) }) . or_else (| state | { self :: r#repeat_once_operator (state) }) . or_else (| state | { self :: r#repeat_exact (state) }) . or_else (| state | { self :: r#repeat_min (state) }) . or_else (| state | { self :: r#repeat_max (state) }) . or_else (| state | { self :: r#repeat_min_max (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#positive_predicate_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#positive_predicate_operator , | state | { state . match_string ("&") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#negative_predicate_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#negative_predicate_operator , | state | { state . match_string ("!") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#sequence_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#sequence_operator , | state | { state . match_string ("~") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#choice_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#choice_operator , | state | { state . match_string ("|") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#optional_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#optional_operator , | state | { state . match_string ("?") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_operator , | state | { state . match_string ("*") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_once_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_once_operator , | state | { state . match_string ("+") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_exact (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_exact , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_min (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_min , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#comma (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_max (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_max , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#comma (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_min_max (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_min_max , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#comma (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#number (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#number , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_range ('0' .. '9') . and_then (| state | { state . repeat (| state | { state . match_range ('0' .. '9') }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#integer (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#integer , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { self :: r#number (state) . or_else (| state | { state . sequence (| state | { state . match_string ("-") . and_then (| state | { state . repeat (| state | { state . match_string ("0") }) }) . and_then (| state | { state . match_range ('1' .. '9') }) . and_then (| state | { state . optional (| state | { self :: r#number (state) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#comma (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#comma , | state | { state . match_string (",") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#_push (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#_push , | state | { state . sequence (| state | { state . match_string ("PUSH") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#opening_paren (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#expression (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_paren (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#peek_slice (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#peek_slice , | state | { state . sequence (| state | { state . match_string ("PEEK") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#opening_brack (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . optional (| state | { self :: r#integer (state) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#range_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . optional (| state | { self :: r#integer (state) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brack (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#identifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#identifier , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . lookahead (false , | state | { state . match_string ("PUSH") }) . and_then (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha (state) }) }) . and_then (| state | { state . repeat (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha_num (state) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#alpha (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . match_range ('a' .. 'z') . or_else (| state | { state . match_range ('A' .. 'Z') }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#alpha_num (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#alpha (state) . or_else (| state | { state . match_range ('0' .. '9') }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#string (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#string , | state | { state . sequence (| state | { self :: r#quote (state) . and_then (| state | { self :: r#inner_str (state) }) . and_then (| state | { self :: r#quote (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#insensitive_string (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#insensitive_string , | state | { state . sequence (| state | { state . match_string ("^") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#string (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#range (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#range , | state | { state . sequence (| state | { self :: r#character (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#range_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#character (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#character (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#character , | state | { state . sequence (| state | { self :: r#single_quote (state) . and_then (| state | { self :: r#inner_chr (state) }) . and_then (| state | { self :: r#single_quote (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#inner_str (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#inner_str , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { let strings = ["\"" , "\\"] ; state . skip_until (& strings) . and_then (| state | { state . optional (| state | { state . sequence (| state | { self :: r#escape (state) . and_then (| state | { self :: r#inner_str (state) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#inner_chr (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#inner_chr , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { self :: r#escape (state) . or_else (| state | { self :: r#ANY (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#escape (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#escape , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("\\") . and_then (| state | { state . match_string ("\"") . or_else (| state | { state . match_string ("\\") }) . or_else (| state | { state . match_string ("r") }) . or_else (| state | { state . match_string ("n") }) . or_else (| state | { state . match_string ("t") }) . or_else (| state | { state . match_string ("0") }) . or_else (| state | { state . match_string ("'") }) . or_else (| state | { self :: r#code (state) }) . or_else (| state | { self :: r#unicode (state) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#code (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#code , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("x") . and_then (| state | { self :: r#hex_digit (state) }) . and_then (| state | { self :: r#hex_digit (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#unicode (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#unicode , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("u") . and_then (| state | { self :: r#opening_brace (state) }) . and_then (| state | { state . sequence (| state | { self :: r#hex_digit (state) . and_then (| state | { self :: r#hex_digit (state) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) }) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#hex_digit (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#hex_digit , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . match_range ('0' .. '9') . or_else (| state | { state . match_range ('a' .. 'f') }) . or_else (| state | { state . match_range ('A' .. 'F') }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#quote (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#quote , | state | { state . match_string ("\"") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#single_quote (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#single_quote , | state | { state . match_string ("'") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#range_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#range_operator , | state | { state . match_string ("..") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#newline (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . match_string ("\n") . or_else (| state | { state . match_string ("\r\n") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#WHITESPACE (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . match_string (" ") . or_else (| state | { state . match_string ("\t") }) . or_else (| state | { self :: r#newline (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#line_comment (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { state . match_string ("//") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . lookahead (false , | state | { state . match_string ("/") . or_else (| state | { state . match_string ("!") }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { state . sequence (| state | { state . lookahead (false , | state | { self :: r#newline (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { state . sequence (| state | { state . lookahead (false , | state | { self :: r#newline (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#block_comment (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { state . match_string ("/*") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#block_comment (state) . or_else (| state | { state . sequence (| state | { state . lookahead (false , | state | { state . match_string ("*/") }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#block_comment (state) . or_else (| state | { state . sequence (| state | { state . lookahead (false , | state | { state . match_string ("*/") }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . match_string ("*/") }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#COMMENT (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: Atomic , | state | { self :: r#block_comment (state) . or_else (| state | { self :: r#line_comment (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#space (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . match_string (" ") . or_else (| state | { state . match_string ("\t") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#grammar_doc (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#grammar_doc , | state | { state . sequence (| state | { state . match_string ("//!") . and_then (| state | { state . optional (| state | { self :: r#space (state) }) }) . and_then (| state | { self :: r#inner_doc (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#line_doc (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#line_doc , | state | { state . sequence (| state | { state . match_string ("///") . and_then (| state | { state . optional (| state | { self :: r#space (state) }) }) . and_then (| state | { self :: r#inner_doc (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#inner_doc (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#inner_doc , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . repeat (| state | { state . sequence (| state | { state . lookahead (false , | state | { self :: r#newline (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) }) }) } # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn ANY (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . skip (1) } # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn EOI (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: EOI , | state | state . end_of_input ()) } # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn SOI (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . start_of_input () } } pub use self :: visible :: * ; } :: pest :: state (input , | state | { match rule { Rule :: r#grammar_rules => rules :: r#grammar_rules (state) , Rule :: r#grammar_rule => rules :: r#grammar_rule (state) , Rule :: r#assignment_operator => rules :: r#assignment_operator (state) , Rule :: r#opening_brace => rules :: r#opening_brace (state) , Rule :: r#closing_brace => rules :: r#closing_brace (state) , Rule :: r#opening_paren => rules :: r#opening_paren (state) , Rule :: r#closing_paren => rules :: r#closing_paren (state) , Rule :: r#opening_brack => rules :: r#opening_brack (state) , Rule :: r#closing_brack => rules :: r#closing_brack (state) , Rule :: r#modifier => rules :: r#modifier (state) , Rule :: r#silent_modifier => rules :: r#silent_modifier (state) , Rule :: r#atomic_modifier => rules :: r#atomic_modifier (state) , Rule :: r#compound_atomic_modifier => rules :: r#compound_atomic_modifier (state) , Rule :: r#non_atomic_modifier => rules :: r#non_atomic_modifier (state) , Rule :: r#tag_id => rules :: r#tag_id (state) , Rule :: r#node_tag => rules :: r#node_tag (state) , Rule :: r#expression => rules :: r#expression (state) , Rule :: r#term => rules :: r#term (state) , Rule :: r#node => rules :: r#node (state) , Rule :: r#terminal => rules :: r#terminal (state) , Rule :: r#prefix_operator => rules :: r#prefix_operator (state) , Rule :: r#infix_operator => rules :: r#infix_operator (state) , Rule :: r#postfix_operator => rules :: r#postfix_operator (state) , Rule :: r#positive_predicate_operator => rules :: r#positive_predicate_operator (state) , Rule :: r#negative_predicate_operator => rules :: r#negative_predicate_operator (state) , Rule :: r#sequence_operator => rules :: r#sequence_operator (state) , Rule :: r#choice_operator => rules :: r#choice_operator (state) , Rule :: r#optional_operator => rules :: r#optional_operator (state) , Rule :: r#repeat_operator => rules :: r#repeat_operator (state) , Rule :: r#repeat_once_operator => rules :: r#repeat_once_operator (state) , Rule :: r#repeat_exact => rules :: r#repeat_exact (state) , Rule :: r#repeat_min => rules :: r#repeat_min (state) , Rule :: r#repeat_max => rules :: r#repeat_max (state) , Rule :: r#repeat_min_max => rules :: r#repeat_min_max (state) , Rule :: r#number => rules :: r#number (state) , Rule :: r#integer => rules :: r#integer (state) , Rule :: r#comma => rules :: r#comma (state) , Rule :: r#_push => rules :: r#_push (state) , Rule :: r#peek_slice => rules :: r#peek_slice (state) , Rule :: r#identifier => rules :: r#identifier (state) , Rule :: r#alpha => rules :: r#alpha (state) , Rule :: r#alpha_num => rules :: r#alpha_num (state) , Rule :: r#string => rules :: r#string (state) , Rule :: r#insensitive_string => rules :: r#insensitive_string (state) , Rule :: r#range => rules :: r#range (state) , Rule :: r#character => rules :: r#character (state) , Rule :: r#inner_str => rules :: r#inner_str (state) , Rule :: r#inner_chr => rules :: r#inner_chr (state) , Rule :: r#escape => rules :: r#escape (state) , Rule :: r#code => rules :: r#code (state) , Rule :: r#unicode => rules :: r#unicode (state) , Rule :: r#hex_digit => rules :: r#hex_digit (state) , Rule :: r#quote => rules :: r#quote (state) , Rule :: r#single_quote => rules :: r#single_quote (state) , Rule :: r#range_operator => rules :: r#range_operator (state) , Rule :: r#newline => rules :: r#newline (state) , Rule :: r#WHITESPACE => rules :: r#WHITESPACE (state) , Rule :: r#line_comment => rules :: r#line_comment (state) , Rule :: r#block_comment => rules :: r#block_comment (state) , Rule :: r#COMMENT => rules :: r#COMMENT (state) , Rule :: r#space => rules :: r#space (state) , Rule :: r#grammar_doc => rules :: r#grammar_doc (state) , Rule :: r#line_doc => rules :: r#line_doc (state) , Rule :: r#inner_doc => rules :: r#inner_doc (state) , Rule :: EOI => rules :: EOI (state) } }) } }
+# [doc = "Pest meta-grammar\n\n# Warning: Semantic Versioning\nThere may be non-breaking changes to the meta-grammar\nbetween minor versions. Those non-breaking changes, however,\nmay translate into semver-breaking changes due to the additional variants\nadded to the `Rule` enum. This is a known issue and will be fixed in the\nfuture (e.g. by increasing MSRV and non_exhaustive annotations)."] # [allow (dead_code , non_camel_case_types , clippy :: upper_case_acronyms)] # [derive (Clone , Copy , Debug , Eq , Hash , Ord , PartialEq , PartialOrd)] pub enum Rule { # [doc = "End-of-input"] EOI , # [doc = "The top-level rule of a grammar."] r#grammar_rules , # [doc = "A rule of a grammar."] r#grammar_rule , # [doc = "Assignment operator."] r#assignment_operator , # [doc = "Opening brace for a rule."] r#opening_brace , # [doc = "Closing brace for a rule."] r#closing_brace , # [doc = "Opening parenthesis for a branch, PUSH, etc."] r#opening_paren , # [doc = "Closing parenthesis for a branch, PUSH, etc."] r#closing_paren , # [doc = "Opening bracket for PEEK (slice inside)."] r#opening_brack , # [doc = "Closing bracket for PEEK (slice inside)."] r#closing_brack , # [doc = "A rule modifier."] r#modifier , # [doc = "Silent rule prefix."] r#silent_modifier , # [doc = "Atomic rule prefix."] r#atomic_modifier , # [doc = "Compound atomic rule prefix."] r#compound_atomic_modifier , # [doc = "Non-atomic rule prefix."] r#non_atomic_modifier , # [doc = "A tag label."] r#tag_id , # [doc = "For assigning labels to nodes."] r#node_tag , # [doc = "A rule expression."] r#expression , # [doc = "A rule term."] r#term , # [doc = "A rule node (inside terms)."] r#node , # [doc = "A terminal expression."] r#terminal , # [doc = "Possible predicates for a rule."] r#prefix_operator , # [doc = "Branches or sequences."] r#infix_operator , # [doc = "Possible modifiers for a rule."] r#postfix_operator , # [doc = "A positive predicate."] r#positive_predicate_operator , # [doc = "A negative predicate."] r#negative_predicate_operator , # [doc = "A sequence operator."] r#sequence_operator , # [doc = "A choice operator."] r#choice_operator , # [doc = "An optional operator."] r#optional_operator , # [doc = "A repeat operator."] r#repeat_operator , # [doc = "A repeat at least once operator."] r#repeat_once_operator , # [doc = "A repeat exact times."] r#repeat_exact , # [doc = "A repeat at least times."] r#repeat_min , # [doc = "A repeat at most times."] r#repeat_max , # [doc = "A repeat in a range."] r#repeat_min_max , # [doc = "A number."] r#number , # [doc = "An integer number (positive or negative)."] r#integer , # [doc = "A comma terminal."] r#comma , # [doc = "A PUSH expression."] r#_push , # [doc = "A PEEK expression."] r#peek_slice , # [doc = "An identifier."] r#identifier , # [doc = "An alpha character."] r#alpha , # [doc = "An alphanumeric character."] r#alpha_num , # [doc = "A string."] r#string , # [doc = "An insensitive string."] r#insensitive_string , # [doc = "A character range."] r#range , # [doc = "A single quoted character"] r#character , # [doc = "A quoted string."] r#inner_str , # [doc = "An escaped or any character."] r#inner_chr , # [doc = "An escape sequence."] r#escape , # [doc = "A hexadecimal code."] r#code , # [doc = "A unicode code."] r#unicode , # [doc = "A hexadecimal digit."] r#hex_digit , # [doc = "A double quote."] r#quote , # [doc = "A single quote."] r#single_quote , # [doc = "A range operator."] r#range_operator , # [doc = "A newline character."] r#newline , # [doc = "A whitespace character."] r#WHITESPACE , # [doc = "A single line comment."] r#line_comment , # [doc = "A multi-line comment."] r#block_comment , # [doc = "A grammar comment."] r#COMMENT , # [doc = "A space character."] r#space , # [doc = "A top-level comment."] r#grammar_doc , # [doc = "A rule comment."] r#line_doc , # [doc = "A comment content."] r#inner_doc } impl Rule { pub fn all_rules () -> & 'static [Rule] { & [Rule :: r#grammar_rules , Rule :: r#grammar_rule , Rule :: r#assignment_operator , Rule :: r#opening_brace , Rule :: r#closing_brace , Rule :: r#opening_paren , Rule :: r#closing_paren , Rule :: r#opening_brack , Rule :: r#closing_brack , Rule :: r#modifier , Rule :: r#silent_modifier , Rule :: r#atomic_modifier , Rule :: r#compound_atomic_modifier , Rule :: r#non_atomic_modifier , Rule :: r#tag_id , Rule :: r#node_tag , Rule :: r#expression , Rule :: r#term , Rule :: r#node , Rule :: r#terminal , Rule :: r#prefix_operator , Rule :: r#infix_operator , Rule :: r#postfix_operator , Rule :: r#positive_predicate_operator , Rule :: r#negative_predicate_operator , Rule :: r#sequence_operator , Rule :: r#choice_operator , Rule :: r#optional_operator , Rule :: r#repeat_operator , Rule :: r#repeat_once_operator , Rule :: r#repeat_exact , Rule :: r#repeat_min , Rule :: r#repeat_max , Rule :: r#repeat_min_max , Rule :: r#number , Rule :: r#integer , Rule :: r#comma , Rule :: r#_push , Rule :: r#peek_slice , Rule :: r#identifier , Rule :: r#alpha , Rule :: r#alpha_num , Rule :: r#string , Rule :: r#insensitive_string , Rule :: r#range , Rule :: r#character , Rule :: r#inner_str , Rule :: r#inner_chr , Rule :: r#escape , Rule :: r#code , Rule :: r#unicode , Rule :: r#hex_digit , Rule :: r#quote , Rule :: r#single_quote , Rule :: r#range_operator , Rule :: r#newline , Rule :: r#WHITESPACE , Rule :: r#line_comment , Rule :: r#block_comment , Rule :: r#COMMENT , Rule :: r#space , Rule :: r#grammar_doc , Rule :: r#line_doc , Rule :: r#inner_doc] } } # [allow (clippy :: all)] impl :: pest :: Parser < Rule > for PestParser { fn parse < 'i > (rule : Rule , input : & 'i str) -> :: std :: result :: Result < :: pest :: iterators :: Pairs < 'i , Rule > , :: pest :: error :: Error < Rule > > { mod rules { # ! [allow (clippy :: upper_case_acronyms)] pub mod hidden { use super :: super :: Rule ; # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn skip (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { if state . atomicity () == :: pest :: Atomicity :: NonAtomic { state . sequence (| state | { state . repeat (| state | super :: visible :: WHITESPACE (state)) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: visible :: COMMENT (state) . and_then (| state | { state . repeat (| state | super :: visible :: WHITESPACE (state)) }) }) }) }) }) } else { Ok (state) } } } pub mod visible { use super :: super :: Rule ; # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#grammar_rules (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { self :: r#SOI (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#grammar_doc (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#grammar_doc (state) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#grammar_rule (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#grammar_rule (state) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#EOI (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#grammar_rule (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#grammar_rule , | state | { state . sequence (| state | { self :: r#identifier (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#assignment_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . optional (| state | { self :: r#modifier (state) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#opening_brace (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#expression (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) . or_else (| state | { self :: r#line_doc (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#assignment_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#assignment_operator , | state | { state . match_string ("=") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#opening_brace (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#opening_brace , | state | { state . match_string ("{") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#closing_brace (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#closing_brace , | state | { state . match_string ("}") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#opening_paren (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#opening_paren , | state | { state . match_string ("(") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#closing_paren (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#closing_paren , | state | { state . match_string (")") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#opening_brack (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#opening_brack , | state | { state . match_string ("[") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#closing_brack (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#closing_brack , | state | { state . match_string ("]") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#silent_modifier (state) . or_else (| state | { self :: r#atomic_modifier (state) }) . or_else (| state | { self :: r#compound_atomic_modifier (state) }) . or_else (| state | { self :: r#non_atomic_modifier (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#silent_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#silent_modifier , | state | { state . match_string ("_") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#atomic_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#atomic_modifier , | state | { state . match_string ("@") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#compound_atomic_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#compound_atomic_modifier , | state | { state . match_string ("$") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#non_atomic_modifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#non_atomic_modifier , | state | { state . match_string ("!") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#tag_id (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#tag_id , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("#") . and_then (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha (state) }) }) . and_then (| state | { state . repeat (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha_num (state) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#node_tag (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { self :: r#tag_id (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#assignment_operator (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#expression (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#expression , | state | { state . sequence (| state | { state . optional (| state | { self :: r#choice_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#term (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { state . sequence (| state | { self :: r#infix_operator (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#term (state) }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { state . sequence (| state | { self :: r#infix_operator (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#term (state) }) }) }) }) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#term (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#term , | state | { state . sequence (| state | { state . optional (| state | { self :: r#node_tag (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#prefix_operator (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#prefix_operator (state) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#node (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#postfix_operator (state) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#postfix_operator (state) }) }) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#node (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { self :: r#opening_paren (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#expression (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_paren (state) }) }) . or_else (| state | { self :: r#terminal (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#terminal (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#_push (state) . or_else (| state | { self :: r#peek_slice (state) }) . or_else (| state | { self :: r#identifier (state) }) . or_else (| state | { self :: r#string (state) }) . or_else (| state | { self :: r#insensitive_string (state) }) . or_else (| state | { self :: r#range (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#prefix_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#positive_predicate_operator (state) . or_else (| state | { self :: r#negative_predicate_operator (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#infix_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#sequence_operator (state) . or_else (| state | { self :: r#choice_operator (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#postfix_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#optional_operator (state) . or_else (| state | { self :: r#repeat_operator (state) }) . or_else (| state | { self :: r#repeat_once_operator (state) }) . or_else (| state | { self :: r#repeat_exact (state) }) . or_else (| state | { self :: r#repeat_min (state) }) . or_else (| state | { self :: r#repeat_max (state) }) . or_else (| state | { self :: r#repeat_min_max (state) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#positive_predicate_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#positive_predicate_operator , | state | { state . match_string ("&") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#negative_predicate_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#negative_predicate_operator , | state | { state . match_string ("!") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#sequence_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#sequence_operator , | state | { state . match_string ("~") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#choice_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#choice_operator , | state | { state . match_string ("|") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#optional_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#optional_operator , | state | { state . match_string ("?") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_operator , | state | { state . match_string ("*") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_once_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_once_operator , | state | { state . match_string ("+") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_exact (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_exact , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_min (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_min , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#comma (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_max (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_max , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#comma (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#repeat_min_max (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#repeat_min_max , | state | { state . sequence (| state | { self :: r#opening_brace (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#comma (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#number (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#number (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#number , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_range ('0' .. '9') . and_then (| state | { state . repeat (| state | { state . match_range ('0' .. '9') }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#integer (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#integer , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { self :: r#number (state) . or_else (| state | { state . sequence (| state | { state . match_string ("-") . and_then (| state | { state . repeat (| state | { state . match_string ("0") }) }) . and_then (| state | { state . match_range ('1' .. '9') }) . and_then (| state | { state . optional (| state | { self :: r#number (state) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#comma (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#comma , | state | { state . match_string (",") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#_push (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#_push , | state | { state . sequence (| state | { state . match_string ("PUSH") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#opening_paren (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#expression (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_paren (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#peek_slice (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#peek_slice , | state | { state . sequence (| state | { state . match_string ("PEEK") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#opening_brack (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . optional (| state | { self :: r#integer (state) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#range_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . optional (| state | { self :: r#integer (state) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#closing_brack (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#identifier (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#identifier , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . lookahead (false , | state | { state . match_string ("PUSH") }) . and_then (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha (state) }) }) . and_then (| state | { state . repeat (| state | { state . match_string ("_") . or_else (| state | { self :: r#alpha_num (state) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#alpha (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . match_range ('a' .. 'z') . or_else (| state | { state . match_range ('A' .. 'Z') }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#alpha_num (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { self :: r#alpha (state) . or_else (| state | { state . match_range ('0' .. '9') }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#string (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#string , | state | { state . sequence (| state | { self :: r#quote (state) . and_then (| state | { self :: r#inner_str (state) }) . and_then (| state | { self :: r#quote (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#insensitive_string (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#insensitive_string , | state | { state . sequence (| state | { state . match_string ("^") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#string (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#range (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#range , | state | { state . sequence (| state | { self :: r#character (state) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#range_operator (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#character (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#character (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#character , | state | { state . sequence (| state | { self :: r#single_quote (state) . and_then (| state | { self :: r#inner_chr (state) }) . and_then (| state | { self :: r#single_quote (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#inner_str (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#inner_str , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { let strings = ["\"" , "\\"] ; state . skip_until (& strings) . and_then (| state | { state . optional (| state | { state . sequence (| state | { self :: r#escape (state) . and_then (| state | { self :: r#inner_str (state) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#inner_chr (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#inner_chr , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { self :: r#escape (state) . or_else (| state | { self :: r#ANY (state) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#escape (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#escape , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("\\") . and_then (| state | { state . match_string ("\"") . or_else (| state | { state . match_string ("\\") }) . or_else (| state | { state . match_string ("r") }) . or_else (| state | { state . match_string ("n") }) . or_else (| state | { state . match_string ("t") }) . or_else (| state | { state . match_string ("0") }) . or_else (| state | { state . match_string ("'") }) . or_else (| state | { self :: r#code (state) }) . or_else (| state | { self :: r#unicode (state) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#code (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#code , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("x") . and_then (| state | { self :: r#hex_digit (state) }) . and_then (| state | { self :: r#hex_digit (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#unicode (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#unicode , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . sequence (| state | { state . match_string ("u") . and_then (| state | { self :: r#opening_brace (state) }) . and_then (| state | { state . sequence (| state | { self :: r#hex_digit (state) . and_then (| state | { self :: r#hex_digit (state) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) . and_then (| state | { state . optional (| state | { self :: r#hex_digit (state) }) }) }) }) . and_then (| state | { self :: r#closing_brace (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#hex_digit (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#hex_digit , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . match_range ('0' .. '9') . or_else (| state | { state . match_range ('a' .. 'f') }) . or_else (| state | { state . match_range ('A' .. 'F') }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#quote (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#quote , | state | { state . match_string ("\"") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#single_quote (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#single_quote , | state | { state . match_string ("'") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#range_operator (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#range_operator , | state | { state . match_string ("..") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#newline (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . match_string ("\n") . or_else (| state | { state . match_string ("\r\n") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#WHITESPACE (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: Atomic , | state | { state . match_string (" ") . or_else (| state | { state . match_string ("\t") }) . or_else (| state | { self :: r#newline (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#line_comment (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { state . match_string ("//") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . lookahead (false , | state | { state . match_string ("/") . or_else (| state | { state . match_string ("!") }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { state . sequence (| state | { state . lookahead (false , | state | { self :: r#newline (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { state . sequence (| state | { state . lookahead (false , | state | { self :: r#newline (state) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) }) }) }) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#block_comment (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . sequence (| state | { state . match_string ("/*") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { self :: r#block_comment (state) . or_else (| state | { state . sequence (| state | { state . lookahead (false , | state | { state . match_string ("*/") }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { self :: r#block_comment (state) . or_else (| state | { state . sequence (| state | { state . lookahead (false , | state | { state . match_string ("*/") }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { self :: r#ANY (state) }) }) }) }) }) }) }) }) }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . match_string ("*/") }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#COMMENT (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: Atomic , | state | { self :: r#block_comment (state) . or_else (| state | { self :: r#line_comment (state) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#space (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . match_string (" ") . or_else (| state | { state . match_string ("\t") }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#grammar_doc (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#grammar_doc , | state | { state . sequence (| state | { state . match_string ("//!") . and_then (| state | { state . optional (| state | { self :: r#space (state) }) }) . and_then (| state | { self :: r#inner_doc (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#line_doc (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . atomic (:: pest :: Atomicity :: CompoundAtomic , | state | { state . rule (Rule :: r#line_doc , | state | { state . sequence (| state | { state . match_string ("///") . and_then (| state | { state . optional (| state | { self :: r#space (state) }) }) . and_then (| state | { self :: r#inner_doc (state) }) }) }) }) } # [inline] # [allow (non_snake_case , unused_variables)] pub fn r#inner_doc (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: r#inner_doc , | state | { state . atomic (:: pest :: Atomicity :: Atomic , | state | { let strings = ["\n" , "\r\n"] ; state . skip_until (& strings) }) }) } # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn ANY (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . skip (1) } # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn EOI (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . rule (Rule :: EOI , | state | state . end_of_input ()) } # [inline] # [allow (dead_code , non_snake_case , unused_variables)] pub fn SOI (state : :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >>) -> :: pest :: ParseResult < :: std :: boxed :: Box < :: pest :: ParserState < '_ , Rule >> > { state . start_of_input () } } pub use self :: visible :: * ; } :: pest :: state (input , | state | { match rule { Rule :: r#grammar_rules => rules :: r#grammar_rules (state) , Rule :: r#grammar_rule => rules :: r#grammar_rule (state) , Rule :: r#assignment_operator => rules :: r#assignment_operator (state) , Rule :: r#opening_brace => rules :: r#opening_brace (state) , Rule :: r#closing_brace => rules :: r#closing_brace (state) , Rule :: r#opening_paren => rules :: r#opening_paren (state) , Rule :: r#closing_paren => rules :: r#closing_paren (state) , Rule :: r#opening_brack => rules :: r#opening_brack (state) , Rule :: r#closing_brack => rules :: r#closing_brack (state) , Rule :: r#modifier => rules :: r#modifier (state) , Rule :: r#silent_modifier => rules :: r#silent_modifier (state) , Rule :: r#atomic_modifier => rules :: r#atomic_modifier (state) , Rule :: r#compound_atomic_modifier => rules :: r#compound_atomic_modifier (state) , Rule :: r#non_atomic_modifier => rules :: r#non_atomic_modifier (state) , Rule :: r#tag_id => rules :: r#tag_id (state) , Rule :: r#node_tag => rules :: r#node_tag (state) , Rule :: r#expression => rules :: r#expression (state) , Rule :: r#term => rules :: r#term (state) , Rule :: r#node => rules :: r#node (state) , Rule :: r#terminal => rules :: r#terminal (state) , Rule :: r#prefix_operator => rules :: r#prefix_operator (state) , Rule :: r#infix_operator => rules :: r#infix_operator (state) , Rule :: r#postfix_operator => rules :: r#postfix_operator (state) , Rule :: r#positive_predicate_operator => rules :: r#positive_predicate_operator (state) , Rule :: r#negative_predicate_operator => rules :: r#negative_predicate_operator (state) , Rule :: r#sequence_operator => rules :: r#sequence_operator (state) , Rule :: r#choice_operator => rules :: r#choice_operator (state) , Rule :: r#optional_operator => rules :: r#optional_operator (state) , Rule :: r#repeat_operator => rules :: r#repeat_operator (state) , Rule :: r#repeat_once_operator => rules :: r#repeat_once_operator (state) , Rule :: r#repeat_exact => rules :: r#repeat_exact (state) , Rule :: r#repeat_min => rules :: r#repeat_min (state) , Rule :: r#repeat_max => rules :: r#repeat_max (state) , Rule :: r#repeat_min_max => rules :: r#repeat_min_max (state) , Rule :: r#number => rules :: r#number (state) , Rule :: r#integer => rules :: r#integer (state) , Rule :: r#comma => rules :: r#comma (state) , Rule :: r#_push => rules :: r#_push (state) , Rule :: r#peek_slice => rules :: r#peek_slice (state) , Rule :: r#identifier => rules :: r#identifier (state) , Rule :: r#alpha => rules :: r#alpha (state) , Rule :: r#alpha_num => rules :: r#alpha_num (state) , Rule :: r#string => rules :: r#string (state) , Rule :: r#insensitive_string => rules :: r#insensitive_string (state) , Rule :: r#range => rules :: r#range (state) , Rule :: r#character => rules :: r#character (state) , Rule :: r#inner_str => rules :: r#inner_str (state) , Rule :: r#inner_chr => rules :: r#inner_chr (state) , Rule :: r#escape => rules :: r#escape (state) , Rule :: r#code => rules :: r#code (state) , Rule :: r#unicode => rules :: r#unicode (state) , Rule :: r#hex_digit => rules :: r#hex_digit (state) , Rule :: r#quote => rules :: r#quote (state) , Rule :: r#single_quote => rules :: r#single_quote (state) , Rule :: r#range_operator => rules :: r#range_operator (state) , Rule :: r#newline => rules :: r#newline (state) , Rule :: r#WHITESPACE => rules :: r#WHITESPACE (state) , Rule :: r#line_comment => rules :: r#line_comment (state) , Rule :: r#block_comment => rules :: r#block_comment (state) , Rule :: r#COMMENT => rules :: r#COMMENT (state) , Rule :: r#space => rules :: r#space (state) , Rule :: r#grammar_doc => rules :: r#grammar_doc (state) , Rule :: r#line_doc => rules :: r#line_doc (state) , Rule :: r#inner_doc => rules :: r#inner_doc (state) , Rule :: EOI => rules :: EOI (state) } }) } }
diff --git a/crates/pest_meta/src/optimizer/mod.rs b/crates/pest_meta/src/optimizer/mod.rs
index e1cc263..b3bea51 100644
--- a/crates/pest_meta/src/optimizer/mod.rs
+++ b/crates/pest_meta/src/optimizer/mod.rs
@@ -30,10 +30,11 @@
 
 /// Takes pest's ASTs and optimizes them
 pub fn optimize(rules: Vec<Rule>) -> Vec<OptimizedRule> {
+    let map = to_hash_map(&rules);
     let optimized: Vec<OptimizedRule> = rules
         .into_iter()
         .map(rotater::rotate)
-        .map(skipper::skip)
+        .map(|rule| skipper::skip(rule, &map))
         .map(unroller::unroll)
         .map(concatenator::concatenate)
         .map(factorizer::factor)
@@ -41,10 +42,10 @@
         .map(rule_to_optimized_rule)
         .collect();
 
-    let rules = to_hash_map(&optimized);
+    let optimized_map = to_optimized_hash_map(&optimized);
     optimized
         .into_iter()
-        .map(|rule| restorer::restore_on_err(rule, &rules))
+        .map(|rule| restorer::restore_on_err(rule, &optimized_map))
         .collect()
 }
 
@@ -87,12 +88,18 @@
     }
 }
 
-fn to_hash_map(rules: &[OptimizedRule]) -> HashMap<String, OptimizedExpr> {
-    rules
-        .iter()
-        .map(|r| (r.name.clone(), r.expr.clone()))
-        .collect()
+macro_rules! to_hash_map {
+    ($func_name:ident, $rule:ty, $expr:ty) => {
+        fn $func_name(rules: &[$rule]) -> HashMap<String, $expr> {
+            rules
+                .iter()
+                .map(|r| (r.name.clone(), r.expr.clone()))
+                .collect()
+        }
+    };
 }
+to_hash_map!(to_hash_map, Rule, Expr);
+to_hash_map!(to_optimized_hash_map, OptimizedRule, OptimizedExpr);
 
 /// The optimized version of the pest AST's `Rule`.
 #[derive(Clone, Debug, Eq, PartialEq)]
@@ -1041,6 +1048,37 @@
         }
 
         #[test]
+        fn inline_skip() {
+            use crate::ast::Expr::*;
+            let rules = vec![
+                Rule {
+                    name: "inline".to_owned(),
+                    ty: RuleType::Atomic,
+                    expr: Str("a".to_owned()),
+                },
+                Rule {
+                    name: "skip".to_owned(),
+                    ty: RuleType::Atomic,
+                    expr: box_tree!(Rep(Seq(
+                        NegPred(Choice(
+                            Ident(String::from("inline")),
+                            Str(String::from("b"))
+                        )),
+                        Ident("ANY".to_owned())
+                    ))),
+                },
+            ];
+            let map = to_hash_map(&rules);
+            let rule = skipper::skip(rules[1].clone(), &map);
+            assert!(matches!(rule, Rule { expr: Skip(..), .. }));
+            let choices = match rule.expr {
+                Skip(choices) => choices,
+                _ => unreachable!(),
+            };
+            assert_eq!(choices, vec!["a".to_owned(), "b".to_owned()]);
+        }
+
+        #[test]
         fn push() {
             assert_eq!(
                 OptimizedExpr::Push(Box::new(OptimizedExpr::Ident("e".to_owned()))).to_string(),
diff --git a/crates/pest_meta/src/optimizer/restorer.rs b/crates/pest_meta/src/optimizer/restorer.rs
index e128e03..47c28ed 100644
--- a/crates/pest_meta/src/optimizer/restorer.rs
+++ b/crates/pest_meta/src/optimizer/restorer.rs
@@ -103,7 +103,7 @@
         }];
 
         assert_eq!(
-            restore_on_err(rules[0].clone(), &to_hash_map(&rules)),
+            restore_on_err(rules[0].clone(), &to_optimized_hash_map(&rules)),
             rules[0].clone()
         );
     }
@@ -123,7 +123,7 @@
         };
 
         assert_eq!(
-            restore_on_err(rules[0].clone(), &to_hash_map(&rules)),
+            restore_on_err(rules[0].clone(), &to_optimized_hash_map(&rules)),
             restored
         );
     }
@@ -146,7 +146,7 @@
         };
 
         assert_eq!(
-            restore_on_err(rules[0].clone(), &to_hash_map(&rules)),
+            restore_on_err(rules[0].clone(), &to_optimized_hash_map(&rules)),
             restored
         );
     }
diff --git a/crates/pest_meta/src/optimizer/skipper.rs b/crates/pest_meta/src/optimizer/skipper.rs
index 8300309..46033db 100644
--- a/crates/pest_meta/src/optimizer/skipper.rs
+++ b/crates/pest_meta/src/optimizer/skipper.rs
@@ -7,15 +7,32 @@
 // option. All files in the project carrying such notice may not be copied,
 // modified, or distributed except according to those terms.
 
+use std::collections::HashMap;
+
 use crate::ast::*;
 
-pub fn skip(rule: Rule) -> Rule {
-    fn populate_choices(expr: Expr, mut choices: Vec<String>) -> Option<Expr> {
+pub fn skip(rule: Rule, map: &HashMap<String, Expr>) -> Rule {
+    fn populate_choices(
+        expr: Expr,
+        map: &HashMap<String, Expr>,
+        mut choices: Vec<String>,
+    ) -> Option<Expr> {
         match expr {
             Expr::Choice(lhs, rhs) => {
                 if let Expr::Str(string) = *lhs {
                     choices.push(string);
-                    populate_choices(*rhs, choices)
+                    populate_choices(*rhs, map, choices)
+                } else if let Expr::Ident(name) = *lhs {
+                    // Try inlining rule in choices
+                    if let Some(Expr::Skip(mut inlined_choices)) = map
+                        .get(&name)
+                        .and_then(|expr| populate_choices(expr.clone(), map, vec![]))
+                    {
+                        choices.append(&mut inlined_choices);
+                        populate_choices(*rhs, map, choices)
+                    } else {
+                        None
+                    }
                 } else {
                     None
                 }
@@ -24,6 +41,10 @@
                 choices.push(string);
                 Some(Expr::Skip(choices))
             }
+            // Try inlining single rule
+            Expr::Ident(name) => map
+                .get(&name)
+                .and_then(|expr| populate_choices(expr.clone(), map, choices)),
             _ => None,
         }
     }
@@ -38,7 +59,7 @@
                     if let Expr::Seq(lhs, rhs) = *expr {
                         if let (Expr::NegPred(expr), Expr::Ident(ident)) = (*lhs, *rhs) {
                             if ident == "ANY" {
-                                if let Some(expr) = populate_choices(*expr, vec![]) {
+                                if let Some(expr) = populate_choices(*expr, map, vec![]) {
                                     return expr;
                                 }
                             }
diff --git a/crates/pest_meta/src/parser.rs b/crates/pest_meta/src/parser.rs
index c1768e3..2fb5631 100644
--- a/crates/pest_meta/src/parser.rs
+++ b/crates/pest_meta/src/parser.rs
@@ -20,6 +20,10 @@
 use crate::ast::{Expr, Rule as AstRule, RuleType};
 use crate::validator;
 
+/// Note: `include!` adds here a code generated from build.rs file.
+/// In case feature `not-bootstrap-in-src` is:
+/// * OFF  -> include generated `grammar.rs` file from meta/src
+/// * ON   -> include generated `__pest_grammar.rs` file from target/build/...
 #[allow(missing_docs, unused_qualifications)]
 mod grammar {
     #[cfg(not(feature = "not-bootstrap-in-src"))]
@@ -29,6 +33,7 @@
     include!(concat!(env!("OUT_DIR"), "/__pest_grammar.rs"));
 }
 
+/// Import included grammar (`PestParser` class globally for current module).
 pub use self::grammar::*;
 
 /// A helper that will parse using the pest grammar
diff --git a/crates/pest_meta/src/validator.rs b/crates/pest_meta/src/validator.rs
index 16d3879..26ce300 100644
--- a/crates/pest_meta/src/validator.rs
+++ b/crates/pest_meta/src/validator.rs
@@ -226,6 +226,8 @@
     errors.extend(validate_choices(rules));
     errors.extend(validate_whitespace_comment(rules));
     errors.extend(validate_left_recursion(rules));
+    #[cfg(feature = "grammar-extras")]
+    errors.extend(validate_tag_silent_rules(rules));
 
     errors.sort_by_key(|error| match error.location {
         InputLocation::Span(span) => span,
@@ -235,6 +237,78 @@
     errors
 }
 
+#[cfg(feature = "grammar-extras")]
+fn validate_tag_silent_rules<'a, 'i: 'a>(rules: &'a [ParserRule<'i>]) -> Vec<Error<Rule>> {
+    use crate::ast::RuleType;
+
+    fn to_type_hash_map<'a, 'i: 'a>(
+        rules: &'a [ParserRule<'i>],
+    ) -> HashMap<String, (&'a ParserNode<'i>, RuleType)> {
+        rules
+            .iter()
+            .map(|r| (r.name.clone(), (&r.node, r.ty)))
+            .collect()
+    }
+    let mut result = vec![];
+
+    fn check_silent_builtin<'a, 'i: 'a>(
+        expr: &ParserExpr<'i>,
+        rules_ref: &HashMap<String, (&'a ParserNode<'i>, RuleType)>,
+        span: Span<'a>,
+    ) -> Option<Error<Rule>> {
+        match &expr {
+            ParserExpr::Ident(rule_name) => {
+                let rule = rules_ref.get(rule_name);
+                if matches!(rule, Some((_, RuleType::Silent))) {
+                    return Some(Error::<Rule>::new_from_span(
+                        ErrorVariant::CustomError {
+                            message: "tags on silent rules will not appear in the output"
+                                .to_owned(),
+                        },
+                        span,
+                    ));
+                } else if BUILTINS.contains(rule_name.as_str()) {
+                    return Some(Error::new_from_span(
+                        ErrorVariant::CustomError {
+                            message: "tags on built-in rules will not appear in the output"
+                                .to_owned(),
+                        },
+                        span,
+                    ));
+                }
+            }
+            ParserExpr::Rep(node)
+            | ParserExpr::RepMinMax(node, _, _)
+            | ParserExpr::RepMax(node, _)
+            | ParserExpr::RepMin(node, _)
+            | ParserExpr::RepOnce(node)
+            | ParserExpr::RepExact(node, _)
+            | ParserExpr::Opt(node)
+            | ParserExpr::Push(node)
+            | ParserExpr::PosPred(node)
+            | ParserExpr::NegPred(node) => {
+                return check_silent_builtin(&node.expr, rules_ref, span);
+            }
+            _ => {}
+        };
+        None
+    }
+
+    let rules_map = to_type_hash_map(rules);
+    for rule in rules {
+        let rules_ref = &rules_map;
+        let mut errors = rule.node.clone().filter_map_top_down(|node1| {
+            if let ParserExpr::NodeTag(node2, _) = node1.expr {
+                check_silent_builtin(&node2.expr, rules_ref, node1.span)
+            } else {
+                None
+            }
+        });
+        result.append(&mut errors);
+    }
+    result
+}
+
 /// Checks if `expr` is non-progressing, that is the expression does not
 /// consume any input or any stack. This includes expressions matching the empty input,
 /// `SOI` and ̀ `EOI`, predicates and repetitions.
@@ -593,7 +667,13 @@
                 None
             }
             ParserExpr::Seq(ref lhs, ref rhs) => {
-                if is_non_failing(&lhs.expr, rules, &mut vec![trace.last().unwrap().clone()]) {
+                if is_non_failing(&lhs.expr, rules, &mut vec![trace.last().unwrap().clone()])
+                    || is_non_progressing(
+                        &lhs.expr,
+                        rules,
+                        &mut vec![trace.last().unwrap().clone()],
+                    )
+                {
                     check_expr(rhs, rules, trace)
                 } else {
                     check_expr(lhs, rules, trace)
@@ -1737,6 +1817,22 @@
     #[test]
     #[should_panic(expected = "grammar error
 
+ --> 1:14
+  |
+1 | a = { !\"a\" ~ a }
+  |              ^
+  |
+  = rule a is left-recursive (a -> a); pest::pratt_parser might be useful in this case")]
+    fn non_progressing_left_recursion() {
+        let input = "a = { !\"a\" ~ a }";
+        unwrap_or_report(consume_rules(
+            PestParser::parse(Rule::grammar_rules, input).unwrap(),
+        ));
+    }
+
+    #[test]
+    #[should_panic(expected = "grammar error
+
  --> 1:7
   |
 1 | a = { \"a\"* | \"a\" | \"b\" }
@@ -1796,4 +1892,47 @@
             PestParser::parse(Rule::grammar_rules, input).unwrap(),
         ));
     }
+
+    #[test]
+    #[should_panic(expected = "grammar error
+
+ --> 1:7
+  |
+1 | a = { #b = b } b = _{ ASCII_DIGIT+ }
+  |       ^----^
+  |
+  = tags on silent rules will not appear in the output")]
+    #[cfg(feature = "grammar-extras")]
+    fn tag_on_silent_rule() {
+        let input = "a = { #b = b } b = _{ ASCII_DIGIT+ }";
+        unwrap_or_report(consume_rules(
+            PestParser::parse(Rule::grammar_rules, input).unwrap(),
+        ));
+    }
+
+    #[test]
+    #[should_panic(expected = "grammar error
+
+ --> 1:7
+  |
+1 | a = { #b = ASCII_DIGIT+ }
+  |       ^---------------^
+  |
+  = tags on built-in rules will not appear in the output")]
+    #[cfg(feature = "grammar-extras")]
+    fn tag_on_builtin_rule() {
+        let input = "a = { #b = ASCII_DIGIT+ }";
+        unwrap_or_report(consume_rules(
+            PestParser::parse(Rule::grammar_rules, input).unwrap(),
+        ));
+    }
+
+    #[test]
+    #[cfg(feature = "grammar-extras")]
+    fn tag_on_normal_rule() {
+        let input = "a = { #b = b } b = { ASCII_DIGIT+ }";
+        unwrap_or_report(consume_rules(
+            PestParser::parse(Rule::grammar_rules, input).unwrap(),
+        ));
+    }
 }
diff --git a/crates/plotters-svg/.android-checksum.json b/crates/plotters-svg/.android-checksum.json
index f5f2cd4..3d9f156 100644
--- a/crates/plotters-svg/.android-checksum.json
+++ b/crates/plotters-svg/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"44d1884d1cf7a8ceae08a03e6f4f425d16da917032f644b2c21839ad75d3d35b","Android.bp":"d94294167fd456ec316105005b2b2c07e2eb4abfde0fc4967e14f7b095b7a862","Cargo.toml":"9387da863b0e5da2b032c4da78ea01b3d2d5231a8c9194ef8d3531b0b0de6e5f","LICENSE":"1c9a706701fabb4345eddbdf9e1b9b60668d05f9df8e0ec9bf4b6e08a15c4e33","METADATA":"775480ef3aebed6edfd89fdbcab3c7e8ed878bcd4fb393ca3d51017d5dcdacc0","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"59f48d8839e1d7a7cd8cc4ee76102ed16b1fbd0429d2bf741263dd13d54f34fa","TEST_MAPPING":"5df47f5b5b7533d10aa6a3ecb9189615e716a8060f002faa2bf4c893c12f33f9","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","src/lib.rs":"54c158634510d88191c150e7ad8246e3478c79a1f8b60349d0195a744ebc96ef","src/svg.rs":"c808366edf35f74857e9a89ac0e55f01ca6c809a4ce4ea725a032759d5f23414"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"5d327beced46102ee4a9c21d30385f27d8e9c81b3ac5d6b84aa76f42a526e55f","Android.bp":"3a60a655985855540bfa049329c90748ab35578030d7a9bb557ec98eb10769b5","Cargo.toml":"4681e5b00a03c2551cd4fd096787be07b15f8718d284a0cebe1f245d2d0ec23a","LICENSE":"1c9a706701fabb4345eddbdf9e1b9b60668d05f9df8e0ec9bf4b6e08a15c4e33","METADATA":"515252a15a2ab43523b4d6de4ce2e56742162f384aad93c959c730b222fb58fd","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"59f48d8839e1d7a7cd8cc4ee76102ed16b1fbd0429d2bf741263dd13d54f34fa","TEST_MAPPING":"5df47f5b5b7533d10aa6a3ecb9189615e716a8060f002faa2bf4c893c12f33f9","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","src/lib.rs":"54c158634510d88191c150e7ad8246e3478c79a1f8b60349d0195a744ebc96ef","src/svg.rs":"5f501e6217aca2af8c4835fa5db1a3653402049772233eea83c066ea0cea8ac7"}}
\ No newline at end of file
diff --git a/crates/plotters-svg/.cargo-checksum.json b/crates/plotters-svg/.cargo-checksum.json
index 6aaf347..0870d2a 100644
--- a/crates/plotters-svg/.cargo-checksum.json
+++ b/crates/plotters-svg/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"ba1b45b6791e3e6579282ccb15918ac3a3e78f1c87f40916b3e4542f60590555","LICENSE":"1e881ecf2862d01e6e5bc2b861e46886d2a6fb01499c0c508a209a7271b13cf2","README.md":"4e8a1eb3407b1e7366fa6cb5ebfbc87b9e64bf67fcdc2dcf775c1c6ccec04a2d","src/lib.rs":"a16cb6c509cf49213b2955815679bc33db413f5fc17263470d601eb23deb648a","src/svg.rs":"5b7188891265c25b5cc496f30ac2e7ecc50b9c27d4a4262c6621e7154376d46b"},"package":"38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"}
\ No newline at end of file
+{"files":{"Cargo.toml":"a6b978fc90b5e12521bc9ba9ac0e439e648f58cd36136942a21952f06f809034","LICENSE":"1e881ecf2862d01e6e5bc2b861e46886d2a6fb01499c0c508a209a7271b13cf2","README.md":"4e8a1eb3407b1e7366fa6cb5ebfbc87b9e64bf67fcdc2dcf775c1c6ccec04a2d","src/lib.rs":"a16cb6c509cf49213b2955815679bc33db413f5fc17263470d601eb23deb648a","src/svg.rs":"c9e183bbc76ca675f2e4f7b9eeebaa10c245db96fe94faffba1ed75201dfce50"},"package":"51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"}
\ No newline at end of file
diff --git a/crates/plotters-svg/Android.bp b/crates/plotters-svg/Android.bp
index 1b24c16..125fd6e 100644
--- a/crates/plotters-svg/Android.bp
+++ b/crates/plotters-svg/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "plotters_svg",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.3.5",
+    cargo_pkg_version: "0.3.7",
     crate_root: "src/lib.rs",
     edition: "2018",
     rustlibs: ["libplotters_backend"],
diff --git a/crates/plotters-svg/Cargo.toml b/crates/plotters-svg/Cargo.toml
index e659289..8965ded 100644
--- a/crates/plotters-svg/Cargo.toml
+++ b/crates/plotters-svg/Cargo.toml
@@ -12,14 +12,23 @@
 [package]
 edition = "2018"
 name = "plotters-svg"
-version = "0.3.5"
+version = "0.3.7"
 authors = ["Hao Hou <[email protected]>"]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "Plotters SVG backend"
 homepage = "https://plotters-rs.github.io"
 readme = "README.md"
 license = "MIT"
 repository = "https://github.com/plotters-rs/plotters.git"
 
+[lib]
+name = "plotters_svg"
+path = "src/lib.rs"
+
 [dependencies.image]
 version = "0.24.2"
 features = [
@@ -31,7 +40,7 @@
 default-features = false
 
 [dependencies.plotters-backend]
-version = "0.3.5"
+version = "0.3.6"
 
 [dev-dependencies]
 
diff --git a/crates/plotters-svg/METADATA b/crates/plotters-svg/METADATA
index 10b9f73..f193b5c 100644
--- a/crates/plotters-svg/METADATA
+++ b/crates/plotters-svg/METADATA
@@ -1,17 +1,17 @@
 name: "plotters-svg"
 description: "Plotters SVG backend"
 third_party {
-  version: "0.3.5"
+  version: "0.3.7"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 2
-    day: 5
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/plotters-svg"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/plotters-svg/plotters-svg-0.3.5.crate"
-    version: "0.3.5"
+    value: "https://static.crates.io/crates/plotters-svg/plotters-svg-0.3.7.crate"
+    version: "0.3.7"
   }
 }
diff --git a/crates/plotters-svg/src/svg.rs b/crates/plotters-svg/src/svg.rs
index 7ea105d..ec549f8 100644
--- a/crates/plotters-svg/src/svg.rs
+++ b/crates/plotters-svg/src/svg.rs
@@ -17,21 +17,16 @@
 
 fn make_svg_color(color: BackendColor) -> String {
     let (r, g, b) = color.rgb;
-    return format!("#{:02X}{:02X}{:02X}", r, g, b);
+    format!("#{:02X}{:02X}{:02X}", r, g, b)
 }
 
 fn make_svg_opacity(color: BackendColor) -> String {
-    return format!("{}", color.alpha);
+    format!("{}", color.alpha)
 }
 
 enum Target<'a> {
     File(String, &'a Path),
     Buffer(&'a mut String),
-    // TODO: At this point we won't make the breaking change
-    // so the u8 buffer is still supported. But in 0.3, we definitely
-    // should get rid of this.
-    #[cfg(feature = "deprecated_items")]
-    U8Buffer(String, &'a mut Vec<u8>),
 }
 
 impl Target<'_> {
@@ -39,8 +34,6 @@
         match self {
             Target::File(ref mut buf, _) => buf,
             Target::Buffer(buf) => buf,
-            #[cfg(feature = "deprecated_items")]
-            Target::U8Buffer(ref mut buf, _) => buf,
         }
     }
 }
@@ -147,24 +140,6 @@
         ret
     }
 
-    /// Create a new SVG drawing backend and store the document into a u8 vector
-    #[cfg(feature = "deprecated_items")]
-    #[deprecated(
-        note = "This will be replaced by `with_string`, consider use `with_string` to avoid breaking change in the future"
-    )]
-    pub fn with_buffer(buf: &'a mut Vec<u8>, size: (u32, u32)) -> Self {
-        let mut ret = Self {
-            target: Target::U8Buffer(String::default(), buf),
-            size,
-            tag_stack: vec![],
-            saved: false,
-        };
-
-        ret.init_svg_file(size);
-
-        ret
-    }
-
     /// Create a new SVG drawing backend and store the document into a String buffer
     pub fn with_string(buf: &'a mut String, size: (u32, u32)) -> Self {
         let mut ret = Self {
@@ -203,11 +178,6 @@
                         .map_err(DrawingErrorKind::DrawingError)?;
                 }
                 Target::Buffer(_) => {}
-                #[cfg(feature = "deprecated_items")]
-                Target::U8Buffer(ref actual, ref mut target) => {
-                    target.clear();
-                    target.extend_from_slice(actual.as_bytes());
-                }
             }
             self.saved = true;
         }
@@ -481,11 +451,11 @@
     }
 
     #[cfg(all(not(target_arch = "wasm32"), feature = "image"))]
-    fn blit_bitmap<'b>(
+    fn blit_bitmap(
         &mut self,
         pos: BackendCoord,
         (w, h): (u32, u32),
-        src: &'b [u8],
+        src: &[u8],
     ) -> Result<(), DrawingErrorKind<Self::ErrorType>> {
         use image::codecs::png::PngEncoder;
         use image::ImageEncoder;
@@ -508,9 +478,7 @@
         }
 
         let padding = (3 - data.len() % 3) % 3;
-        for _ in 0..padding {
-            data.push(0);
-        }
+        data.resize(data.len() + padding, 0);
 
         let mut rem_bits = 0;
         let mut rem_num = 0;
diff --git a/crates/predicates-core/.android-checksum.json b/crates/predicates-core/.android-checksum.json
index a874090..544e637 100644
--- a/crates/predicates-core/.android-checksum.json
+++ b/crates/predicates-core/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"47f259e249ca807a6e01a96a6cc13a71515da8659e2fe45eb73dc24586f2058c","Android.bp":"8cf92b542496d2f1b3457298e9528d599ff20d19ea092fcbedf80669eac02ec0","Cargo.toml":"857630d73eb1a78f3c41b213710f80b157ea6a9e96f76839e72f1819afae452c","LICENSE":"6a823c8069932f07af9f6632e29978de3af2c0d5ea8e71afc621547fb91edc29","LICENSE-APACHE":"6a823c8069932f07af9f6632e29978de3af2c0d5ea8e71afc621547fb91edc29","LICENSE-MIT":"b1d654eef14f674c63e128eacab0111ff6e9defc751341f764957f7947a25a7a","METADATA":"6a346728890caef7a848f4b4e83c6867ea71aaa638e755414243886862c8571f","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"46853d1c131cc303542ae362de9c52ec56b5c19b0db25a83d8bd1c1c033444fe","cargo_embargo.json":"48b90df621dbf12710f97f8c66bbe1682f5d0a9d4925ec8652ba6c52a7359ce5","src/core.rs":"cc9736f29d33c4ce26ad35d0fb9e5e1be50ca9e38922401e2ac25d5c024c2c0b","src/lib.rs":"fe280c52da66fa5969b5ae8bcd0623d1fb68e9046d8f543724b06aeaf0caf05c","src/reflection.rs":"3da6c0d415c0a773451b6c929dd39fa75f1729a042c82e324f4bd47edd7f0072"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"89e98c438f01215bee77445b2a364e119858ee78d67712ba9fa2fc9173b52fd1","Android.bp":"f97b3d46f212605bdef0b187500fc4a172d749fcd6e49c5f83f28ddcb533306b","Cargo.toml":"a9bf1f2ea1334f392b4be033afd8774895fb337c74d4207cb446b686a984dace","LICENSE":"90364369fcd32608226545dbeeff4401827c7305eabe4a022046cc03d078c9e9","LICENSE-APACHE":"90364369fcd32608226545dbeeff4401827c7305eabe4a022046cc03d078c9e9","LICENSE-MIT":"538f704e6bc384de6dd775d81e9df89f9d718f0e2808a24a789eaa03beb129d3","METADATA":"4114b5cdaa8c8f912b1ea6c3c3d14191b11e28dda58fc650dbc04720f327a2e1","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"46853d1c131cc303542ae362de9c52ec56b5c19b0db25a83d8bd1c1c033444fe","cargo_embargo.json":"48b90df621dbf12710f97f8c66bbe1682f5d0a9d4925ec8652ba6c52a7359ce5","src/core.rs":"cc9736f29d33c4ce26ad35d0fb9e5e1be50ca9e38922401e2ac25d5c024c2c0b","src/lib.rs":"67f7afbd21d27781ff07344731dd16ac912f4cc54dca2e80f39b5169a8f15096","src/reflection.rs":"616160257e93c40c7d7582dc3cde97adc6e5785a0d12fec9e34def63c1b7b7cc"}}
\ No newline at end of file
diff --git a/crates/predicates-core/.cargo-checksum.json b/crates/predicates-core/.cargo-checksum.json
index 60693ad..afea90b 100644
--- a/crates/predicates-core/.cargo-checksum.json
+++ b/crates/predicates-core/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"84010f585e2969b20c6a2876f28e2adc27286fe646cc5fef5f1a680bc4eb9794","LICENSE-APACHE":"a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9","LICENSE-MIT":"9d6bf646112f22f1dd5722fbf615ac184bc372727b615e5dff7e45fe8de3a99e","README.md":"86159502694c7d90efa5fb411b36c51fd212f57022a2541063f36c235d827098","src/core.rs":"19c28cbadf83f50a618fed6f378a03c53f1457bde8c2ba7f12ccd311747607b3","src/lib.rs":"7a3b59e6ae2a15d33ec65feb93202af008763b108a8ae1119dcb3cc2a2a86c94","src/reflection.rs":"6db20379c5530d4c7cda97d5532f9c0d6c4e6f8e9220e1a00b6bc6368a4ed491"},"package":"b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"}
\ No newline at end of file
+{"files":{"Cargo.toml":"04d6bdedaeccd1b5536dc921680d11f7486da511555934d7bd7712a933c4709f","LICENSE-APACHE":"b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1","LICENSE-MIT":"6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6","README.md":"86159502694c7d90efa5fb411b36c51fd212f57022a2541063f36c235d827098","src/core.rs":"19c28cbadf83f50a618fed6f378a03c53f1457bde8c2ba7f12ccd311747607b3","src/lib.rs":"bc35906f7e49e44e9188ebd2860dff2ab71fdd6beba306373a4e98ad53b59833","src/reflection.rs":"8c31410c0fa88a352e505dc9a748284994f223111d84f2aafda18b7ebd8fde9a"},"package":"727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa"}
\ No newline at end of file
diff --git a/crates/predicates-core/Android.bp b/crates/predicates-core/Android.bp
index 72cd4a4..d66bd67 100644
--- a/crates/predicates-core/Android.bp
+++ b/crates/predicates-core/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "predicates_core",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.0.6",
+    cargo_pkg_version: "1.0.9",
     crate_root: "src/lib.rs",
     edition: "2021",
     apex_available: [
diff --git a/crates/predicates-core/Cargo.toml b/crates/predicates-core/Cargo.toml
index a1de8f1..eeb0007 100644
--- a/crates/predicates-core/Cargo.toml
+++ b/crates/predicates-core/Cargo.toml
@@ -11,10 +11,11 @@
 
 [package]
 edition = "2021"
-rust-version = "1.64.0"
+rust-version = "1.74"
 name = "predicates-core"
-version = "1.0.6"
+version = "1.0.9"
 authors = ["Nick Stevens <[email protected]>"]
+build = false
 include = [
     "build.rs",
     "src/**/*",
@@ -24,6 +25,11 @@
     "benches/**/*",
     "examples/**/*",
 ]
+autolib = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "An API for boolean-valued predicate functions."
 homepage = "https://github.com/assert-rs/predicates-rs/tree/master/crates/core"
 documentation = "https://docs.rs/predicates-core"
@@ -42,37 +48,48 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/assert-rs/predicates-rs/tree/master/crates/core"
 
+[package.metadata.docs.rs]
+all-features = true
+rustdoc-args = [
+    "--cfg",
+    "docsrs",
+]
+
 [[package.metadata.release.pre-release-replacements]]
 file = "CHANGELOG.md"
-search = "Unreleased"
+min = 1
 replace = "{{version}}"
-min = 1
+search = "Unreleased"
 
 [[package.metadata.release.pre-release-replacements]]
-file = "CHANGELOG.md"
-search = '\.\.\.HEAD'
-replace = "...{{tag_name}}"
 exactly = 1
+file = "CHANGELOG.md"
+replace = "...{{tag_name}}"
+search = '\.\.\.HEAD'
 
 [[package.metadata.release.pre-release-replacements]]
 file = "CHANGELOG.md"
-search = "ReleaseDate"
-replace = "{{date}}"
 min = 1
+replace = "{{date}}"
+search = "ReleaseDate"
 
 [[package.metadata.release.pre-release-replacements]]
+exactly = 1
 file = "CHANGELOG.md"
-search = "<!-- next-header -->"
 replace = """
 <!-- next-header -->
 ## [Unreleased] - ReleaseDate
 """
-exactly = 1
+search = "<!-- next-header -->"
 
 [[package.metadata.release.pre-release-replacements]]
+exactly = 1
 file = "CHANGELOG.md"
-search = "<!-- next-url -->"
 replace = """
 <!-- next-url -->
 [Unreleased]: https://github.com/assert-rs/predicates-rs/compare/{{tag_name}}...HEAD"""
-exactly = 1
+search = "<!-- next-url -->"
+
+[lib]
+name = "predicates_core"
+path = "src/lib.rs"
diff --git a/crates/predicates-core/LICENSE-APACHE b/crates/predicates-core/LICENSE-APACHE
index d9a10c0..8dada3e 100644
--- a/crates/predicates-core/LICENSE-APACHE
+++ b/crates/predicates-core/LICENSE-APACHE
@@ -174,3 +174,28 @@
       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 {yyyy} {name of copyright owner}
+
+   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.
diff --git a/crates/predicates-core/LICENSE-MIT b/crates/predicates-core/LICENSE-MIT
index 51e7743..a2d0108 100644
--- a/crates/predicates-core/LICENSE-MIT
+++ b/crates/predicates-core/LICENSE-MIT
@@ -1,7 +1,4 @@
-MIT License
-
-Copyright (c) 2017 Nick Stevens
-
+Copyright (c) Individual contributors
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/crates/predicates-core/METADATA b/crates/predicates-core/METADATA
index 0373078..cfaf42c 100644
--- a/crates/predicates-core/METADATA
+++ b/crates/predicates-core/METADATA
@@ -1,17 +1,17 @@
 name: "predicates-core"
 description: "An API for boolean-valued predicate functions."
 third_party {
-  version: "1.0.6"
+  version: "1.0.9"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 11
-    day: 6
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/predicates-core"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/predicates-core/predicates-core-1.0.6.crate"
-    version: "1.0.6"
+    value: "https://static.crates.io/crates/predicates-core/predicates-core-1.0.9.crate"
+    version: "1.0.9"
   }
 }
diff --git a/crates/predicates-core/src/lib.rs b/crates/predicates-core/src/lib.rs
index e0c9ace..16a8a63 100644
--- a/crates/predicates-core/src/lib.rs
+++ b/crates/predicates-core/src/lib.rs
@@ -19,6 +19,7 @@
 //! configuration. See the examples for how this can work.
 
 #![warn(missing_docs, missing_debug_implementations)]
+#![cfg_attr(docsrs, feature(doc_auto_cfg))]
 
 mod core;
 pub use crate::core::*;
diff --git a/crates/predicates-core/src/reflection.rs b/crates/predicates-core/src/reflection.rs
index 120d1bd..0525cd3 100644
--- a/crates/predicates-core/src/reflection.rs
+++ b/crates/predicates-core/src/reflection.rs
@@ -54,13 +54,13 @@
     }
 }
 
-impl<'a> fmt::Display for Parameter<'a> {
+impl fmt::Display for Parameter<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         write!(f, "{}: {}", self.0, self.1)
     }
 }
 
-impl<'a> fmt::Debug for Parameter<'a> {
+impl fmt::Debug for Parameter<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         write!(f, "({:?}, {})", self.0, self.1)
     }
@@ -86,13 +86,13 @@
     }
 }
 
-impl<'a> fmt::Display for Child<'a> {
+impl fmt::Display for Child<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         write!(f, "{}: {}", self.0, self.1)
     }
 }
 
-impl<'a> fmt::Debug for Child<'a> {
+impl fmt::Debug for Child<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         write!(f, "({:?}, {})", self.0, self.1)
     }
@@ -150,7 +150,7 @@
     }
 }
 
-impl<'a> fmt::Debug for Case<'a> {
+impl fmt::Debug for Case<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         let predicate = if let Some(ref predicate) = self.predicate {
             format!("Some({})", predicate)
diff --git a/crates/strum/.android-checksum.json b/crates/strum/.android-checksum.json
index 2cca253..3ba4cef 100644
--- a/crates/strum/.android-checksum.json
+++ b/crates/strum/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"7068dee13a795462ca0496155f1cb0a08d3726f36c561437e1db7644bdb4cd4c","Android.bp":"9c6cc2ad7f8004e340eedb9f35ee94ed3189d673981d8f35170130d090fdc4e4","Cargo.toml":"a87de606784dc825276bd03b47117ead197c1921d88659b0f74e8ffa710d32b4","LICENSE":"1884079d8260fd6643f913346f742df6dabc32a0d1d1a973f6c70b2ae20383fe","METADATA":"7cdc56d2fe18b2d63345297509250329bcd059136a9aaaf87491dba1bcd55069","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","src/additional_attributes.rs":"d8bb6356c32fc9b70dc8986a1b0618b370882026add552448a82fa37e9a491ec","src/lib.rs":"52eb32c64447e360e3bb4491299d2cef33213e219bcdfa9a81790af5df222905"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"44e9abbda1409c7cd7b4a199a933f1f561574a245e00eddda5548cda2824549a","Android.bp":"c864c7f72b7ef62da1b2c5c32849a6976287e4adaf9ab1c1380726f981522c6f","Cargo.toml":"18e963e027a1424da98d0285379b1ef2647f7825b75a636471f16ba3c47dbed2","LICENSE":"1884079d8260fd6643f913346f742df6dabc32a0d1d1a973f6c70b2ae20383fe","METADATA":"682b49daa24d33b768e472e8cd7c20aff069b59fdc53cfddd06eecd7e4b8be92","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"97422babc5ef03a7347fd1efe7c6866a231925d7e436e7f9f38caaaa0ed464a9","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","src/additional_attributes.rs":"fb0c4cd36d8a936c568888491f13c9dd973e57e1b29c0f2878db9eaf64731e34","src/lib.rs":"68681df1e3207d91dd27d8e7b7054624758dff3ee5f65d84f7308339d866b83e"}}
\ No newline at end of file
diff --git a/crates/strum/.cargo-checksum.json b/crates/strum/.cargo-checksum.json
index 2446a0e..49e6890 100644
--- a/crates/strum/.cargo-checksum.json
+++ b/crates/strum/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"f615f23ee012c313d795d487c1c9b89a09f8aa8c025bb6b2f872dd27f35ab11b","LICENSE":"8bce3b45e49ecd1461f223b46de133d8f62cd39f745cfdaf81bee554b908bd42","src/additional_attributes.rs":"1d7a611079a0d094a4a0aebc760323bc9eb2550e0d367123e4439a364c824039","src/lib.rs":"f07e798a8cd3c4869437f6c6e954c230db44481d3fb215c5a0906ba9fab5a011"},"package":"290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"}
\ No newline at end of file
+{"files":{"Cargo.toml":"d42134f7fdb99557a91eb2baf346dceb46e50d09edf17fe1da588b6856a93e54","LICENSE":"8bce3b45e49ecd1461f223b46de133d8f62cd39f745cfdaf81bee554b908bd42","README.md":"df67b984209ce474de5d60994983f6d2db0ac3b73bcfc2b1329871b0035c57e6","src/additional_attributes.rs":"ed42563ee66b53c676b14bb499b5f9e593e377574913dac78fcdf0be0a615786","src/lib.rs":"947be8ffe7935dd2ae47251d50c478d692354385ea26ffb1fba1920b5c634133"},"package":"8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"}
\ No newline at end of file
diff --git a/crates/strum/Android.bp b/crates/strum/Android.bp
index 9de75bb..14fffd2 100644
--- a/crates/strum/Android.bp
+++ b/crates/strum/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "strum",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.25.0",
+    cargo_pkg_version: "0.26.3",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
diff --git a/crates/strum/Cargo.toml b/crates/strum/Cargo.toml
index ccafbb1..4ee7ced 100644
--- a/crates/strum/Cargo.toml
+++ b/crates/strum/Cargo.toml
@@ -12,33 +12,57 @@
 [package]
 edition = "2018"
 name = "strum"
-version = "0.25.0"
+version = "0.26.3"
 authors = ["Peter Glotfelty <[email protected]>"]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "Helpful macros for working with enums and strings"
 homepage = "https://github.com/Peternator7/strum"
 documentation = "https://docs.rs/strum"
-readme = "../README.md"
-keywords = ["enum", "string", "macros", "proc-macros"]
-categories = ["development-tools::procedural-macro-helpers", "parsing"]
+readme = "README.md"
+keywords = [
+    "enum",
+    "string",
+    "macros",
+    "proc-macros",
+]
+categories = [
+    "development-tools::procedural-macro-helpers",
+    "parsing",
+]
 license = "MIT"
 repository = "https://github.com/Peternator7/strum"
+
 [package.metadata.docs.rs]
 features = ["derive"]
-rustdoc-args = ["--cfg", "docsrs"]
+rustdoc-args = [
+    "--cfg",
+    "docsrs",
+]
+
+[lib]
+name = "strum"
+path = "src/lib.rs"
+
 [dependencies.phf]
 version = "0.10"
 features = ["macros"]
 optional = true
 
 [dependencies.strum_macros]
-version = "0.25"
+version = "0.26.3"
 optional = true
+
 [dev-dependencies.strum_macros]
-version = "0.25"
+version = "0.26"
 
 [features]
 default = ["std"]
 derive = ["strum_macros"]
 std = []
+
 [badges.travis-ci]
 repository = "Peternator7/strum"
diff --git a/crates/strum/METADATA b/crates/strum/METADATA
index e08a926..0cc5671 100644
--- a/crates/strum/METADATA
+++ b/crates/strum/METADATA
@@ -1,17 +1,17 @@
 name: "strum"
 description: "Helpful macros for working with enums and strings"
 third_party {
-  version: "0.25.0"
+  version: "0.26.3"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
+    year: 2025
     month: 1
-    day: 17
+    day: 13
   }
   homepage: "https://crates.io/crates/strum"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/strum/strum-0.25.0.crate"
-    version: "0.25.0"
+    value: "https://static.crates.io/crates/strum/strum-0.26.3.crate"
+    version: "0.26.3"
   }
 }
diff --git a/crates/strum/README.md b/crates/strum/README.md
new file mode 100644
index 0000000..04b37fc
--- /dev/null
+++ b/crates/strum/README.md
@@ -0,0 +1,88 @@
+# Strum
+
+[![Build Status](https://travis-ci.com/Peternator7/strum.svg?branch=master)](https://travis-ci.com/Peternator7/strum)
+[![Build status](https://ci.appveyor.com/api/projects/status/ji4f6n2m5lvu11xt?svg=true)](https://ci.appveyor.com/project/Peternator7/strum)
+[![Latest Version](https://img.shields.io/crates/v/strum.svg)](https://crates.io/crates/strum)
+[![Rust Documentation](https://docs.rs/strum/badge.svg)](https://docs.rs/strum)
+![Crates.io](https://img.shields.io/crates/l/strum)
+![Crates.io](https://img.shields.io/crates/d/strum)
+
+Strum is a set of macros and traits for working with enums and strings easier in Rust.
+
+# Compatibility
+
+Strum is currently compatible with versions of rustc >= 1.56.1. Pull Requests that improve compatibility with older
+versions are welcome. The project goal is to support a rust version for at least 2 years after release 
+and even longer is preferred since this project changes slowly.
+
+# Including Strum in Your Project
+
+Import strum and strum_macros into your project by adding the following lines to your
+Cargo.toml. Strum_macros contains the macros needed to derive all the traits in Strum.
+
+```toml
+[dependencies]
+strum = "0.26"
+strum_macros = "0.26"
+
+# You can also use the "derive" feature, and import the macros directly from "strum"
+# strum = { version = "0.26", features = ["derive"] }
+```
+
+# Strum Macros
+
+Strum has implemented the following macros:
+
+| Macro | Description |
+| --- | ----------- |
+| [EnumString] | Converts strings to enum variants based on their name. |
+| [Display] | Converts enum variants to strings |
+| [FromRepr] | Convert from an integer to an enum. |
+| [AsRefStr] | Implement `AsRef<str>` for `MyEnum` |
+| [IntoStaticStr] | Implements `From<MyEnum> for &'static str` on an enum |
+| [EnumIter] | Creates a new type that iterates of the variants of an enum. |
+| [EnumProperty] | Add custom properties to enum variants. |
+| [EnumMessage] | Add a verbose message to an enum variant. |
+| [EnumDiscriminants] | Generate a new type with only the discriminant names. |
+| [EnumCount] | Add a constant `usize` equal to the number of variants. |
+| [VariantArray] | Adds an associated `VARIANTS` constant which is an array of all enum discriminants |
+| [VariantNames] | Adds an associated `VARIANTS` constant which is an array of discriminant names |
+| [EnumTable] | *Experimental*, creates a new type that stores an item of a specified type for each variant of the enum. |
+
+# Contributing
+
+Thanks for your interest in contributing. Bug fixes are always welcome. If you are interested in implementing or
+adding a macro, please open an issue first to discuss the feature. I have limited bandwidth to review new features.
+
+The project is divided into 3 parts, the traits are in the
+`/strum` folder. The procedural macros are in the `/strum_macros` folder, and the integration tests are
+in `/strum_tests`. If you are adding additional features to `strum` or `strum_macros`, you should make sure
+to run the tests and add new integration tests to make sure the features work as expected.
+
+# Debugging
+
+To see the generated code, set the STRUM_DEBUG environment variable before compiling your code.
+`STRUM_DEBUG=1` will dump all of the generated code for every type. `STRUM_DEBUG=YourType` will
+only dump the code generated on a type named `YourType`.
+
+# Name
+
+Strum is short for STRing enUM because it's a library for augmenting enums with additional
+information through strings.
+
+Strumming is also a very whimsical motion, much like writing Rust code.
+
+[EnumString]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumString.html
+[Display]: https://docs.rs/strum_macros/latest/strum_macros/derive.Display.html
+[AsRefStr]: https://docs.rs/strum_macros/latest/strum_macros/derive.AsRefStr.html
+[IntoStaticStr]: https://docs.rs/strum_macros/latest/strum_macros/derive.IntoStaticStr.html
+[EnumIter]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumIter.html
+[EnumIs]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumIs.html
+[EnumProperty]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumProperty.html
+[EnumMessage]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumMessage.html
+[EnumDiscriminants]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumDiscriminants.html
+[EnumCount]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumCount.html
+[FromRepr]: https://docs.rs/strum_macros/latest/strum_macros/derive.FromRepr.html
+[VariantArray]: https://docs.rs/strum_macros/latest/strum_macros/derive.VariantArray.html
+[VariantNames]: https://docs.rs/strum_macros/latest/strum_macros/derive.VariantNames.html
+[EnumTable]: https://docs.rs/strum_macros/latest/strum_macros/derive.EnumTable.html
diff --git a/crates/strum/src/additional_attributes.rs b/crates/strum/src/additional_attributes.rs
index a29f1d6..3971ba1 100644
--- a/crates/strum/src/additional_attributes.rs
+++ b/crates/strum/src/additional_attributes.rs
@@ -78,7 +78,7 @@
 //!
 //! - `ascii_case_insensitive`: makes the comparison to this variant case insensitive (ASCII only).
 //!   If the whole enum is marked `ascii_case_insensitive`, you can specify `ascii_case_insensitive = false`
-//!   to disable case insensitivity on this v ariant.
+//!   to disable case insensitivity on this variant.
 //!
 //! - `message=".."`: Adds a message to enum variant. This is used in conjunction with the `EnumMessage`
 //!    trait to associate a message with a variant. If `detailed_message` is not provided,
diff --git a/crates/strum/src/lib.rs b/crates/strum/src/lib.rs
index 7fbe5e2..3b5af9c 100644
--- a/crates/strum/src/lib.rs
+++ b/crates/strum/src/lib.rs
@@ -16,11 +16,11 @@
 //!
 //! ```toml
 //! [dependencies]
-//! strum = "0.25"
-//! strum_macros = "0.25"
+//! strum = "0.26"
+//! strum_macros = "0.26"
 //!
 //! # You can also access strum_macros exports directly through strum using the "derive" feature
-//! strum = { version = "0.25", features = ["derive"] }
+//! strum = { version = "0.26", features = ["derive"] }
 //! ```
 //!
 
@@ -30,6 +30,8 @@
 // only for documentation purposes
 pub mod additional_attributes;
 
+use core::iter::FusedIterator;
+
 #[cfg(feature = "phf")]
 #[doc(hidden)]
 pub use phf as _private_phf_reexport_for_macro_if_phf_feature;
@@ -65,7 +67,7 @@
 }
 
 /// This trait designates that an `Enum` can be iterated over. It can
-/// be auto generated using `strum_macros` on your behalf.
+/// be auto generated using the [`EnumIter`](derive.EnumIter.html) derive macro.
 ///
 /// # Example
 ///
@@ -96,7 +98,11 @@
 /// generic_iterator::<Color, _>(|color| println!("{:?}", color));
 /// ```
 pub trait IntoEnumIterator: Sized {
-    type Iterator: Iterator<Item = Self>;
+    type Iterator: Iterator<Item = Self>
+        + Clone
+        + DoubleEndedIterator
+        + ExactSizeIterator
+        + FusedIterator;
 
     fn iter() -> Self::Iterator;
 }
@@ -211,6 +217,16 @@
     const VARIANTS: &'static [&'static str];
 }
 
+/// A trait for retrieving a static array containing all the variants in an Enum.
+/// This trait can be autoderived by `strum_macros`. For derived usage, all the
+/// variants in the enumerator need to be unit-types, which means you can't autoderive
+/// enums with inner data in one or more variants. Consider using it alongside
+/// [`EnumDiscriminants`] if you require inner data but still want to have an
+/// static array of variants.
+pub trait VariantArray: ::core::marker::Sized + 'static {
+    const VARIANTS: &'static [Self];
+}
+
 #[cfg(feature = "derive")]
 pub use strum_macros::*;
 
@@ -230,7 +246,6 @@
 // 2018 edition is almost 2 years old, but we'll need to give people some time to do that.
 DocumentMacroRexports! {
     AsRefStr,
-    AsStaticStr,
     Display,
     EnumCount,
     EnumDiscriminants,
@@ -238,8 +253,8 @@
     EnumMessage,
     EnumProperty,
     EnumString,
-    EnumVariantNames,
+    VariantNames,
     FromRepr,
     IntoStaticStr,
-    ToString
+    VariantArray
 }
diff --git a/crates/syn/.android-checksum.json b/crates/syn/.android-checksum.json
index edbfbdf..7557a9c 100644
--- a/crates/syn/.android-checksum.json
+++ b/crates/syn/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"c7246addf0fc4ceb6227920a19076fb91b47c48ad37d47efc21ee830d25250f9","Android.bp":"70f3dd02a5d5fb7f9dc53eadb6f884f2852037c76ff4aa9acc2ddbb31e0d3576","Cargo.toml":"bb527efbb2ddee7de560f1859eae30b38f5859dccbe68e4dc5364d7019424b9c","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"2c2f0be5f304aca2784e50f5471886e903f386f7a8813a178f9f7d1383a2d2e4","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"9e3d96a9b35fd9b5948cacd78803c52b3c7bcc999228ef2878c9db3c1a6700db","TEST_MAPPING":"a3074a0541d6fbb452778d31b454a0f4375a6f8e617cdb11e6c4fb83d7ed03e3","benches/file.rs":"652df66340764c9a86bb000ac114ad926960025f2caca1155b8b4a3146b91935","benches/rust.rs":"9a7ba00900cfeb685bd27724a4aa4bcc41a565b26ee845888ab77ac89f2f8fcb","cargo_embargo.json":"fa14e6e521e1ac4b8e60f605a9a1d03b636ff6519065507e7b87db5e8e239db0","patches/rules.mk.diff":"b3d6baa97437c1c3d5eda8fc60af30c56fe345d36fa2229db9aa3abb013822ea","rules.mk":"f2a06305f7fa472ed055208798d9d27e800938e8c33e919c21a01426635edef0","src/attr.rs":"8640bfa6d726cea1e5ee9003edfd2738c439b4cbaa9cea686b885710ddead223","src/bigint.rs":"e83575534e2b0d7804fe783c5d74d181c1a8551a4e0ee1d2ecfc98ab57dd80ef","src/buffer.rs":"738315eaeb204e25d34d18596c047caa14f2578103309585a3de40fc80fbc6c1","src/classify.rs":"301d880e1a3a7c137ffca08330cd3bcd60e4126687b6e5385782f7781832ab62","src/custom_keyword.rs":"9d29fc42718db5ddc5a9aa6cc1b505194c1420d2154e6815317336d598acd995","src/custom_punctuation.rs":"13ea2d4ff08a2e4659b24f148960c4d87c1540887e4b72fbc74f9b69e6cc5226","src/data.rs":"29a4ba9d8368eb9849a8593d0a16dfb447d8247f33eb7863447c60260d7f1822","src/derive.rs":"337b090b5adde045e4f0e67dca4b7d3565a20609d652aeb6a2e66d143877b48d","src/discouraged.rs":"71098f177068e0a019f4364e806b97dad06ba68e13f17ff56376d0cf72eee89c","src/drops.rs":"3dadaa62f3a84212d67f563378fdab7c1529048499deff7cb705053212efcd52","src/error.rs":"5c9b857d2bb7a5eb2a1a4488792a9ddbb5b622c957942589db00a6f4c66814de","src/export.rs":"dae16b876935b560aae18de580d47b36b7374381fda7942733b7857d278f003e","src/expr.rs":"a599ce90c6c7a87adf9627114c882190efe8a99222bbbc6f809058878a5f4a0f","src/ext.rs":"57af9f63dc53e63334071b23ae8f15f4642d39130b9988b747a5d6024a2efff2","src/file.rs":"5086358a24a874dedaa297021b7c4b53557ca324a9d801de74340c2d10a87b59","src/fixup.rs":"07159be5255b06722c7c6d861056afce43e21278c44a489756ab48a8f41d9298","src/gen/clone.rs":"79ea85a32631a42201e5cbc4680474df27f5d639c65c7af080fd3c15a2310790","src/gen/debug.rs":"0bc0e9e293e95edf9538f610e450df302a88151a17cddad5a9741e81da36c116","src/gen/eq.rs":"038c884c28290648ad85aaab3f331b73082959dac51fa7c0e83e9a4056658827","src/gen/fold.rs":"9b17f5946e4c92209794b340f4599bdd65f2f57610fe2f43c579bdeff1cbc1e2","src/gen/hash.rs":"740c3b33869129fabaff5b95c88e69dc7f307986f299ef77cba90f75601c7836","src/gen/token.css":"fda7badfa7b1401d7a4307553d2793cc95913db01cc167908b86b299c1a99808","src/gen/visit.rs":"7c9685a89e4a2ffc484357e74fc6144370ffa4e670e27a94d9fc302d877b388c","src/gen/visit_mut.rs":"a09f5b9e308e05ca9a05fc4e5f228c37be55d5d3208335af288374a57682383b","src/generics.rs":"2f62c7530af8b9ae10c88107ccc39edffda891929228cf22b87a83b6da93f26c","src/group.rs":"ea9143c9f224577dc70af813cafa70e55bc02b141a70d3cecf0d99d9e54d780f","src/ident.rs":"5a5c0aef1528138d0a8afaeedffc7c1c12cb8405186d6479b85bf05c41f74f70","src/item.rs":"ac4bd0ea42034985ec4fc1d350973e1d0fa1a44a945e60259e402d410271e772","src/lib.rs":"46b274e993b442d17d91d8e6bd55d2853d3ce86c59a30d4e475dcd1a9a67ecff","src/lifetime.rs":"85d8ec76c48097a2a5d4938f034a280eb4a82e74c9c93fce4056de34cfd5ae12","src/lit.rs":"493dd04a8831a687d00e06bab28fa0e62da51d26b6c39d6d7002ad6db75dd4c4","src/lookahead.rs":"fa6b93a09b0e013a797918438ac3573d524ba034284255755d6ccbd0579c4a14","src/mac.rs":"a656390e6fa3605ed703f0fc103913b1a965896053abf9e06abe0171ea2c7a81","src/macros.rs":"12aaa1d0628d9262b1c08129cef3b7b2b77ac390f3dc96bf3aa1f69858e2fac9","src/meta.rs":"ad4960098dd90cd917c01aeba4699b16786e6cff7ee4829199512713c533462b","src/op.rs":"62c8d6bcf612a4b4db37b0178a63e50eba3f839164c500b2ca5f3178d7c76373","src/parse.rs":"c186bb70e5549a84e9ddde3c642ae90100e9daab01415780a449aaed27b33b29","src/parse_macro_input.rs":"28e67c76e4774279e626d44c26e6b687b775c61818bc3c6e163713b2337e4d4a","src/parse_quote.rs":"da6247763d042fa48951cf4d436dc5e0ea51d5bb510cb84c2cd61b25c83aa10a","src/pat.rs":"990374af68c9c31099fd0eac8ec985f4a4e6f323a25307bd1c7f132d30b2377d","src/path.rs":"a9a89ffb9b7a9980c8b19e80c42312b738db643723d1634c5eda528af3d26c23","src/precedence.rs":"0f9ea5d4b213d08ae065f9246722357832944657509c2412ae1385141bca5de0","src/print.rs":"69d23dae2458f3f0747485e6491dfde830fdcb6bb0c8e115528f4297c14d1b30","src/punctuated.rs":"bb7bf72d928d18dbda987f72a2b1a0be8d695865ab64db6ea60efed66b8c5c20","src/restriction.rs":"4945a287710a97f4920847c50029fe880cdb509b1cd3688a1a6e77172efe567e","src/scan_expr.rs":"0189cad44956e3ec597989c7324382068a5bf8cbf788caf44bc5cb027de93cf8","src/sealed.rs":"93917292f4842b04d59343458a7a25507f989a807c2696d17fd436aa252687c9","src/span.rs":"f687a44d8bf598095c5945213d13d45c2ec3e65c8007f7ff9f1916e4e52cf0d6","src/spanned.rs":"581ee1d8358db0832cefaec2d87c59d7299e80adde12e050dd1eae76e791e6a3","src/stmt.rs":"16d0c14b8e50e14c52a8a980325fb1df501193cf77745ddf26b1c2de2cde6be0","src/thread.rs":"86e9b5f4b716f6b0332ff3906ebbf55bb000ef3ba60ca9506df98420ee81a21e","src/token.rs":"9178a01f95c0c13d2100ca10b8d170e419f5306b3ce55871b646b4490fa8aae5","src/tt.rs":"f4496db9be822900b73c18ddd567fab8aa2cf59b58cc602fa5bcee5ed79aa0d3","src/ty.rs":"be5152d5d1ee1f7ff4f19fe82a24430134049ca053f0ee3e8317d9bfa9767130","src/verbatim.rs":"9414367a03d2be4a07adfea1cb3d393d8c312e692346fddd6f196854bccff049","src/whitespace.rs":"d8c15abe68ad16b14960e987ed7f42332893fdde86696693be4c533162c88dfb","tests/common/eq.rs":"7f4a2d43a00e8178868fcb73bae4884f2f4cce79b77727f5f16da2299a8244ea","tests/common/mod.rs":"87521e5f0ac4c8aa761d4d165c4c5767765616a7f39ed4e047123b9d5a05c36c","tests/common/parse.rs":"d56c03149f28e2d3c5cc91e85ed5ff9ec7165b28882560705267f483f18e1a0a","tests/debug/gen.rs":"747e454a76f2d2569f92fce699155248ecf3aaf9f6b6db8e1432a0f2f4c391d6","tests/debug/mod.rs":"89475f591af872f2dbca0693137ef87bedc2470630a49f00c042e6b6ef8a7c85","tests/macros/mod.rs":"5ce3746277995ae5014f135899e1109560805fdf1cc9a05e5edee303a00b68da","tests/regression.rs":"293190040dd2c81e4c023da0f8e5dad234635d0ce2c71165f07e4b1b26e99743","tests/regression/issue1108.rs":"7f5c9e84dcb2b679fec1c0128eaf0d2c05bc0a07a414efafd5e86040b1014ea0","tests/regression/issue1235.rs":"ae38c33361dcce8f2c1b13220163498bce69d0138c15791311f96e6e26e95ea7","tests/repo/mod.rs":"4ff2f36ff652735d937bf382b10939449cb981bbb00215315db71a5b8995fd30","tests/repo/progress.rs":"52ab80a03bd7c28a4fb53a8321922637e0ccb6a8f89b05fc80dc98057dc20acc","tests/test_asyncness.rs":"efeededf544e4517ffbc204dbc2eae81228849e6958ede27a5b93ecae201dbea","tests/test_attribute.rs":"66482a7b40fbd57a00e4f92de3852864497a1f0498ac76c560069a23fc1ab797","tests/test_derive_input.rs":"9eba831e31502fc1433cb9045c94e45b2ea48924053174f566e2cdf593944f8b","tests/test_expr.rs":"fc72b2cd5e03b33bb5aad978f75a3e886eada173507bb153acefe918d0597e03","tests/test_generics.rs":"5f8c6a62246ab5e313cb139890334d74a4984ded79a064a8b53ec00a2a20bfa4","tests/test_grouping.rs":"5d0419a9cea98c3c090fec77470518f727c952bc22245183be1542575fdaf7fa","tests/test_ident.rs":"0767b1495600b15c3c0b5ff73d7ae3d259ae1c548f025c2760a3ca23118658ae","tests/test_item.rs":"54c8740f3fe74b9d77684a08c0b9dfe72a9762990061225f7a31ba10cfe1ac3f","tests/test_iterators.rs":"77ac42ea54c07dc1c85263b8ceb0c645770abb8b3703eddd4c04cd3023fcac85","tests/test_lit.rs":"93807c4ef05e5c01934e7daa6a4d46887d909c6b9b549a113cbad54dbb83c940","tests/test_meta.rs":"ff5ca82fa795b6ab94edf9f10b52f63c47ba5681a974c35ffc2cc57e57281234","tests/test_parse_buffer.rs":"9603fa08950b304ae3e209c384f41758bae276f3ff88e415dcabd45af9d848d1","tests/test_parse_quote.rs":"6659405127ecddccec51c2ac19a88eb16a143cecaac181f9be8d3701e9887ef9","tests/test_parse_stream.rs":"eab69e8f5d3ff6acb7b739470786520f7225a4263d62a0e436c7bc5c26fc3668","tests/test_pat.rs":"9aec093d88b1577207fbf29224f656a9933e09f659c8f2d8dc46f6920fafe920","tests/test_path.rs":"477eddfee2a1f640a60015350c4157c3f4d6954949f63ba76b21318f7c526ac6","tests/test_precedence.rs":"bbcc7ed2e32a0589612ac91bdcdc04b70ec99ec11124e711eb95fe311c3a3c3d","tests/test_receiver.rs":"f1024b304f300c3f30bd3f25c7cc24d4dfd3fffe16fdd2188ce0d3a7f6743d08","tests/test_round_trip.rs":"20c787f5c75997ba67f810a158a68a9be0daa9886e4c815615a68c1ea6953e18","tests/test_shebang.rs":"9ba0405c4bbddb68d4b6d493cbe7d39f61dc7442715efd9150ea846dfdfe54f2","tests/test_size.rs":"6711587780bf1ee33418962be62c2a42bece082502e69a0cd0ae578fd72d8be9","tests/test_stmt.rs":"e4c02fa5ac7e93bb67967d4731726ad93a059b19b98024c31b93cb46e1acc90e","tests/test_token_trees.rs":"5e134074ae4203bdac96eb17ea4de2d19cd4116d43b8624fe50eba0c9d4276f8","tests/test_ty.rs":"1a5ed431315b51e9e853080bde728bf89c2719a4e6abc3a2e3902f97f17ee8e5","tests/test_unparenthesize.rs":"bb585b3fe20ca60d855e4cc126e336cc1f74ceab4fc245959af8ce2a780d1315","tests/test_visibility.rs":"9c4e0069d3c937b8ddce64cd8bb863390f82cfc238255845ee492b29c1ffc41c","tests/zzz_stable.rs":"ba0d69d7cb804fab348c1d62c2f2696e91f9fed2ef25378853867ef11595b8ae"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"6b7b3040333d6db7da05d9682e7e694e8890f43bcb91067d3ad03cfcfd9277b6","Android.bp":"e7bca9f107af9670afb0a2727f8025334ce80db23d8300819217c5e1da7c515d","Cargo.toml":"927dd688d67d3a0c638e05399f8a702306b2ec1954ffc29ecf2bbe59520991c3","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"5018f92b2e4c3108c09882249edc1fa5f92430b35aa553cd25cc26aff34ca30a","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"9e3d96a9b35fd9b5948cacd78803c52b3c7bcc999228ef2878c9db3c1a6700db","TEST_MAPPING":"a3074a0541d6fbb452778d31b454a0f4375a6f8e617cdb11e6c4fb83d7ed03e3","benches/file.rs":"652df66340764c9a86bb000ac114ad926960025f2caca1155b8b4a3146b91935","benches/rust.rs":"5c414ca59e18e4b098ca37caddd6668dd5ac3e089ab06c7dcb2fdd62574ee8b5","cargo_embargo.json":"fa14e6e521e1ac4b8e60f605a9a1d03b636ff6519065507e7b87db5e8e239db0","patches/rules.mk.diff":"b3d6baa97437c1c3d5eda8fc60af30c56fe345d36fa2229db9aa3abb013822ea","rules.mk":"f2a06305f7fa472ed055208798d9d27e800938e8c33e919c21a01426635edef0","src/attr.rs":"8640bfa6d726cea1e5ee9003edfd2738c439b4cbaa9cea686b885710ddead223","src/bigint.rs":"e83575534e2b0d7804fe783c5d74d181c1a8551a4e0ee1d2ecfc98ab57dd80ef","src/buffer.rs":"738315eaeb204e25d34d18596c047caa14f2578103309585a3de40fc80fbc6c1","src/classify.rs":"5ee81ce72f23bc80cd20b4eb3592f6fb4cf4b48cb09ba7aac8b101027f4730d5","src/custom_keyword.rs":"9d29fc42718db5ddc5a9aa6cc1b505194c1420d2154e6815317336d598acd995","src/custom_punctuation.rs":"13ea2d4ff08a2e4659b24f148960c4d87c1540887e4b72fbc74f9b69e6cc5226","src/data.rs":"29a4ba9d8368eb9849a8593d0a16dfb447d8247f33eb7863447c60260d7f1822","src/derive.rs":"337b090b5adde045e4f0e67dca4b7d3565a20609d652aeb6a2e66d143877b48d","src/discouraged.rs":"71098f177068e0a019f4364e806b97dad06ba68e13f17ff56376d0cf72eee89c","src/drops.rs":"3dadaa62f3a84212d67f563378fdab7c1529048499deff7cb705053212efcd52","src/error.rs":"5c9b857d2bb7a5eb2a1a4488792a9ddbb5b622c957942589db00a6f4c66814de","src/export.rs":"dae16b876935b560aae18de580d47b36b7374381fda7942733b7857d278f003e","src/expr.rs":"1ae940f653c05fee0dd60d98c521b455ce9a4688c4a6c7f5429ebc0100e73ac4","src/ext.rs":"57af9f63dc53e63334071b23ae8f15f4642d39130b9988b747a5d6024a2efff2","src/file.rs":"5086358a24a874dedaa297021b7c4b53557ca324a9d801de74340c2d10a87b59","src/fixup.rs":"2b3022ba94ccd3ffaa932c1be3652c07363deb7f2353b78d514813731b801e9f","src/gen/clone.rs":"79ea85a32631a42201e5cbc4680474df27f5d639c65c7af080fd3c15a2310790","src/gen/debug.rs":"0bc0e9e293e95edf9538f610e450df302a88151a17cddad5a9741e81da36c116","src/gen/eq.rs":"038c884c28290648ad85aaab3f331b73082959dac51fa7c0e83e9a4056658827","src/gen/fold.rs":"9b17f5946e4c92209794b340f4599bdd65f2f57610fe2f43c579bdeff1cbc1e2","src/gen/hash.rs":"740c3b33869129fabaff5b95c88e69dc7f307986f299ef77cba90f75601c7836","src/gen/token.css":"fda7badfa7b1401d7a4307553d2793cc95913db01cc167908b86b299c1a99808","src/gen/visit.rs":"7c9685a89e4a2ffc484357e74fc6144370ffa4e670e27a94d9fc302d877b388c","src/gen/visit_mut.rs":"a09f5b9e308e05ca9a05fc4e5f228c37be55d5d3208335af288374a57682383b","src/generics.rs":"2f62c7530af8b9ae10c88107ccc39edffda891929228cf22b87a83b6da93f26c","src/group.rs":"ea9143c9f224577dc70af813cafa70e55bc02b141a70d3cecf0d99d9e54d780f","src/ident.rs":"5a5c0aef1528138d0a8afaeedffc7c1c12cb8405186d6479b85bf05c41f74f70","src/item.rs":"ac4bd0ea42034985ec4fc1d350973e1d0fa1a44a945e60259e402d410271e772","src/lib.rs":"d8c0916ec2f1b6ebaad7c9f2eed75194b63778af909ba0807193e7c7f40948a1","src/lifetime.rs":"85d8ec76c48097a2a5d4938f034a280eb4a82e74c9c93fce4056de34cfd5ae12","src/lit.rs":"493dd04a8831a687d00e06bab28fa0e62da51d26b6c39d6d7002ad6db75dd4c4","src/lookahead.rs":"fa6b93a09b0e013a797918438ac3573d524ba034284255755d6ccbd0579c4a14","src/mac.rs":"a656390e6fa3605ed703f0fc103913b1a965896053abf9e06abe0171ea2c7a81","src/macros.rs":"12aaa1d0628d9262b1c08129cef3b7b2b77ac390f3dc96bf3aa1f69858e2fac9","src/meta.rs":"ad4960098dd90cd917c01aeba4699b16786e6cff7ee4829199512713c533462b","src/op.rs":"62c8d6bcf612a4b4db37b0178a63e50eba3f839164c500b2ca5f3178d7c76373","src/parse.rs":"c186bb70e5549a84e9ddde3c642ae90100e9daab01415780a449aaed27b33b29","src/parse_macro_input.rs":"28e67c76e4774279e626d44c26e6b687b775c61818bc3c6e163713b2337e4d4a","src/parse_quote.rs":"39cf7ed471f4533cb1a7ccd1018b53cfdaaae83f3c5047915492c596defbd366","src/pat.rs":"990374af68c9c31099fd0eac8ec985f4a4e6f323a25307bd1c7f132d30b2377d","src/path.rs":"ba5ff72744b6552cf97a88413d699a644c0228ed3c8c07ff010123621b793849","src/precedence.rs":"0f9ea5d4b213d08ae065f9246722357832944657509c2412ae1385141bca5de0","src/print.rs":"69d23dae2458f3f0747485e6491dfde830fdcb6bb0c8e115528f4297c14d1b30","src/punctuated.rs":"bb7bf72d928d18dbda987f72a2b1a0be8d695865ab64db6ea60efed66b8c5c20","src/restriction.rs":"4945a287710a97f4920847c50029fe880cdb509b1cd3688a1a6e77172efe567e","src/scan_expr.rs":"0189cad44956e3ec597989c7324382068a5bf8cbf788caf44bc5cb027de93cf8","src/sealed.rs":"93917292f4842b04d59343458a7a25507f989a807c2696d17fd436aa252687c9","src/span.rs":"f687a44d8bf598095c5945213d13d45c2ec3e65c8007f7ff9f1916e4e52cf0d6","src/spanned.rs":"581ee1d8358db0832cefaec2d87c59d7299e80adde12e050dd1eae76e791e6a3","src/stmt.rs":"2945c23814ca28ad9b1add34fc7ae7ec26fe569fb9f46948e91225b217ebe24a","src/thread.rs":"86e9b5f4b716f6b0332ff3906ebbf55bb000ef3ba60ca9506df98420ee81a21e","src/token.rs":"9178a01f95c0c13d2100ca10b8d170e419f5306b3ce55871b646b4490fa8aae5","src/tt.rs":"f4496db9be822900b73c18ddd567fab8aa2cf59b58cc602fa5bcee5ed79aa0d3","src/ty.rs":"be5152d5d1ee1f7ff4f19fe82a24430134049ca053f0ee3e8317d9bfa9767130","src/verbatim.rs":"9414367a03d2be4a07adfea1cb3d393d8c312e692346fddd6f196854bccff049","src/whitespace.rs":"d8c15abe68ad16b14960e987ed7f42332893fdde86696693be4c533162c88dfb","tests/common/eq.rs":"a473d9181d609bcdab3bf9ce490f3c8fde0648adb836bc3f27e3a15e39628b77","tests/common/mod.rs":"34d49d7ca94d59b9a3e26f31e136258ad1435d42ac1444cb1779479b6a5b1626","tests/common/parse.rs":"d56c03149f28e2d3c5cc91e85ed5ff9ec7165b28882560705267f483f18e1a0a","tests/common/visit.rs":"677c8fbd9fb8ad0115a19f4dc7191e9e5cfffc71fb8a566321b903728f09d163","tests/debug/gen.rs":"747e454a76f2d2569f92fce699155248ecf3aaf9f6b6db8e1432a0f2f4c391d6","tests/debug/mod.rs":"89475f591af872f2dbca0693137ef87bedc2470630a49f00c042e6b6ef8a7c85","tests/macros/mod.rs":"5ce3746277995ae5014f135899e1109560805fdf1cc9a05e5edee303a00b68da","tests/regression.rs":"293190040dd2c81e4c023da0f8e5dad234635d0ce2c71165f07e4b1b26e99743","tests/regression/issue1108.rs":"7f5c9e84dcb2b679fec1c0128eaf0d2c05bc0a07a414efafd5e86040b1014ea0","tests/regression/issue1235.rs":"ae38c33361dcce8f2c1b13220163498bce69d0138c15791311f96e6e26e95ea7","tests/repo/mod.rs":"b49d8243f7551e950c91ef725f99853ff18a3504be8e9069d5534524b80bf4fe","tests/repo/progress.rs":"52ab80a03bd7c28a4fb53a8321922637e0ccb6a8f89b05fc80dc98057dc20acc","tests/test_asyncness.rs":"efeededf544e4517ffbc204dbc2eae81228849e6958ede27a5b93ecae201dbea","tests/test_attribute.rs":"66482a7b40fbd57a00e4f92de3852864497a1f0498ac76c560069a23fc1ab797","tests/test_derive_input.rs":"9eba831e31502fc1433cb9045c94e45b2ea48924053174f566e2cdf593944f8b","tests/test_expr.rs":"1746168c01ad63cb12bd1305c32708871ee1e06092c6e9ca5905374f8a4d033b","tests/test_generics.rs":"5f8c6a62246ab5e313cb139890334d74a4984ded79a064a8b53ec00a2a20bfa4","tests/test_grouping.rs":"5d0419a9cea98c3c090fec77470518f727c952bc22245183be1542575fdaf7fa","tests/test_ident.rs":"0767b1495600b15c3c0b5ff73d7ae3d259ae1c548f025c2760a3ca23118658ae","tests/test_item.rs":"54c8740f3fe74b9d77684a08c0b9dfe72a9762990061225f7a31ba10cfe1ac3f","tests/test_iterators.rs":"77ac42ea54c07dc1c85263b8ceb0c645770abb8b3703eddd4c04cd3023fcac85","tests/test_lit.rs":"93807c4ef05e5c01934e7daa6a4d46887d909c6b9b549a113cbad54dbb83c940","tests/test_meta.rs":"ff5ca82fa795b6ab94edf9f10b52f63c47ba5681a974c35ffc2cc57e57281234","tests/test_parse_buffer.rs":"9603fa08950b304ae3e209c384f41758bae276f3ff88e415dcabd45af9d848d1","tests/test_parse_quote.rs":"6659405127ecddccec51c2ac19a88eb16a143cecaac181f9be8d3701e9887ef9","tests/test_parse_stream.rs":"eab69e8f5d3ff6acb7b739470786520f7225a4263d62a0e436c7bc5c26fc3668","tests/test_pat.rs":"9aec093d88b1577207fbf29224f656a9933e09f659c8f2d8dc46f6920fafe920","tests/test_path.rs":"477eddfee2a1f640a60015350c4157c3f4d6954949f63ba76b21318f7c526ac6","tests/test_precedence.rs":"18febb1c99d366a6350c337fbed42a733ac6be4ab3ae186c3d7def04289c7e57","tests/test_receiver.rs":"f1024b304f300c3f30bd3f25c7cc24d4dfd3fffe16fdd2188ce0d3a7f6743d08","tests/test_round_trip.rs":"20c787f5c75997ba67f810a158a68a9be0daa9886e4c815615a68c1ea6953e18","tests/test_shebang.rs":"9ba0405c4bbddb68d4b6d493cbe7d39f61dc7442715efd9150ea846dfdfe54f2","tests/test_size.rs":"6711587780bf1ee33418962be62c2a42bece082502e69a0cd0ae578fd72d8be9","tests/test_stmt.rs":"e4c02fa5ac7e93bb67967d4731726ad93a059b19b98024c31b93cb46e1acc90e","tests/test_token_trees.rs":"5e134074ae4203bdac96eb17ea4de2d19cd4116d43b8624fe50eba0c9d4276f8","tests/test_ty.rs":"1a5ed431315b51e9e853080bde728bf89c2719a4e6abc3a2e3902f97f17ee8e5","tests/test_unparenthesize.rs":"dede2dd59ca843b084d94bf6f2bf57e3350dd36ab8454fdd83ffb3700512e052","tests/test_visibility.rs":"9c4e0069d3c937b8ddce64cd8bb863390f82cfc238255845ee492b29c1ffc41c","tests/zzz_stable.rs":"ba0d69d7cb804fab348c1d62c2f2696e91f9fed2ef25378853867ef11595b8ae"}}
\ No newline at end of file
diff --git a/crates/syn/.cargo-checksum.json b/crates/syn/.cargo-checksum.json
index bc261ac..2a19e1f 100644
--- a/crates/syn/.cargo-checksum.json
+++ b/crates/syn/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"2354d16fc9a8bad7d5f03f705845f6364965b44fc605dcb528cca9d8f902bb26","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"ae6deb98ea51df4829c0327139a555cc115c6bcf6fb459db0ef0d6a96c4566ec","benches/file.rs":"e3593aa456d7ad50a118150e262ce2beb2092ed5c9391e93a055700d228cafb2","benches/rust.rs":"f40e33d0affc2d2081dc4522419382bf9a7b767eada7ac0063a1e6128929359f","src/attr.rs":"d890e2f0866758aec4a21729e2ea76b51485e43170f78b5a130499edad8a069d","src/bigint.rs":"0299829b2f7a1a798fe2f7bc1680e4a10f9b6f4a852d09af4da2deab466c4242","src/buffer.rs":"c2b99c6b4268205050fa93e6695f0f6d5990c4b2a7b24e234fd8d81c265f309a","src/classify.rs":"fa71d85602981cabf8f283d58748116a0d614a6af07d9e0025f459d71004fd14","src/custom_keyword.rs":"322114e36ae43a2f8605506fb4568efdbc2986853e2fee74bd10a4ca0fb60c69","src/custom_punctuation.rs":"2ae2339c29b1aff3ab16157d51a3a07bfca594aa38586981534fe07a62cdd9d1","src/data.rs":"5bb05d41eb93f5c895f05f31a2aa468f3332265a6d5e7a89968c5daa273937dc","src/derive.rs":"f54f8cf9386a2d45186ff3c86ade5dae59e0e337b0198532449190ae8520cff8","src/discouraged.rs":"88b38a75d074d3f0b4186f2b4988844e8284a0c9d279d784327c6b595b9e33ea","src/drops.rs":"e98da4aaafb5afc75919f9e2914326ad09bf16094a9407c60a05515a2e01dd00","src/error.rs":"3b03fd75eee8b0bb646eaf20f7e287345bdc7515ad5286024a2dd1e53c1e7bf2","src/export.rs":"b260cc49da1da3489e7755832bc8015cfad79e84f6c74e237f65ae25a2385e56","src/expr.rs":"c27fd8dd85a2a1a0832642c28eb1fe64714317c7863e089baf342adcdc442785","src/ext.rs":"ed143b029af286e62ceb4310286a4ce894792dd588465face042b4199b39d329","src/file.rs":"378839f4e6a9f30d524a6a9213cc513711ddeb14e04d98b0c67644d81788919d","src/fixup.rs":"b312a6a527f81df17a94cb9f08def820584ca76cbef07893bbed492f2f0506af","src/gen/clone.rs":"7af00b0a240453d7aac178be1b6cdf9df3b33f1281da35e02f66ba7ba55d060c","src/gen/debug.rs":"59bc259fa9dc0c7ffe094df7ad8afc9c4e79b6d73a8f0fae8a2e435905866e7a","src/gen/eq.rs":"d7428672d82c1931fdefb8bda0425a25ebbe20e5e2736b18cfd1752b64e99f78","src/gen/fold.rs":"99e8d2a7a7ca3e57c9358e6ea364f68145351f0c81677930e6c3597d15fab527","src/gen/hash.rs":"6808bb0e47e7346a14fbec5f55430906efa172f46417c83c2f7c76ce8c9ceab6","src/gen/token.css":"3a5882d0b3aefbf56ca5d08c28c117e25ac2327eadf7242202d906b2ddb2232e","src/gen/visit.rs":"10ce13d77cec3b3babc8f332902b0bddd712bb5fd5de1f4b3d7761e67cc13947","src/gen/visit_mut.rs":"53672f7c2568b1a9ad0ab33009c61ca19a3ebf18f5d1da57910e4e92fd6075e3","src/generics.rs":"f144722f5c2678ad27e76606dd9e2d672b95f003c272a6eaa5d1fd30b77a1410","src/group.rs":"ddbff97e41315bdf9dfce215a8c00bb4d532827cf794246afde7308b39dc09ca","src/ident.rs":"d6061030fadae9c7dc847e1ee46178d9657d782aad108c7197e8cafe765b3eaa","src/item.rs":"2c1547f87927aee8443bebfcc7c924d128f2c78cebd4e23afd81bdd1b0298ee8","src/lib.rs":"0ab39b1047d89913c4b36d664dee3f12342cb732fe74aea2b8a2b916e79e62d6","src/lifetime.rs":"5787d5a5dc7e5332b03283a25ae0a9e826464242ca2d149b1a19e7cae9cee34d","src/lit.rs":"8fa6fa2d752bd1bf5a94cd5cbf9becbcba37d491876614ce62dba0f8fc745a3d","src/lookahead.rs":"6c8071c172620969b4b708981c7424d672985038be7dfde95ddc433604111773","src/mac.rs":"fdce8291f71adef3f69975f229156dca2309ca232ed943061afaf96220908ab8","src/macros.rs":"2a6e895dfe1c3a9a7237b5e23358ca5d8967e2beae6d094dda68d3659f9a5c84","src/meta.rs":"969d8ccbdbc6ea2e4928a21831b791c57447b231e1373149e4c63b46f3951801","src/op.rs":"a61757370f802e44efa3c4a1057ae2cd26e64e273f7d76c06d5ffb49602319e2","src/parse.rs":"2fa82a15f12a3ff0b7fdd36dd8c215f99120ec316769187bea5c0a6cc730289f","src/parse_macro_input.rs":"e4e22b63d0496d06a4ca17742a22467ed93f08a739081324773828bad63175ee","src/parse_quote.rs":"1679f4621b2702f6ad8ede2fd2a50d4c6f2c07fc5b18e6a389076f37d1e7cc19","src/pat.rs":"1455a882df5defbf6b774a80f37fe24cf96d5ad1e5584c5204c0c9723883566b","src/path.rs":"0e1f132bcb8586b0e93d377da96d48a6c8e63b2c3ea2b83c23698da5ec8039d5","src/precedence.rs":"58420a5015003ecd4d7a4a0c87c168caa4c696e646355523d9eaae81fc5e1d54","src/print.rs":"22910bf0521ab868ebd7c62601c55912d12cfb400c65723e08e5cfa3a2d111c0","src/punctuated.rs":"6e4a63b736f371bbb4cba83bb674e29aa25f9f214bc10e9acf785673a39d3fc5","src/restriction.rs":"a7152ec5a4ee4f55446019aa2b4d84f2238776f0e6ffc0c22adf3374b517fe56","src/scan_expr.rs":"d46ae7a3eaaa6476553db3164676ec71aa82bcd8a2e4cad59deb07893c79f1c8","src/sealed.rs":"6ece3b3dcb30f6bb98b93d83759ca7712ee8592bef9c0511141039c38765db0e","src/span.rs":"0a48e375e5c9768f6f64174a91ba6a255f4b021e2fb3548d8494e617f142601b","src/spanned.rs":"4b9bd65f60ab81922adfd0be8f03b6d50e98da3a5f525f242f9639aec4beac79","src/stmt.rs":"9d68b914eac9569de71b3b76fdec2a729796c7350b6eb03d2255662233b12195","src/thread.rs":"1f1deb1272525ab2af9a36aac4bce8f65b0e315adb1656641fd7075662f49222","src/token.rs":"aa7f0e20c3f84e88810ef3ff30f71722973fdeed5cf31ce617f18a5459c758f0","src/tt.rs":"a58303a95d08d6bf3f3e09715b9b70a57b91b54774cfc1f00f2848034d2ff5c7","src/ty.rs":"b0e29da2f6d11e7766ef76d54a5af65eb7eaa00f3cf2db95276528057f77a37c","src/verbatim.rs":"87cbe82a90f48efb57ffd09141042698b3e011a21d0d5412154d80324b0a5ef0","src/whitespace.rs":"9cdcbfe9045b259046329a795bc1105ab5a871471a6d3f7318d275ee53f7a825","tests/common/eq.rs":"0c0d983f5230bf6fb890fc0fb6a965eeb8df4938dbefdd7f1241548ef3f1c84b","tests/common/mod.rs":"1f43ce65b273172c87640e87ee0775ecb6f19280fbf8f792570d019b61f9a32d","tests/common/parse.rs":"c173bd515ba1d53b3b676161849fa8df0ae3d5592445843cee65b6628b71ac32","tests/debug/gen.rs":"3843ce1b6ea5a8e72bd24dfd52760d9326c30e05a3cfe5b28f8f0ac6d76318cf","tests/debug/mod.rs":"1259df940bbcaa968a837e402d6853f2efa38d2260e306d42f17f9e8ef74fae5","tests/macros/mod.rs":"c246b05fcca55d3880278754f36c802a8a006bb0a17d0c787989dd6716e76f37","tests/regression.rs":"e9565ea0efecb4136f099164ffcfa26e1996b0a27fb9c6659e90ad9bdd42e7b6","tests/regression/issue1108.rs":"f32db35244a674e22ff824ca9e5bbec2184e287b59f022db68c418b5878a2edc","tests/regression/issue1235.rs":"a2266b10c3f7c7af5734817ab0a3e8b309b51e7d177b63f26e67e6b744d280b0","tests/repo/mod.rs":"3ff3657c5201809456307dd4f3f3a2eef5170e29f4c3df3a7d43ae0415124471","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"aca499c3c120f35f56033493aa732079af9a85463cc39297ed46ad2397be1c6d","tests/test_attribute.rs":"48078187c20a257422e02042c47acea8bb9b3644696e5d6a1eb0962864b81691","tests/test_derive_input.rs":"e062007ef389c0b8490d9145f9cc5dec59acbf34927c92355a43f2a847070ac2","tests/test_expr.rs":"356d9d37a94f907911a652d111a2ca060d09492eaaacc09c1b6333cf884a04d1","tests/test_generics.rs":"73ed0bb52b75720911fb03977b8ec33b873c2eaab735114d7a5fb45531b0b3c4","tests/test_grouping.rs":"28084b1b922884b54dfa6dc573ffc19a58138e5b08e0b6e0a82120572983c81d","tests/test_ident.rs":"d5850e817720e774cd397a46dbc5298c57933823c18e20805e84503fc9387e8f","tests/test_item.rs":"7191698ea9ed6e94ac57dbcfc4b484623d0c31cf89b005d5935083431be725f3","tests/test_iterators.rs":"f1ab7d5504dc06dc79cc3ba09c0364b045d2da86deb06e60412e6b80208b7439","tests/test_lit.rs":"8ec75a817036f0ff918b350370e90b2fb3fdef0ed32587b0015ebc09f9456c10","tests/test_meta.rs":"fee43f1219dd23523766feded7609d7c7fc3a156ecd55e309b2c5b40f11e045a","tests/test_parse_buffer.rs":"0de6af13ba0345986b18d495063f9b75a1018e8569c34b277f9522c63a6c0941","tests/test_parse_quote.rs":"28c11ab23b374327f56b29cc5f424f4a22a5974b92f9077a8dd0b8dca08c8d5c","tests/test_parse_stream.rs":"b6b533432173123d6d01d8d2cb33714bc50b30b16ffbb6116f93937221ad4594","tests/test_pat.rs":"d70d701ab2b9bd4f632e926af44c829ac273cf6fdacbdc52df4ec7cefcc9e09c","tests/test_path.rs":"9529c461c38ac1ecca1c6b798392aba791e7d371228b7670cde4c9b34c8e9d68","tests/test_precedence.rs":"79d2f8bcfab0e5c5d635fceea4b0f9f7886901e07dcdc14e3cf4c761b45ae3e0","tests/test_receiver.rs":"d34a1c5cac8f78ff0ff41df3bd9631b02edacab4d50059e8a2ed3d13fe6ba4c5","tests/test_round_trip.rs":"9c00a071a98cad7ce730d9e78e75ac63852924d6c1eaa6b6e29d06f02d276560","tests/test_shebang.rs":"98f7ec66e2240391c8f48fe9a330737930740b6275fef22486555ebef113acad","tests/test_size.rs":"03efaf829b80b7db1f831474c1d3ce268914fc499d0e2a7eea03cad04a482974","tests/test_stmt.rs":"3cf4463864039483c1ee329e3796d690b47c18bc8255c407451d31b239440ffe","tests/test_token_trees.rs":"f0a57f4d46b5dd4dbdf601450f6eb4db5fb5622dce3e9d17d2f021021b37fd9d","tests/test_ty.rs":"57622225e442427b79a68ff86a3fb2ebf2b81cc2ae1d2d00be601e8402bb1197","tests/test_unparenthesize.rs":"f248f163dc6a8b652083b9402a2734a277461d35d95798b69476b3cd5956e2c3","tests/test_visibility.rs":"f0ef86f7a89b8b78b841cad25d98420e96f59309d3d42f6930c6defad183edc7","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"}
\ No newline at end of file
+{"files":{"Cargo.toml":"d071df0750bfc7ef78f9a4c5be7afdd047785c7141223765f91484ee5a7873c0","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"ae6deb98ea51df4829c0327139a555cc115c6bcf6fb459db0ef0d6a96c4566ec","benches/file.rs":"e3593aa456d7ad50a118150e262ce2beb2092ed5c9391e93a055700d228cafb2","benches/rust.rs":"11d16239317c7a0f3e58804cac333dc798c7dc700919e72f2d049ee1a391d404","src/attr.rs":"d890e2f0866758aec4a21729e2ea76b51485e43170f78b5a130499edad8a069d","src/bigint.rs":"0299829b2f7a1a798fe2f7bc1680e4a10f9b6f4a852d09af4da2deab466c4242","src/buffer.rs":"c2b99c6b4268205050fa93e6695f0f6d5990c4b2a7b24e234fd8d81c265f309a","src/classify.rs":"3c796df4c891034abc3008196d34ad62c22fcb9525a067890731a5a6bbc7b5fb","src/custom_keyword.rs":"322114e36ae43a2f8605506fb4568efdbc2986853e2fee74bd10a4ca0fb60c69","src/custom_punctuation.rs":"2ae2339c29b1aff3ab16157d51a3a07bfca594aa38586981534fe07a62cdd9d1","src/data.rs":"5bb05d41eb93f5c895f05f31a2aa468f3332265a6d5e7a89968c5daa273937dc","src/derive.rs":"f54f8cf9386a2d45186ff3c86ade5dae59e0e337b0198532449190ae8520cff8","src/discouraged.rs":"88b38a75d074d3f0b4186f2b4988844e8284a0c9d279d784327c6b595b9e33ea","src/drops.rs":"e98da4aaafb5afc75919f9e2914326ad09bf16094a9407c60a05515a2e01dd00","src/error.rs":"3b03fd75eee8b0bb646eaf20f7e287345bdc7515ad5286024a2dd1e53c1e7bf2","src/export.rs":"b260cc49da1da3489e7755832bc8015cfad79e84f6c74e237f65ae25a2385e56","src/expr.rs":"2f25b33e0d005bffeb24763703cd9e6cf86a877df1d9eeaf7eb175617a7b3364","src/ext.rs":"ed143b029af286e62ceb4310286a4ce894792dd588465face042b4199b39d329","src/file.rs":"378839f4e6a9f30d524a6a9213cc513711ddeb14e04d98b0c67644d81788919d","src/fixup.rs":"305588a36da23a566bb9f49ac8a4d26f957082c358692888313f08571f8c39b2","src/gen/clone.rs":"7af00b0a240453d7aac178be1b6cdf9df3b33f1281da35e02f66ba7ba55d060c","src/gen/debug.rs":"59bc259fa9dc0c7ffe094df7ad8afc9c4e79b6d73a8f0fae8a2e435905866e7a","src/gen/eq.rs":"d7428672d82c1931fdefb8bda0425a25ebbe20e5e2736b18cfd1752b64e99f78","src/gen/fold.rs":"99e8d2a7a7ca3e57c9358e6ea364f68145351f0c81677930e6c3597d15fab527","src/gen/hash.rs":"6808bb0e47e7346a14fbec5f55430906efa172f46417c83c2f7c76ce8c9ceab6","src/gen/token.css":"3a5882d0b3aefbf56ca5d08c28c117e25ac2327eadf7242202d906b2ddb2232e","src/gen/visit.rs":"10ce13d77cec3b3babc8f332902b0bddd712bb5fd5de1f4b3d7761e67cc13947","src/gen/visit_mut.rs":"53672f7c2568b1a9ad0ab33009c61ca19a3ebf18f5d1da57910e4e92fd6075e3","src/generics.rs":"f144722f5c2678ad27e76606dd9e2d672b95f003c272a6eaa5d1fd30b77a1410","src/group.rs":"ddbff97e41315bdf9dfce215a8c00bb4d532827cf794246afde7308b39dc09ca","src/ident.rs":"d6061030fadae9c7dc847e1ee46178d9657d782aad108c7197e8cafe765b3eaa","src/item.rs":"2c1547f87927aee8443bebfcc7c924d128f2c78cebd4e23afd81bdd1b0298ee8","src/lib.rs":"bb37423ddd5561e8cc9f1bdec849035b0cc3710454bea57a6524143723f48011","src/lifetime.rs":"5787d5a5dc7e5332b03283a25ae0a9e826464242ca2d149b1a19e7cae9cee34d","src/lit.rs":"8fa6fa2d752bd1bf5a94cd5cbf9becbcba37d491876614ce62dba0f8fc745a3d","src/lookahead.rs":"6c8071c172620969b4b708981c7424d672985038be7dfde95ddc433604111773","src/mac.rs":"fdce8291f71adef3f69975f229156dca2309ca232ed943061afaf96220908ab8","src/macros.rs":"2a6e895dfe1c3a9a7237b5e23358ca5d8967e2beae6d094dda68d3659f9a5c84","src/meta.rs":"969d8ccbdbc6ea2e4928a21831b791c57447b231e1373149e4c63b46f3951801","src/op.rs":"a61757370f802e44efa3c4a1057ae2cd26e64e273f7d76c06d5ffb49602319e2","src/parse.rs":"2fa82a15f12a3ff0b7fdd36dd8c215f99120ec316769187bea5c0a6cc730289f","src/parse_macro_input.rs":"e4e22b63d0496d06a4ca17742a22467ed93f08a739081324773828bad63175ee","src/parse_quote.rs":"80eec7ce54c38f3bbd23acb70cd8a6649d7e1523c3977e3bf12849fd8c5cf16d","src/pat.rs":"1455a882df5defbf6b774a80f37fe24cf96d5ad1e5584c5204c0c9723883566b","src/path.rs":"835e9db196da62b4a01d13e56327c6c62ac029abb6086ac52c9bd6ac659320e9","src/precedence.rs":"58420a5015003ecd4d7a4a0c87c168caa4c696e646355523d9eaae81fc5e1d54","src/print.rs":"22910bf0521ab868ebd7c62601c55912d12cfb400c65723e08e5cfa3a2d111c0","src/punctuated.rs":"6e4a63b736f371bbb4cba83bb674e29aa25f9f214bc10e9acf785673a39d3fc5","src/restriction.rs":"a7152ec5a4ee4f55446019aa2b4d84f2238776f0e6ffc0c22adf3374b517fe56","src/scan_expr.rs":"d46ae7a3eaaa6476553db3164676ec71aa82bcd8a2e4cad59deb07893c79f1c8","src/sealed.rs":"6ece3b3dcb30f6bb98b93d83759ca7712ee8592bef9c0511141039c38765db0e","src/span.rs":"0a48e375e5c9768f6f64174a91ba6a255f4b021e2fb3548d8494e617f142601b","src/spanned.rs":"4b9bd65f60ab81922adfd0be8f03b6d50e98da3a5f525f242f9639aec4beac79","src/stmt.rs":"5afa302e742408acd3adfc83e7c00a64213a06783b21f66c32f653bee8b1c95a","src/thread.rs":"1f1deb1272525ab2af9a36aac4bce8f65b0e315adb1656641fd7075662f49222","src/token.rs":"aa7f0e20c3f84e88810ef3ff30f71722973fdeed5cf31ce617f18a5459c758f0","src/tt.rs":"a58303a95d08d6bf3f3e09715b9b70a57b91b54774cfc1f00f2848034d2ff5c7","src/ty.rs":"b0e29da2f6d11e7766ef76d54a5af65eb7eaa00f3cf2db95276528057f77a37c","src/verbatim.rs":"87cbe82a90f48efb57ffd09141042698b3e011a21d0d5412154d80324b0a5ef0","src/whitespace.rs":"9cdcbfe9045b259046329a795bc1105ab5a871471a6d3f7318d275ee53f7a825","tests/common/eq.rs":"68e5e3ede9d9ac54a030691618eb3c9958c9c248715a0e8c7ac4abb467bd7093","tests/common/mod.rs":"b752aa8f1faf8c6abf1286a12fb50b6c257ec1889d81bcdb3dc3257134695a89","tests/common/parse.rs":"c173bd515ba1d53b3b676161849fa8df0ae3d5592445843cee65b6628b71ac32","tests/common/visit.rs":"2eb0b56f8110f7a12b2143db16c07e0229d1b7c8b9c3d4b2c4344f904e553277","tests/debug/gen.rs":"3843ce1b6ea5a8e72bd24dfd52760d9326c30e05a3cfe5b28f8f0ac6d76318cf","tests/debug/mod.rs":"1259df940bbcaa968a837e402d6853f2efa38d2260e306d42f17f9e8ef74fae5","tests/macros/mod.rs":"c246b05fcca55d3880278754f36c802a8a006bb0a17d0c787989dd6716e76f37","tests/regression.rs":"e9565ea0efecb4136f099164ffcfa26e1996b0a27fb9c6659e90ad9bdd42e7b6","tests/regression/issue1108.rs":"f32db35244a674e22ff824ca9e5bbec2184e287b59f022db68c418b5878a2edc","tests/regression/issue1235.rs":"a2266b10c3f7c7af5734817ab0a3e8b309b51e7d177b63f26e67e6b744d280b0","tests/repo/mod.rs":"1c47966118a0a5bd5ba1cb2163ec8928917bd6299e4ee6a4d9a6b6a67ce10ef8","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"aca499c3c120f35f56033493aa732079af9a85463cc39297ed46ad2397be1c6d","tests/test_attribute.rs":"48078187c20a257422e02042c47acea8bb9b3644696e5d6a1eb0962864b81691","tests/test_derive_input.rs":"e062007ef389c0b8490d9145f9cc5dec59acbf34927c92355a43f2a847070ac2","tests/test_expr.rs":"f1ae9ca18da846584adc6c858b622c31d532aa866af7fdd4b10507ca855f369c","tests/test_generics.rs":"73ed0bb52b75720911fb03977b8ec33b873c2eaab735114d7a5fb45531b0b3c4","tests/test_grouping.rs":"28084b1b922884b54dfa6dc573ffc19a58138e5b08e0b6e0a82120572983c81d","tests/test_ident.rs":"d5850e817720e774cd397a46dbc5298c57933823c18e20805e84503fc9387e8f","tests/test_item.rs":"7191698ea9ed6e94ac57dbcfc4b484623d0c31cf89b005d5935083431be725f3","tests/test_iterators.rs":"f1ab7d5504dc06dc79cc3ba09c0364b045d2da86deb06e60412e6b80208b7439","tests/test_lit.rs":"8ec75a817036f0ff918b350370e90b2fb3fdef0ed32587b0015ebc09f9456c10","tests/test_meta.rs":"fee43f1219dd23523766feded7609d7c7fc3a156ecd55e309b2c5b40f11e045a","tests/test_parse_buffer.rs":"0de6af13ba0345986b18d495063f9b75a1018e8569c34b277f9522c63a6c0941","tests/test_parse_quote.rs":"28c11ab23b374327f56b29cc5f424f4a22a5974b92f9077a8dd0b8dca08c8d5c","tests/test_parse_stream.rs":"b6b533432173123d6d01d8d2cb33714bc50b30b16ffbb6116f93937221ad4594","tests/test_pat.rs":"d70d701ab2b9bd4f632e926af44c829ac273cf6fdacbdc52df4ec7cefcc9e09c","tests/test_path.rs":"9529c461c38ac1ecca1c6b798392aba791e7d371228b7670cde4c9b34c8e9d68","tests/test_precedence.rs":"540f7277c0e22ddc5368bd9ede169258b6212a90481c34e4370417b02b8e3223","tests/test_receiver.rs":"d34a1c5cac8f78ff0ff41df3bd9631b02edacab4d50059e8a2ed3d13fe6ba4c5","tests/test_round_trip.rs":"9c00a071a98cad7ce730d9e78e75ac63852924d6c1eaa6b6e29d06f02d276560","tests/test_shebang.rs":"98f7ec66e2240391c8f48fe9a330737930740b6275fef22486555ebef113acad","tests/test_size.rs":"03efaf829b80b7db1f831474c1d3ce268914fc499d0e2a7eea03cad04a482974","tests/test_stmt.rs":"3cf4463864039483c1ee329e3796d690b47c18bc8255c407451d31b239440ffe","tests/test_token_trees.rs":"f0a57f4d46b5dd4dbdf601450f6eb4db5fb5622dce3e9d17d2f021021b37fd9d","tests/test_ty.rs":"57622225e442427b79a68ff86a3fb2ebf2b81cc2ae1d2d00be601e8402bb1197","tests/test_unparenthesize.rs":"b04fee449f613e1a9ce75f8282e25783162c5762148b338218bb3ee3e2b8853b","tests/test_visibility.rs":"f0ef86f7a89b8b78b841cad25d98420e96f59309d3d42f6930c6defad183edc7","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"}
\ No newline at end of file
diff --git a/crates/syn/Android.bp b/crates/syn/Android.bp
index af626d5..3b2f364 100644
--- a/crates/syn/Android.bp
+++ b/crates/syn/Android.bp
@@ -18,7 +18,7 @@
     host_cross_supported: false,
     crate_name: "syn",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.0.90",
+    cargo_pkg_version: "2.0.96",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
diff --git a/crates/syn/Cargo.toml b/crates/syn/Cargo.toml
index 54afe47..e21dac9 100644
--- a/crates/syn/Cargo.toml
+++ b/crates/syn/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "syn"
-version = "2.0.90"
+version = "2.0.96"
 authors = ["David Tolnay <[email protected]>"]
 build = false
 include = [
@@ -61,6 +61,29 @@
     "extra-traits",
 ]
 
+[features]
+clone-impls = []
+default = [
+    "derive",
+    "parsing",
+    "printing",
+    "clone-impls",
+    "proc-macro",
+]
+derive = []
+extra-traits = []
+fold = []
+full = []
+parsing = []
+printing = ["dep:quote"]
+proc-macro = [
+    "proc-macro2/proc-macro",
+    "quote?/proc-macro",
+]
+test = ["syn-test-suite/all-features"]
+visit = []
+visit-mut = []
+
 [lib]
 name = "syn"
 path = "src/lib.rs"
@@ -228,29 +251,6 @@
 [dev-dependencies.termcolor]
 version = "1"
 
-[features]
-clone-impls = []
-default = [
-    "derive",
-    "parsing",
-    "printing",
-    "clone-impls",
-    "proc-macro",
-]
-derive = []
-extra-traits = []
-fold = []
-full = []
-parsing = []
-printing = ["dep:quote"]
-proc-macro = [
-    "proc-macro2/proc-macro",
-    "quote?/proc-macro",
-]
-test = ["syn-test-suite/all-features"]
-visit = []
-visit-mut = []
-
 [target."cfg(not(miri))".dev-dependencies.flate2]
 version = "1"
 
diff --git a/crates/syn/METADATA b/crates/syn/METADATA
index c648dfc..9f20933 100644
--- a/crates/syn/METADATA
+++ b/crates/syn/METADATA
@@ -1,17 +1,17 @@
 name: "syn"
 description: "Parser for Rust source code"
 third_party {
-  version: "2.0.90"
+  version: "2.0.96"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 12
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/syn"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/syn/syn-2.0.90.crate"
-    version: "2.0.90"
+    value: "https://static.crates.io/crates/syn/syn-2.0.96.crate"
+    version: "2.0.96"
   }
 }
diff --git a/crates/syn/benches/rust.rs b/crates/syn/benches/rust.rs
index 75a9f91..96770dd 100644
--- a/crates/syn/benches/rust.rs
+++ b/crates/syn/benches/rust.rs
@@ -60,7 +60,10 @@
     use crate::repo;
     use rustc_data_structures::sync::Lrc;
     use rustc_error_messages::FluentBundle;
-    use rustc_errors::{emitter::Emitter, translation::Translate, DiagCtxt, DiagInner};
+    use rustc_errors::emitter::Emitter;
+    use rustc_errors::registry::Registry;
+    use rustc_errors::translation::Translate;
+    use rustc_errors::{DiagCtxt, DiagInner};
     use rustc_session::parse::ParseSess;
     use rustc_span::source_map::{FilePathMapping, SourceMap};
     use rustc_span::FileName;
@@ -70,7 +73,7 @@
         struct SilentEmitter;
 
         impl Emitter for SilentEmitter {
-            fn emit_diagnostic(&mut self, _diag: DiagInner) {}
+            fn emit_diagnostic(&mut self, _diag: DiagInner, _registry: &Registry) {}
             fn source_map(&self) -> Option<&SourceMap> {
                 None
             }
diff --git a/crates/syn/src/classify.rs b/crates/syn/src/classify.rs
index b3a6ae9..8eab19d 100644
--- a/crates/syn/src/classify.rs
+++ b/crates/syn/src/classify.rs
@@ -63,96 +63,10 @@
         | Expr::Tuple(_)
         | Expr::Unary(_)
         | Expr::Yield(_)
-        | Expr::Verbatim(_) => true
+        | Expr::Verbatim(_) => true,
     }
 }
 
-#[cfg(all(feature = "printing", feature = "full"))]
-pub(crate) fn confusable_with_adjacent_block(mut expr: &Expr) -> bool {
-    let mut stack = Vec::new();
-
-    while let Some(next) = match expr {
-        Expr::Assign(e) => {
-            stack.push(&e.right);
-            Some(&e.left)
-        }
-        Expr::Await(e) => Some(&e.base),
-        Expr::Binary(e) => {
-            stack.push(&e.right);
-            Some(&e.left)
-        }
-        Expr::Break(e) => {
-            if let Some(Expr::Block(_)) = e.expr.as_deref() {
-                return true;
-            }
-            stack.pop()
-        }
-        Expr::Call(e) => Some(&e.func),
-        Expr::Cast(e) => Some(&e.expr),
-        Expr::Closure(e) => Some(&e.body),
-        Expr::Field(e) => Some(&e.base),
-        Expr::Index(e) => Some(&e.expr),
-        Expr::MethodCall(e) => Some(&e.receiver),
-        Expr::Range(e) => {
-            if let Some(Expr::Block(_)) = e.end.as_deref() {
-                return true;
-            }
-            match (&e.start, &e.end) {
-                (Some(start), end) => {
-                    stack.extend(end);
-                    Some(start)
-                }
-                (None, Some(end)) => Some(end),
-                (None, None) => stack.pop(),
-            }
-        }
-        Expr::RawAddr(e) => Some(&e.expr),
-        Expr::Reference(e) => Some(&e.expr),
-        Expr::Return(e) => {
-            if e.expr.is_none() && stack.is_empty() {
-                return true;
-            }
-            stack.pop()
-        }
-        Expr::Struct(_) => return true,
-        Expr::Try(e) => Some(&e.expr),
-        Expr::Unary(e) => Some(&e.expr),
-        Expr::Yield(e) => {
-            if e.expr.is_none() && stack.is_empty() {
-                return true;
-            }
-            stack.pop()
-        }
-
-        Expr::Array(_)
-        | Expr::Async(_)
-        | Expr::Block(_)
-        | Expr::Const(_)
-        | Expr::Continue(_)
-        | Expr::ForLoop(_)
-        | Expr::Group(_)
-        | Expr::If(_)
-        | Expr::Infer(_)
-        | Expr::Let(_)
-        | Expr::Lit(_)
-        | Expr::Loop(_)
-        | Expr::Macro(_)
-        | Expr::Match(_)
-        | Expr::Paren(_)
-        | Expr::Path(_)
-        | Expr::Repeat(_)
-        | Expr::TryBlock(_)
-        | Expr::Tuple(_)
-        | Expr::Unsafe(_)
-        | Expr::Verbatim(_)
-        | Expr::While(_) => stack.pop(),
-    } {
-        expr = next;
-    }
-
-    false
-}
-
 #[cfg(feature = "printing")]
 pub(crate) fn trailing_unparameterized_path(mut ty: &Type) -> bool {
     loop {
diff --git a/crates/syn/src/expr.rs b/crates/syn/src/expr.rs
index 545b43d..0184821 100644
--- a/crates/syn/src/expr.rs
+++ b/crates/syn/src/expr.rs
@@ -904,7 +904,7 @@
     #[cfg(feature = "parsing")]
     #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]
     pub fn peek(input: ParseStream) -> bool {
-        input.peek(Ident::peek_any) // value name or keyword
+        input.peek(Ident::peek_any) && !input.peek(Token![as]) // value name or keyword
             || input.peek(token::Paren) // tuple
             || input.peek(token::Bracket) // array
             || input.peek(token::Brace) // block
@@ -1315,15 +1315,19 @@
     ) -> Result<Expr> {
         loop {
             let ahead = input.fork();
-            if let Expr::Range(ExprRange { end: Some(_), .. }) = lhs {
-                // A range with an upper bound cannot be the left-hand side of
-                // another binary operator.
+            if let Expr::Range(_) = lhs {
+                // A range cannot be the left-hand side of another binary operator.
                 break;
             } else if let Ok(op) = ahead.parse::<BinOp>() {
                 let precedence = Precedence::of_binop(&op);
                 if precedence < base {
                     break;
                 }
+                if precedence == Precedence::Assign {
+                    if let Expr::Range(_) = lhs {
+                        break;
+                    }
+                }
                 if precedence == Precedence::Compare {
                     if let Expr::Binary(lhs) = &lhs {
                         if Precedence::of_binop(&lhs.op) == Precedence::Compare {
@@ -1339,7 +1343,13 @@
                     op,
                     right,
                 });
-            } else if Precedence::Assign >= base && input.peek(Token![=]) && !input.peek(Token![=>])
+            } else if Precedence::Assign >= base
+                && input.peek(Token![=])
+                && !input.peek(Token![=>])
+                && match lhs {
+                    Expr::Range(_) => false,
+                    _ => true,
+                }
             {
                 let eq_token: Token![=] = input.parse()?;
                 let right = parse_binop_rhs(input, allow_struct, Precedence::Assign)?;
@@ -1673,7 +1683,12 @@
                     bracket_token: bracketed!(content in input),
                     index: content.parse()?,
                 });
-            } else if input.peek(Token![?]) {
+            } else if input.peek(Token![?])
+                && match e {
+                    Expr::Range(_) => false,
+                    _ => true,
+                }
+            {
                 e = Expr::Try(ExprTry {
                     attrs: Vec::new(),
                     expr: Box::new(e),
@@ -2328,10 +2343,7 @@
             let brace_token = braced!(content in input);
             attr::parsing::parse_inner(&content, &mut attrs)?;
 
-            let mut arms = Vec::new();
-            while !content.is_empty() {
-                arms.push(content.call(Arm::parse)?);
-            }
+            let arms = Arm::parse_multiple(&content)?;
 
             Ok(ExprMatch {
                 attrs,
@@ -2870,7 +2882,23 @@
                 || input.peek(Token![,])
                 || input.peek(Token![;])
                 || input.peek(Token![.]) && !input.peek(Token![..])
-                || !allow_struct.0 && input.peek(token::Brace))
+                || input.peek(Token![?])
+                || input.peek(Token![=>])
+                || !allow_struct.0 && input.peek(token::Brace)
+                || input.peek(Token![=])
+                || input.peek(Token![+])
+                || input.peek(Token![/])
+                || input.peek(Token![%])
+                || input.peek(Token![^])
+                || input.peek(Token![>])
+                || input.peek(Token![<=])
+                || input.peek(Token![!=])
+                || input.peek(Token![-=])
+                || input.peek(Token![*=])
+                || input.peek(Token![&=])
+                || input.peek(Token![|=])
+                || input.peek(Token![<<=])
+                || input.peek(Token![as]))
         {
             Ok(None)
         } else {
@@ -2946,6 +2974,17 @@
     }
 
     #[cfg(feature = "full")]
+    impl Arm {
+        pub(crate) fn parse_multiple(input: ParseStream) -> Result<Vec<Self>> {
+            let mut arms = Vec::new();
+            while !input.is_empty() {
+                arms.push(input.call(Arm::parse)?);
+            }
+            Ok(arms)
+        }
+    }
+
+    #[cfg(feature = "full")]
     #[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]
     impl Parse for Arm {
         fn parse(input: ParseStream) -> Result<Arm> {
@@ -3112,17 +3151,7 @@
     #[cfg(not(feature = "full"))]
     pub(crate) fn outer_attrs_to_tokens(_attrs: &[Attribute], _tokens: &mut TokenStream) {}
 
-    #[cfg(feature = "full")]
-    fn print_condition(expr: &Expr, tokens: &mut TokenStream) {
-        print_subexpression(
-            expr,
-            classify::confusable_with_adjacent_block(expr),
-            tokens,
-            FixupContext::new_condition(),
-        );
-    }
-
-    fn print_subexpression(
+    pub(crate) fn print_subexpression(
         expr: &Expr,
         needs_group: bool,
         tokens: &mut TokenStream,
@@ -3154,7 +3183,7 @@
 
     pub(crate) fn print_expr(expr: &Expr, tokens: &mut TokenStream, mut fixup: FixupContext) {
         #[cfg(feature = "full")]
-        let needs_group = fixup.would_cause_statement_boundary(expr);
+        let needs_group = fixup.parenthesize(expr);
         #[cfg(not(feature = "full"))]
         let needs_group = false;
 
@@ -3179,7 +3208,7 @@
             Expr::Call(e) => print_expr_call(e, tokens, fixup),
             Expr::Cast(e) => print_expr_cast(e, tokens, fixup),
             #[cfg(feature = "full")]
-            Expr::Closure(e) => e.to_tokens(tokens),
+            Expr::Closure(e) => print_expr_closure(e, tokens, fixup),
             #[cfg(feature = "full")]
             Expr::Const(e) => e.to_tokens(tokens),
             #[cfg(feature = "full")]
@@ -3263,18 +3292,14 @@
     #[cfg(feature = "full")]
     fn print_expr_assign(e: &ExprAssign, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        print_subexpression(
-            &e.left,
-            Precedence::of(&e.left) <= Precedence::Range,
-            tokens,
-            fixup.leftmost_subexpression(),
-        );
+        let (left_prec, left_fixup) =
+            fixup.leftmost_subexpression_with_operator(&e.left, false, false, Precedence::Assign);
+        print_subexpression(&e.left, left_prec <= Precedence::Range, tokens, left_fixup);
         e.eq_token.to_tokens(tokens);
-        print_subexpression(
+        print_expr(
             &e.right,
-            fixup.trailing_precedence(&e.right) < Precedence::Assign,
             tokens,
-            fixup.subsequent_subexpression(),
+            fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign),
         );
     }
 
@@ -3300,11 +3325,12 @@
     #[cfg(feature = "full")]
     fn print_expr_await(e: &ExprAwait, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.base);
         print_subexpression(
             &e.base,
-            Precedence::of(&e.base) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.dot_token.to_tokens(tokens);
         e.await_token.to_tokens(tokens);
@@ -3320,7 +3346,9 @@
     fn print_expr_binary(e: &ExprBinary, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
 
-        let left_fixup = fixup.leftmost_subexpression_with_begin_operator(
+        let binop_prec = Precedence::of_binop(&e.op);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+            &e.left,
             #[cfg(feature = "full")]
             match &e.op {
                 BinOp::Sub(_)
@@ -3337,25 +3365,29 @@
                 BinOp::Shl(_) | BinOp::Lt(_) => true,
                 _ => false,
             },
+            #[cfg(feature = "full")]
+            binop_prec,
         );
-
-        let binop_prec = Precedence::of_binop(&e.op);
-        let left_prec = left_fixup.leading_precedence(&e.left);
-        let right_prec = fixup.trailing_precedence(&e.right);
-        let (left_needs_group, right_needs_group) = match binop_prec {
-            Precedence::Assign => (left_prec <= Precedence::Range, right_prec < binop_prec),
-            Precedence::Compare => (left_prec <= binop_prec, right_prec <= binop_prec),
-            _ => (left_prec < binop_prec, right_prec <= binop_prec),
+        let left_needs_group = match binop_prec {
+            Precedence::Assign => left_prec <= Precedence::Range,
+            Precedence::Compare => left_prec <= binop_prec,
+            _ => left_prec < binop_prec,
         };
 
+        let right_fixup = fixup.rightmost_subexpression_fixup(
+            #[cfg(feature = "full")]
+            false,
+            #[cfg(feature = "full")]
+            false,
+            #[cfg(feature = "full")]
+            binop_prec,
+        );
+        let right_needs_group = binop_prec != Precedence::Assign
+            && right_fixup.rightmost_subexpression_precedence(&e.right) <= binop_prec;
+
         print_subexpression(&e.left, left_needs_group, tokens, left_fixup);
         e.op.to_tokens(tokens);
-        print_subexpression(
-            &e.right,
-            right_needs_group,
-            tokens,
-            fixup.subsequent_subexpression(),
-        );
+        print_subexpression(&e.right, right_needs_group, tokens, right_fixup);
     }
 
     #[cfg(feature = "full")]
@@ -3391,7 +3423,7 @@
                 //                     ^---------------------------------^
                 e.label.is_none() && classify::expr_leading_label(value),
                 tokens,
-                fixup.subsequent_subexpression(),
+                fixup.rightmost_subexpression_fixup(true, true, Precedence::Jump),
             );
         }
     }
@@ -3406,17 +3438,20 @@
     fn print_expr_call(e: &ExprCall, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
 
-        let func_fixup = fixup.leftmost_subexpression_with_begin_operator(
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+            &e.func,
             #[cfg(feature = "full")]
             true,
             false,
+            #[cfg(feature = "full")]
+            Precedence::Unambiguous,
         );
         let needs_group = if let Expr::Field(func) = &*e.func {
             func.member.is_named()
         } else {
-            func_fixup.leading_precedence(&e.func) < Precedence::Unambiguous
+            left_prec < Precedence::Unambiguous
         };
-        print_subexpression(&e.func, needs_group, tokens, func_fixup);
+        print_subexpression(&e.func, needs_group, tokens, left_fixup);
 
         e.paren_token.surround(tokens, |tokens| {
             e.args.to_tokens(tokens);
@@ -3432,12 +3467,15 @@
 
     fn print_expr_cast(e: &ExprCast, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        print_subexpression(
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
             &e.expr,
-            Precedence::of(&e.expr) < Precedence::Cast,
-            tokens,
-            fixup.leftmost_subexpression(),
+            #[cfg(feature = "full")]
+            false,
+            false,
+            #[cfg(feature = "full")]
+            Precedence::Cast,
         );
+        print_subexpression(&e.expr, left_prec < Precedence::Cast, tokens, left_fixup);
         e.as_token.to_tokens(tokens);
         e.ty.to_tokens(tokens);
     }
@@ -3446,23 +3484,34 @@
     #[cfg_attr(docsrs, doc(cfg(feature = "printing")))]
     impl ToTokens for ExprClosure {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            outer_attrs_to_tokens(&self.attrs, tokens);
-            self.lifetimes.to_tokens(tokens);
-            self.constness.to_tokens(tokens);
-            self.movability.to_tokens(tokens);
-            self.asyncness.to_tokens(tokens);
-            self.capture.to_tokens(tokens);
-            self.or1_token.to_tokens(tokens);
-            self.inputs.to_tokens(tokens);
-            self.or2_token.to_tokens(tokens);
-            self.output.to_tokens(tokens);
-            if matches!(self.output, ReturnType::Default) || matches!(*self.body, Expr::Block(_)) {
-                self.body.to_tokens(tokens);
-            } else {
-                token::Brace::default().surround(tokens, |tokens| {
-                    print_expr(&self.body, tokens, FixupContext::new_stmt());
-                });
-            }
+            print_expr_closure(self, tokens, FixupContext::NONE);
+        }
+    }
+
+    #[cfg(feature = "full")]
+    fn print_expr_closure(e: &ExprClosure, tokens: &mut TokenStream, fixup: FixupContext) {
+        outer_attrs_to_tokens(&e.attrs, tokens);
+        e.lifetimes.to_tokens(tokens);
+        e.constness.to_tokens(tokens);
+        e.movability.to_tokens(tokens);
+        e.asyncness.to_tokens(tokens);
+        e.capture.to_tokens(tokens);
+        e.or1_token.to_tokens(tokens);
+        e.inputs.to_tokens(tokens);
+        e.or2_token.to_tokens(tokens);
+        e.output.to_tokens(tokens);
+        if matches!(e.output, ReturnType::Default)
+            || matches!(&*e.body, Expr::Block(body) if body.attrs.is_empty() && body.label.is_none())
+        {
+            print_expr(
+                &e.body,
+                tokens,
+                fixup.rightmost_subexpression_fixup(false, false, Precedence::Jump),
+            );
+        } else {
+            token::Brace::default().surround(tokens, |tokens| {
+                print_expr(&e.body, tokens, FixupContext::new_stmt());
+            });
         }
     }
 
@@ -3498,11 +3547,12 @@
 
     fn print_expr_field(e: &ExprField, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.base);
         print_subexpression(
             &e.base,
-            Precedence::of(&e.base) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.dot_token.to_tokens(tokens);
         e.member.to_tokens(tokens);
@@ -3517,7 +3567,7 @@
             self.for_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
             self.in_token.to_tokens(tokens);
-            print_condition(&self.expr, tokens);
+            print_expr(&self.expr, tokens, FixupContext::new_condition());
             self.body.brace_token.surround(tokens, |tokens| {
                 inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
@@ -3544,7 +3594,7 @@
             let mut expr = self;
             loop {
                 expr.if_token.to_tokens(tokens);
-                print_condition(&expr.cond, tokens);
+                print_expr(&expr.cond, tokens, FixupContext::new_condition());
                 expr.then_branch.to_tokens(tokens);
 
                 let (else_token, else_) = match &expr.else_branch {
@@ -3583,16 +3633,19 @@
 
     fn print_expr_index(e: &ExprIndex, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        let obj_fixup = fixup.leftmost_subexpression_with_begin_operator(
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+            &e.expr,
             #[cfg(feature = "full")]
             true,
             false,
+            #[cfg(feature = "full")]
+            Precedence::Unambiguous,
         );
         print_subexpression(
             &e.expr,
-            obj_fixup.leading_precedence(&e.expr) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            obj_fixup,
+            left_fixup,
         );
         e.bracket_token.surround(tokens, |tokens| {
             e.index.to_tokens(tokens);
@@ -3622,12 +3675,8 @@
         e.let_token.to_tokens(tokens);
         e.pat.to_tokens(tokens);
         e.eq_token.to_tokens(tokens);
-        print_subexpression(
-            &e.expr,
-            fixup.needs_group_as_let_scrutinee(&e.expr),
-            tokens,
-            FixupContext::NONE,
-        );
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(&e.expr, Precedence::Let);
+        print_subexpression(&e.expr, right_prec < Precedence::Let, tokens, right_fixup);
     }
 
     #[cfg_attr(docsrs, doc(cfg(feature = "printing")))]
@@ -3666,7 +3715,7 @@
         fn to_tokens(&self, tokens: &mut TokenStream) {
             outer_attrs_to_tokens(&self.attrs, tokens);
             self.match_token.to_tokens(tokens);
-            print_condition(&self.expr, tokens);
+            print_expr(&self.expr, tokens, FixupContext::new_condition());
             self.brace_token.surround(tokens, |tokens| {
                 inner_attrs_to_tokens(&self.attrs, tokens);
                 for (i, arm) in self.arms.iter().enumerate() {
@@ -3694,11 +3743,12 @@
 
     fn print_expr_method_call(e: &ExprMethodCall, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.receiver);
         print_subexpression(
             &e.receiver,
-            Precedence::of(&e.receiver) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.dot_token.to_tokens(tokens);
         e.method.to_tokens(tokens);
@@ -3744,21 +3794,15 @@
     fn print_expr_range(e: &ExprRange, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
         if let Some(start) = &e.start {
-            print_subexpression(
-                start,
-                Precedence::of(start) <= Precedence::Range,
-                tokens,
-                fixup.leftmost_subexpression(),
-            );
+            let (left_prec, left_fixup) =
+                fixup.leftmost_subexpression_with_operator(start, true, false, Precedence::Range);
+            print_subexpression(start, left_prec <= Precedence::Range, tokens, left_fixup);
         }
         e.limits.to_tokens(tokens);
         if let Some(end) = &e.end {
-            print_subexpression(
-                end,
-                fixup.trailing_precedence(end) <= Precedence::Range,
-                tokens,
-                fixup.subsequent_subexpression(),
-            );
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, true, Precedence::Range);
+            let right_prec = right_fixup.rightmost_subexpression_precedence(end);
+            print_subexpression(end, right_prec <= Precedence::Range, tokens, right_fixup);
         }
     }
 
@@ -3776,11 +3820,12 @@
         e.and_token.to_tokens(tokens);
         e.raw.to_tokens(tokens);
         e.mutability.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(&e.expr, Precedence::Prefix);
         print_subexpression(
             &e.expr,
-            fixup.trailing_precedence(&e.expr) < Precedence::Prefix,
+            right_prec < Precedence::Prefix,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3795,11 +3840,16 @@
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.and_token.to_tokens(tokens);
         e.mutability.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(
+            &e.expr,
+            #[cfg(feature = "full")]
+            Precedence::Prefix,
+        );
         print_subexpression(
             &e.expr,
-            fixup.trailing_precedence(&e.expr) < Precedence::Prefix,
+            right_prec < Precedence::Prefix,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3829,7 +3879,11 @@
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.return_token.to_tokens(tokens);
         if let Some(expr) = &e.expr {
-            print_expr(expr, tokens, fixup.subsequent_subexpression());
+            print_expr(
+                expr,
+                tokens,
+                fixup.rightmost_subexpression_fixup(true, false, Precedence::Jump),
+            );
         }
     }
 
@@ -3861,11 +3915,12 @@
     #[cfg(feature = "full")]
     fn print_expr_try(e: &ExprTry, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
+        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_dot(&e.expr);
         print_subexpression(
             &e.expr,
-            Precedence::of(&e.expr) < Precedence::Unambiguous,
+            left_prec < Precedence::Unambiguous,
             tokens,
-            fixup.leftmost_subexpression_with_dot(),
+            left_fixup,
         );
         e.question_token.to_tokens(tokens);
     }
@@ -3905,11 +3960,16 @@
     fn print_expr_unary(e: &ExprUnary, tokens: &mut TokenStream, fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.op.to_tokens(tokens);
+        let (right_prec, right_fixup) = fixup.rightmost_subexpression(
+            &e.expr,
+            #[cfg(feature = "full")]
+            Precedence::Prefix,
+        );
         print_subexpression(
             &e.expr,
-            fixup.trailing_precedence(&e.expr) < Precedence::Prefix,
+            right_prec < Precedence::Prefix,
             tokens,
-            fixup.subsequent_subexpression(),
+            right_fixup,
         );
     }
 
@@ -3933,7 +3993,7 @@
             outer_attrs_to_tokens(&self.attrs, tokens);
             self.label.to_tokens(tokens);
             self.while_token.to_tokens(tokens);
-            print_condition(&self.cond, tokens);
+            print_expr(&self.cond, tokens, FixupContext::new_condition());
             self.body.brace_token.surround(tokens, |tokens| {
                 inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
@@ -3954,7 +4014,11 @@
         outer_attrs_to_tokens(&e.attrs, tokens);
         e.yield_token.to_tokens(tokens);
         if let Some(expr) = &e.expr {
-            print_expr(expr, tokens, fixup.subsequent_subexpression());
+            print_expr(
+                expr,
+                tokens,
+                fixup.rightmost_subexpression_fixup(true, false, Precedence::Jump),
+            );
         }
     }
 
diff --git a/crates/syn/src/fixup.rs b/crates/syn/src/fixup.rs
index 58ed9e7..b0973df 100644
--- a/crates/syn/src/fixup.rs
+++ b/crates/syn/src/fixup.rs
@@ -1,8 +1,19 @@
 use crate::classify;
 use crate::expr::Expr;
+#[cfg(feature = "full")]
+use crate::expr::{
+    ExprBreak, ExprRange, ExprRawAddr, ExprReference, ExprReturn, ExprUnary, ExprYield,
+};
 use crate::precedence::Precedence;
+#[cfg(feature = "full")]
+use crate::ty::ReturnType;
 
 pub(crate) struct FixupContext {
+    #[cfg(feature = "full")]
+    previous_operator: Precedence,
+    #[cfg(feature = "full")]
+    next_operator: Precedence,
+
     // Print expression such that it can be parsed back as a statement
     // consisting of the original expression.
     //
@@ -89,16 +100,25 @@
     //     }
     //
     #[cfg(feature = "full")]
-    parenthesize_exterior_struct_lit: bool,
+    condition: bool,
 
     // This is the difference between:
     //
-    //     let _ = 1 + return 1;  // no parens if rightmost subexpression
+    //     if break Struct {} == (break) {}  // needs parens
     //
-    //     let _ = 1 + (return 1) + 1;  // needs parens
+    //     if break break == Struct {} {}  // no parens
     //
     #[cfg(feature = "full")]
-    parenthesize_exterior_jump: bool,
+    rightmost_subexpression_in_condition: bool,
+
+    // This is the difference between:
+    //
+    //     if break ({ x }).field + 1 {}  needs parens
+    //
+    //     if break 1 + { x }.field {}  // no parens
+    //
+    #[cfg(feature = "full")]
+    leftmost_subexpression_in_optional_operand: bool,
 
     // This is the difference between:
     //
@@ -111,6 +131,15 @@
 
     // This is the difference between:
     //
+    //     let _ = 1 + return 1;  // no parens if rightmost subexpression
+    //
+    //     let _ = 1 + (return 1) + 1;  // needs parens
+    //
+    #[cfg(feature = "full")]
+    next_operator_can_continue_expr: bool,
+
+    // This is the difference between:
+    //
     //     let _ = x as u8 + T;
     //
     //     let _ = (x as u8) < T;
@@ -124,6 +153,10 @@
     /// on in a targeted fashion where needed.
     pub const NONE: Self = FixupContext {
         #[cfg(feature = "full")]
+        previous_operator: Precedence::MIN,
+        #[cfg(feature = "full")]
+        next_operator: Precedence::MIN,
+        #[cfg(feature = "full")]
         stmt: false,
         #[cfg(feature = "full")]
         leftmost_subexpression_in_stmt: false,
@@ -132,11 +165,15 @@
         #[cfg(feature = "full")]
         leftmost_subexpression_in_match_arm: false,
         #[cfg(feature = "full")]
-        parenthesize_exterior_struct_lit: false,
+        condition: false,
         #[cfg(feature = "full")]
-        parenthesize_exterior_jump: false,
+        rightmost_subexpression_in_condition: false,
+        #[cfg(feature = "full")]
+        leftmost_subexpression_in_optional_operand: false,
         #[cfg(feature = "full")]
         next_operator_can_begin_expr: false,
+        #[cfg(feature = "full")]
+        next_operator_can_continue_expr: false,
         next_operator_can_begin_generics: false,
     };
 
@@ -167,7 +204,8 @@
     #[cfg(feature = "full")]
     pub fn new_condition() -> Self {
         FixupContext {
-            parenthesize_exterior_struct_lit: true,
+            condition: true,
+            rightmost_subexpression_in_condition: true,
             ..FixupContext::NONE
         }
     }
@@ -183,8 +221,16 @@
     ///
     /// Not every expression has a leftmost subexpression. For example neither
     /// `-$a` nor `[$a]` have one.
-    pub fn leftmost_subexpression(self) -> Self {
-        FixupContext {
+    pub fn leftmost_subexpression_with_operator(
+        self,
+        expr: &Expr,
+        #[cfg(feature = "full")] next_operator_can_begin_expr: bool,
+        next_operator_can_begin_generics: bool,
+        #[cfg(feature = "full")] precedence: Precedence,
+    ) -> (Precedence, Self) {
+        let fixup = FixupContext {
+            #[cfg(feature = "full")]
+            next_operator: precedence,
             #[cfg(feature = "full")]
             stmt: false,
             #[cfg(feature = "full")]
@@ -195,17 +241,26 @@
             leftmost_subexpression_in_match_arm: self.match_arm
                 || self.leftmost_subexpression_in_match_arm,
             #[cfg(feature = "full")]
-            parenthesize_exterior_jump: true,
+            rightmost_subexpression_in_condition: false,
+            #[cfg(feature = "full")]
+            next_operator_can_begin_expr,
+            #[cfg(feature = "full")]
+            next_operator_can_continue_expr: true,
+            next_operator_can_begin_generics,
             ..self
-        }
+        };
+
+        (fixup.leftmost_subexpression_precedence(expr), fixup)
     }
 
     /// Transform this fixup into the one that should apply when printing a
     /// leftmost subexpression followed by a `.` or `?` token, which confer
     /// different statement boundary rules compared to other leftmost
     /// subexpressions.
-    pub fn leftmost_subexpression_with_dot(self) -> Self {
-        FixupContext {
+    pub fn leftmost_subexpression_with_dot(self, expr: &Expr) -> (Precedence, Self) {
+        let fixup = FixupContext {
+            #[cfg(feature = "full")]
+            next_operator: Precedence::Unambiguous,
             #[cfg(feature = "full")]
             stmt: self.stmt || self.leftmost_subexpression_in_stmt,
             #[cfg(feature = "full")]
@@ -215,37 +270,67 @@
             #[cfg(feature = "full")]
             leftmost_subexpression_in_match_arm: false,
             #[cfg(feature = "full")]
-            parenthesize_exterior_jump: true,
+            rightmost_subexpression_in_condition: false,
+            #[cfg(feature = "full")]
+            next_operator_can_begin_expr: false,
+            #[cfg(feature = "full")]
+            next_operator_can_continue_expr: true,
+            next_operator_can_begin_generics: false,
             ..self
-        }
+        };
+
+        (fixup.leftmost_subexpression_precedence(expr), fixup)
     }
 
-    /// Transform this fixup into the one that should apply when printing a
-    /// leftmost subexpression followed by punctuation that is legal as the
-    /// first token of an expression.
-    pub fn leftmost_subexpression_with_begin_operator(
+    fn leftmost_subexpression_precedence(self, expr: &Expr) -> Precedence {
+        #[cfg(feature = "full")]
+        if !self.next_operator_can_begin_expr || self.next_operator == Precedence::Range {
+            if let Scan::Bailout = scan_right(expr, self, Precedence::MIN, 0, 0) {
+                if scan_left(expr, self) {
+                    return Precedence::Unambiguous;
+                }
+            }
+        }
+
+        self.precedence(expr)
+    }
+
+    /// Transform this fixup into the one that should apply when printing the
+    /// rightmost subexpression of the current expression.
+    ///
+    /// The rightmost subexpression is any subexpression that has a different
+    /// first token than the current expression, but has the same last token.
+    ///
+    /// For example in `$a + $b` and `-$b`, the subexpression `$b` is a
+    /// rightmost subexpression.
+    ///
+    /// Not every expression has a rightmost subexpression. For example neither
+    /// `[$b]` nor `$a.f($b)` have one.
+    pub fn rightmost_subexpression(
         self,
-        #[cfg(feature = "full")] next_operator_can_begin_expr: bool,
-        next_operator_can_begin_generics: bool,
+        expr: &Expr,
+        #[cfg(feature = "full")] precedence: Precedence,
+    ) -> (Precedence, Self) {
+        let fixup = self.rightmost_subexpression_fixup(
+            #[cfg(feature = "full")]
+            false,
+            #[cfg(feature = "full")]
+            false,
+            #[cfg(feature = "full")]
+            precedence,
+        );
+        (fixup.rightmost_subexpression_precedence(expr), fixup)
+    }
+
+    pub fn rightmost_subexpression_fixup(
+        self,
+        #[cfg(feature = "full")] reset_allow_struct: bool,
+        #[cfg(feature = "full")] optional_operand: bool,
+        #[cfg(feature = "full")] precedence: Precedence,
     ) -> Self {
         FixupContext {
             #[cfg(feature = "full")]
-            next_operator_can_begin_expr,
-            next_operator_can_begin_generics,
-            ..self.leftmost_subexpression()
-        }
-    }
-
-    /// Transform this fixup into the one that should apply when printing any
-    /// subexpression that is neither a leftmost subexpression nor surrounded in
-    /// delimiters.
-    ///
-    /// This is for any subexpression that has a different first token than the
-    /// current expression, and is not surrounded by a paren/bracket/brace. For
-    /// example the `$b` in `$a + $b` and `-$b`, but not the one in `[$b]` or
-    /// `$a.f($b)`.
-    pub fn subsequent_subexpression(self) -> Self {
-        FixupContext {
+            previous_operator: precedence,
             #[cfg(feature = "full")]
             stmt: false,
             #[cfg(feature = "full")]
@@ -254,61 +339,83 @@
             match_arm: false,
             #[cfg(feature = "full")]
             leftmost_subexpression_in_match_arm: false,
+            #[cfg(feature = "full")]
+            condition: self.condition && !reset_allow_struct,
+            #[cfg(feature = "full")]
+            leftmost_subexpression_in_optional_operand: self.condition && optional_operand,
             ..self
         }
     }
 
+    pub fn rightmost_subexpression_precedence(self, expr: &Expr) -> Precedence {
+        let default_prec = self.precedence(expr);
+
+        #[cfg(feature = "full")]
+        if match self.previous_operator {
+            Precedence::Assign | Precedence::Let | Precedence::Prefix => {
+                default_prec < self.previous_operator
+            }
+            _ => default_prec <= self.previous_operator,
+        } && match self.next_operator {
+            Precedence::Range | Precedence::Or | Precedence::And => true,
+            _ => !self.next_operator_can_begin_expr,
+        } {
+            if let Scan::Bailout | Scan::Fail = scan_right(expr, self, self.previous_operator, 1, 0)
+            {
+                if scan_left(expr, self) {
+                    return Precedence::Prefix;
+                }
+            }
+        }
+
+        default_prec
+    }
+
     /// Determine whether parentheses are needed around the given expression to
-    /// head off an unintended statement boundary.
-    ///
-    /// The documentation on `FixupContext::leftmost_subexpression_in_stmt` has
-    /// examples.
+    /// head off the early termination of a statement or condition.
     #[cfg(feature = "full")]
-    pub fn would_cause_statement_boundary(self, expr: &Expr) -> bool {
+    pub fn parenthesize(self, expr: &Expr) -> bool {
         (self.leftmost_subexpression_in_stmt && !classify::requires_semi_to_be_stmt(expr))
             || ((self.stmt || self.leftmost_subexpression_in_stmt) && matches!(expr, Expr::Let(_)))
             || (self.leftmost_subexpression_in_match_arm
                 && !classify::requires_comma_to_be_match_arm(expr))
+            || (self.condition && matches!(expr, Expr::Struct(_)))
+            || (self.rightmost_subexpression_in_condition
+                && matches!(
+                    expr,
+                    Expr::Return(ExprReturn { expr: None, .. })
+                        | Expr::Yield(ExprYield { expr: None, .. })
+                ))
+            || (self.rightmost_subexpression_in_condition
+                && !self.condition
+                && matches!(
+                    expr,
+                    Expr::Break(ExprBreak { expr: None, .. })
+                        | Expr::Path(_)
+                        | Expr::Range(ExprRange { end: None, .. })
+                ))
+            || (self.leftmost_subexpression_in_optional_operand
+                && matches!(expr, Expr::Block(expr) if expr.attrs.is_empty() && expr.label.is_none()))
     }
 
-    /// Determine whether parentheses are needed around the given `let`
-    /// scrutinee.
-    ///
-    /// In `if let _ = $e {}`, some examples of `$e` that would need parentheses
-    /// are:
-    ///
-    ///   - `Struct {}.f()`, because otherwise the `{` would be misinterpreted
-    ///     as the opening of the if's then-block.
-    ///
-    ///   - `true && false`, because otherwise this would be misinterpreted as a
-    ///     "let chain".
-    #[cfg(feature = "full")]
-    pub fn needs_group_as_let_scrutinee(self, expr: &Expr) -> bool {
-        self.parenthesize_exterior_struct_lit && classify::confusable_with_adjacent_block(expr)
-            || self.trailing_precedence(expr) < Precedence::Let
-    }
-
-    /// Determines the effective precedence of a left subexpression. Some
-    /// expressions have lower precedence when adjacent to particular operators.
-    pub fn leading_precedence(self, expr: &Expr) -> Precedence {
+    /// Determines the effective precedence of a subexpression. Some expressions
+    /// have higher or lower precedence when adjacent to particular operators.
+    fn precedence(self, expr: &Expr) -> Precedence {
         #[cfg(feature = "full")]
         if self.next_operator_can_begin_expr {
             // Decrease precedence of value-less jumps when followed by an
             // operator that would otherwise get interpreted as beginning a
             // value for the jump.
-            if let Expr::Break(_) | Expr::Return(_) | Expr::Yield(_) = expr {
+            if let Expr::Break(ExprBreak { expr: None, .. })
+            | Expr::Return(ExprReturn { expr: None, .. })
+            | Expr::Yield(ExprYield { expr: None, .. }) = expr
+            {
                 return Precedence::Jump;
             }
         }
-        self.precedence(expr)
-    }
 
-    /// Determines the effective precedence of a right subexpression. Some
-    /// expressions have higher precedence on the right side of a binary
-    /// operator than on the left.
-    pub fn trailing_precedence(self, expr: &Expr) -> Precedence {
         #[cfg(feature = "full")]
-        if !self.parenthesize_exterior_jump {
+        if !self.next_operator_can_continue_expr {
             match expr {
                 // Increase precedence of expressions that extend to the end of
                 // current statement or group.
@@ -323,10 +430,7 @@
                 _ => {}
             }
         }
-        self.precedence(expr)
-    }
 
-    fn precedence(self, expr: &Expr) -> Precedence {
         if self.next_operator_can_begin_generics {
             if let Expr::Cast(cast) = expr {
                 if classify::trailing_unparameterized_path(&cast.ty) {
@@ -334,6 +438,7 @@
                 }
             }
         }
+
         Precedence::of(expr)
     }
 }
@@ -345,3 +450,321 @@
         *self
     }
 }
+
+#[cfg(feature = "full")]
+enum Scan {
+    Fail,
+    Bailout,
+    Consume,
+}
+
+#[cfg(feature = "full")]
+impl Copy for Scan {}
+
+#[cfg(feature = "full")]
+impl Clone for Scan {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+#[cfg(feature = "full")]
+impl PartialEq for Scan {
+    fn eq(&self, other: &Self) -> bool {
+        *self as u8 == *other as u8
+    }
+}
+
+#[cfg(feature = "full")]
+fn scan_left(expr: &Expr, fixup: FixupContext) -> bool {
+    match expr {
+        Expr::Assign(_) => fixup.previous_operator <= Precedence::Assign,
+        Expr::Binary(e) => match Precedence::of_binop(&e.op) {
+            Precedence::Assign => fixup.previous_operator <= Precedence::Assign,
+            binop_prec => fixup.previous_operator < binop_prec,
+        },
+        Expr::Cast(_) => fixup.previous_operator < Precedence::Cast,
+        Expr::Range(e) => e.start.is_none() || fixup.previous_operator < Precedence::Assign,
+        _ => true,
+    }
+}
+
+#[cfg(feature = "full")]
+fn scan_right(
+    expr: &Expr,
+    fixup: FixupContext,
+    precedence: Precedence,
+    fail_offset: u8,
+    bailout_offset: u8,
+) -> Scan {
+    let consume_by_precedence = if match precedence {
+        Precedence::Assign | Precedence::Compare => precedence <= fixup.next_operator,
+        _ => precedence < fixup.next_operator,
+    } || fixup.next_operator == Precedence::MIN
+    {
+        Scan::Consume
+    } else {
+        Scan::Bailout
+    };
+    if fixup.parenthesize(expr) {
+        return consume_by_precedence;
+    }
+    match expr {
+        Expr::Assign(e) => {
+            if match fixup.next_operator {
+                Precedence::Unambiguous => fail_offset >= 2,
+                _ => bailout_offset >= 1,
+            } {
+                return Scan::Consume;
+            }
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign);
+            let scan = scan_right(
+                &e.right,
+                right_fixup,
+                Precedence::Assign,
+                match fixup.next_operator {
+                    Precedence::Unambiguous => fail_offset,
+                    _ => 1,
+                },
+                1,
+            );
+            if let Scan::Bailout | Scan::Consume = scan {
+                Scan::Consume
+            } else if let Precedence::Unambiguous = fixup.next_operator {
+                Scan::Fail
+            } else {
+                Scan::Bailout
+            }
+        }
+        Expr::Binary(e) => {
+            if match fixup.next_operator {
+                Precedence::Unambiguous => {
+                    fail_offset >= 2
+                        && (consume_by_precedence == Scan::Consume || bailout_offset >= 1)
+                }
+                _ => bailout_offset >= 1,
+            } {
+                return Scan::Consume;
+            }
+            let binop_prec = Precedence::of_binop(&e.op);
+            if binop_prec == Precedence::Compare && fixup.next_operator == Precedence::Compare {
+                return Scan::Consume;
+            }
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, binop_prec);
+            let scan = scan_right(
+                &e.right,
+                right_fixup,
+                binop_prec,
+                match fixup.next_operator {
+                    Precedence::Unambiguous => fail_offset,
+                    _ => 1,
+                },
+                consume_by_precedence as u8 - Scan::Bailout as u8,
+            );
+            match scan {
+                Scan::Fail => {}
+                Scan::Bailout => return consume_by_precedence,
+                Scan::Consume => return Scan::Consume,
+            }
+            let right_needs_group = binop_prec != Precedence::Assign
+                && right_fixup.rightmost_subexpression_precedence(&e.right) <= binop_prec;
+            if right_needs_group {
+                consume_by_precedence
+            } else if let (Scan::Fail, Precedence::Unambiguous) = (scan, fixup.next_operator) {
+                Scan::Fail
+            } else {
+                Scan::Bailout
+            }
+        }
+        Expr::RawAddr(ExprRawAddr { expr, .. })
+        | Expr::Reference(ExprReference { expr, .. })
+        | Expr::Unary(ExprUnary { expr, .. }) => {
+            if match fixup.next_operator {
+                Precedence::Unambiguous => {
+                    fail_offset >= 2
+                        && (consume_by_precedence == Scan::Consume || bailout_offset >= 1)
+                }
+                _ => bailout_offset >= 1,
+            } {
+                return Scan::Consume;
+            }
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, Precedence::Prefix);
+            let scan = scan_right(
+                expr,
+                right_fixup,
+                precedence,
+                match fixup.next_operator {
+                    Precedence::Unambiguous => fail_offset,
+                    _ => 1,
+                },
+                consume_by_precedence as u8 - Scan::Bailout as u8,
+            );
+            match scan {
+                Scan::Fail => {}
+                Scan::Bailout => return consume_by_precedence,
+                Scan::Consume => return Scan::Consume,
+            }
+            if right_fixup.rightmost_subexpression_precedence(expr) < Precedence::Prefix {
+                consume_by_precedence
+            } else if let (Scan::Fail, Precedence::Unambiguous) = (scan, fixup.next_operator) {
+                Scan::Fail
+            } else {
+                Scan::Bailout
+            }
+        }
+        Expr::Range(e) => match &e.end {
+            Some(end) => {
+                if fail_offset >= 2 {
+                    return Scan::Consume;
+                }
+                let right_fixup =
+                    fixup.rightmost_subexpression_fixup(false, true, Precedence::Range);
+                let scan = scan_right(
+                    end,
+                    right_fixup,
+                    Precedence::Range,
+                    fail_offset,
+                    match fixup.next_operator {
+                        Precedence::Assign | Precedence::Range => 0,
+                        _ => 1,
+                    },
+                );
+                if match (scan, fixup.next_operator) {
+                    (Scan::Fail, _) => false,
+                    (Scan::Bailout, Precedence::Assign | Precedence::Range) => false,
+                    (Scan::Bailout | Scan::Consume, _) => true,
+                } {
+                    return Scan::Consume;
+                }
+                if right_fixup.rightmost_subexpression_precedence(end) <= Precedence::Range {
+                    Scan::Consume
+                } else {
+                    Scan::Fail
+                }
+            }
+            None => {
+                if fixup.next_operator_can_begin_expr {
+                    Scan::Consume
+                } else {
+                    Scan::Fail
+                }
+            }
+        },
+        Expr::Break(e) => match &e.expr {
+            Some(value) => {
+                if bailout_offset >= 1 || e.label.is_none() && classify::expr_leading_label(value) {
+                    return Scan::Consume;
+                }
+                let right_fixup = fixup.rightmost_subexpression_fixup(true, true, Precedence::Jump);
+                match scan_right(value, right_fixup, Precedence::Jump, 1, 1) {
+                    Scan::Fail => Scan::Bailout,
+                    Scan::Bailout | Scan::Consume => Scan::Consume,
+                }
+            }
+            None => match fixup.next_operator {
+                Precedence::Assign if precedence > Precedence::Assign => Scan::Fail,
+                _ => Scan::Consume,
+            },
+        },
+        Expr::Return(ExprReturn { expr, .. }) | Expr::Yield(ExprYield { expr, .. }) => match expr {
+            Some(e) => {
+                if bailout_offset >= 1 {
+                    return Scan::Consume;
+                }
+                let right_fixup =
+                    fixup.rightmost_subexpression_fixup(true, false, Precedence::Jump);
+                match scan_right(e, right_fixup, Precedence::Jump, 1, 1) {
+                    Scan::Fail => Scan::Bailout,
+                    Scan::Bailout | Scan::Consume => Scan::Consume,
+                }
+            }
+            None => match fixup.next_operator {
+                Precedence::Assign if precedence > Precedence::Assign => Scan::Fail,
+                _ => Scan::Consume,
+            },
+        },
+        Expr::Closure(e) => {
+            if matches!(e.output, ReturnType::Default)
+                || matches!(&*e.body, Expr::Block(body) if body.attrs.is_empty() && body.label.is_none())
+            {
+                if bailout_offset >= 1 {
+                    return Scan::Consume;
+                }
+                let right_fixup =
+                    fixup.rightmost_subexpression_fixup(false, false, Precedence::Jump);
+                match scan_right(&e.body, right_fixup, Precedence::Jump, 1, 1) {
+                    Scan::Fail => Scan::Bailout,
+                    Scan::Bailout | Scan::Consume => Scan::Consume,
+                }
+            } else {
+                Scan::Consume
+            }
+        }
+        Expr::Let(e) => {
+            if bailout_offset >= 1 {
+                return Scan::Consume;
+            }
+            let right_fixup = fixup.rightmost_subexpression_fixup(false, false, Precedence::Let);
+            let scan = scan_right(
+                &e.expr,
+                right_fixup,
+                Precedence::Let,
+                1,
+                if fixup.next_operator < Precedence::Let {
+                    0
+                } else {
+                    1
+                },
+            );
+            match scan {
+                Scan::Fail | Scan::Bailout if fixup.next_operator < Precedence::Let => {
+                    return Scan::Bailout;
+                }
+                Scan::Consume => return Scan::Consume,
+                _ => {}
+            }
+            if right_fixup.rightmost_subexpression_precedence(&e.expr) < Precedence::Let {
+                Scan::Consume
+            } else if let Scan::Fail = scan {
+                Scan::Bailout
+            } else {
+                Scan::Consume
+            }
+        }
+        Expr::Array(_)
+        | Expr::Async(_)
+        | Expr::Await(_)
+        | Expr::Block(_)
+        | Expr::Call(_)
+        | Expr::Cast(_)
+        | Expr::Const(_)
+        | Expr::Continue(_)
+        | Expr::Field(_)
+        | Expr::ForLoop(_)
+        | Expr::Group(_)
+        | Expr::If(_)
+        | Expr::Index(_)
+        | Expr::Infer(_)
+        | Expr::Lit(_)
+        | Expr::Loop(_)
+        | Expr::Macro(_)
+        | Expr::Match(_)
+        | Expr::MethodCall(_)
+        | Expr::Paren(_)
+        | Expr::Path(_)
+        | Expr::Repeat(_)
+        | Expr::Struct(_)
+        | Expr::Try(_)
+        | Expr::TryBlock(_)
+        | Expr::Tuple(_)
+        | Expr::Unsafe(_)
+        | Expr::Verbatim(_)
+        | Expr::While(_) => match fixup.next_operator {
+            Precedence::Assign | Precedence::Range if precedence == Precedence::Range => Scan::Fail,
+            _ if precedence == Precedence::Let && fixup.next_operator < Precedence::Let => {
+                Scan::Fail
+            }
+            _ => consume_by_precedence,
+        },
+    }
+}
diff --git a/crates/syn/src/lib.rs b/crates/syn/src/lib.rs
index 1c16c11..96132e7 100644
--- a/crates/syn/src/lib.rs
+++ b/crates/syn/src/lib.rs
@@ -249,7 +249,7 @@
 //!   dynamic library libproc_macro from rustc toolchain.
 
 // Syn types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/syn/2.0.90")]
+#![doc(html_root_url = "https://docs.rs/syn/2.0.96")]
 #![cfg_attr(docsrs, feature(doc_cfg))]
 #![deny(unsafe_op_in_unsafe_fn)]
 #![allow(non_camel_case_types)]
@@ -267,6 +267,7 @@
     clippy::enum_glob_use,
     clippy::expl_impl_clone_on_copy,
     clippy::explicit_auto_deref,
+    clippy::fn_params_excessive_bools,
     clippy::if_not_else,
     clippy::inherent_to_string,
     clippy::into_iter_without_iter,
diff --git a/crates/syn/src/parse_quote.rs b/crates/syn/src/parse_quote.rs
index fa7ea79..2db2059 100644
--- a/crates/syn/src/parse_quote.rs
+++ b/crates/syn/src/parse_quote.rs
@@ -53,11 +53,22 @@
 ///
 /// - [`Attribute`] — parses one attribute, allowing either outer like `#[...]`
 ///   or inner like `#![...]`
+/// - [`Vec<Attribute>`] — parses multiple attributes, including mixed kinds in
+///   any order
 /// - [`Punctuated<T, P>`] — parses zero or more `T` separated by punctuation
 ///   `P` with optional trailing punctuation
+/// - [`Vec<Arm>`] — parses arms separated by optional commas according to the
+///   same grammar as the inside of a `match` expression
 /// - [`Vec<Stmt>`] — parses the same as `Block::parse_within`
+/// - [`Pat`], [`Box<Pat>`] — parses the same as
+///   `Pat::parse_multi_with_leading_vert`
+/// - [`Field`] — parses a named or unnamed struct field
 ///
+/// [`Vec<Attribute>`]: Attribute
+/// [`Vec<Arm>`]: Arm
 /// [`Vec<Stmt>`]: Block::parse_within
+/// [`Pat`]: Pat::parse_multi_with_leading_vert
+/// [`Box<Pat>`]: Pat::parse_multi_with_leading_vert
 ///
 /// # Panics
 ///
@@ -140,7 +151,7 @@
 #[cfg(any(feature = "full", feature = "derive"))]
 use crate::{attr, Attribute, Field, FieldMutability, Ident, Type, Visibility};
 #[cfg(feature = "full")]
-use crate::{Block, Pat, Stmt};
+use crate::{Arm, Block, Pat, Stmt};
 
 #[cfg(any(feature = "full", feature = "derive"))]
 impl ParseQuote for Attribute {
@@ -220,3 +231,10 @@
         Block::parse_within(input)
     }
 }
+
+#[cfg(feature = "full")]
+impl ParseQuote for Vec<Arm> {
+    fn parse(input: ParseStream) -> Result<Self> {
+        Arm::parse_multiple(input)
+    }
+}
diff --git a/crates/syn/src/path.rs b/crates/syn/src/path.rs
index ce38eff..7744d28 100644
--- a/crates/syn/src/path.rs
+++ b/crates/syn/src/path.rs
@@ -528,7 +528,10 @@
                 input.parse()?
             };
 
-            if !expr_style && input.peek(Token![<]) && !input.peek(Token![<=])
+            if !expr_style
+                && input.peek(Token![<])
+                && !input.peek(Token![<=])
+                && !input.peek(Token![<<=])
                 || input.peek(Token![::]) && input.peek3(Token![<])
             {
                 Ok(PathSegment {
diff --git a/crates/syn/src/stmt.rs b/crates/syn/src/stmt.rs
index ac8238a..6261c7b 100644
--- a/crates/syn/src/stmt.rs
+++ b/crates/syn/src/stmt.rs
@@ -208,7 +208,8 @@
                 if ahead.peek2(Ident) || ahead.peek2(Token![try]) {
                     is_item_macro = true;
                 } else if ahead.peek2(token::Brace)
-                    && !(ahead.peek3(Token![.]) || ahead.peek3(Token![?]))
+                    && !(ahead.peek3(Token![.]) && !ahead.peek3(Token![..])
+                        || ahead.peek3(Token![?]))
                 {
                     input.advance_to(&ahead);
                     return stmt_mac(input, attrs, path).map(Stmt::Macro);
@@ -452,11 +453,12 @@
             self.pat.to_tokens(tokens);
             if let Some(init) = &self.init {
                 init.eq_token.to_tokens(tokens);
-                if init.diverge.is_some() && classify::expr_trailing_brace(&init.expr) {
-                    token::Paren::default().surround(tokens, |tokens| init.expr.to_tokens(tokens));
-                } else {
-                    init.expr.to_tokens(tokens);
-                }
+                expr::printing::print_subexpression(
+                    &init.expr,
+                    init.diverge.is_some() && classify::expr_trailing_brace(&init.expr),
+                    tokens,
+                    FixupContext::NONE,
+                );
                 if let Some((else_token, diverge)) = &init.diverge {
                     else_token.to_tokens(tokens);
                     match &**diverge {
diff --git a/crates/syn/tests/common/eq.rs b/crates/syn/tests/common/eq.rs
index af1f616..6a74c02 100644
--- a/crates/syn/tests/common/eq.rs
+++ b/crates/syn/tests/common/eq.rs
@@ -15,7 +15,6 @@
 use rustc_ast::ast::AssocItemConstraintKind;
 use rustc_ast::ast::AssocItemKind;
 use rustc_ast::ast::AttrArgs;
-use rustc_ast::ast::AttrArgsEq;
 use rustc_ast::ast::AttrId;
 use rustc_ast::ast::AttrItem;
 use rustc_ast::ast::AttrKind;
@@ -150,6 +149,8 @@
 use rustc_ast::ast::TyKind;
 use rustc_ast::ast::UintTy;
 use rustc_ast::ast::UnOp;
+use rustc_ast::ast::UnsafeBinderCastKind;
+use rustc_ast::ast::UnsafeBinderTy;
 use rustc_ast::ast::UnsafeSource;
 use rustc_ast::ast::UseTree;
 use rustc_ast::ast::UseTreeKind;
@@ -309,6 +310,7 @@
     };
 }
 
+spanless_eq_partial_eq!(());
 spanless_eq_partial_eq!(bool);
 spanless_eq_partial_eq!(u8);
 spanless_eq_partial_eq!(u16);
@@ -494,14 +496,14 @@
 spanless_eq_struct!(EnumDef; variants);
 spanless_eq_struct!(Expr; id kind span attrs !tokens);
 spanless_eq_struct!(ExprField; attrs id span ident expr is_shorthand is_placeholder);
-spanless_eq_struct!(FieldDef; attrs id span vis safety ident ty is_placeholder);
+spanless_eq_struct!(FieldDef; attrs id span vis safety ident ty default is_placeholder);
 spanless_eq_struct!(Fn; defaultness generics sig body);
 spanless_eq_struct!(FnDecl; inputs output);
 spanless_eq_struct!(FnHeader; constness coroutine_kind safety ext);
 spanless_eq_struct!(FnSig; header decl span);
 spanless_eq_struct!(ForeignMod; extern_span safety abi items);
 spanless_eq_struct!(FormatArgPosition; index kind span);
-spanless_eq_struct!(FormatArgs; span template arguments);
+spanless_eq_struct!(FormatArgs; span template arguments uncooked_fmt_str);
 spanless_eq_struct!(FormatArgument; kind expr);
 spanless_eq_struct!(FormatOptions; width precision alignment fill sign alternate zero_pad debug_hex);
 spanless_eq_struct!(FormatPlaceholder; argument span format_trait format_options);
@@ -543,6 +545,7 @@
 spanless_eq_struct!(TyAlias; defaultness generics where_clauses bounds ty);
 spanless_eq_struct!(TyAliasWhereClause; !has_where_token span);
 spanless_eq_struct!(TyAliasWhereClauses; before after !split);
+spanless_eq_struct!(UnsafeBinderTy; generic_params inner_ty);
 spanless_eq_struct!(UseTree; prefix kind span);
 spanless_eq_struct!(Variant; attrs id span !vis ident data disr_expr is_placeholder);
 spanless_eq_struct!(Visibility; kind span tokens);
@@ -555,8 +558,7 @@
 spanless_eq_enum!(AsmMacro; Asm GlobalAsm NakedAsm);
 spanless_eq_enum!(AssocItemConstraintKind; Equality(term) Bound(bounds));
 spanless_eq_enum!(AssocItemKind; Const(0) Fn(0) Type(0) MacCall(0) Delegation(0) DelegationMac(0));
-spanless_eq_enum!(AttrArgs; Empty Delimited(0) Eq(0 1));
-spanless_eq_enum!(AttrArgsEq; Ast(0) Hir(0));
+spanless_eq_enum!(AttrArgs; Empty Delimited(0) Eq(eq_span expr));
 spanless_eq_enum!(AttrStyle; Outer Inner);
 spanless_eq_enum!(AttrTokenTree; Token(0 1) Delimited(0 1 2 3) AttrsTarget(0));
 spanless_eq_enum!(BinOpKind; Add Sub Mul Div Rem And Or BitXor BitAnd BitOr Shl Shr Eq Lt Le Ne Ge Gt);
@@ -601,10 +603,10 @@
 spanless_eq_enum!(MatchKind; Prefix Postfix);
 spanless_eq_enum!(MetaItemKind; Word List(0) NameValue(0));
 spanless_eq_enum!(MetaItemInner; MetaItem(0) Lit(0));
-spanless_eq_enum!(ModKind; Loaded(0 1 2) Unloaded);
+spanless_eq_enum!(ModKind; Loaded(0 1 2 3) Unloaded);
 spanless_eq_enum!(Movability; Static Movable);
 spanless_eq_enum!(Mutability; Mut Not);
-spanless_eq_enum!(PatFieldsRest; Rest None);
+spanless_eq_enum!(PatFieldsRest; Rest Recovered(0) None);
 spanless_eq_enum!(PreciseCapturingArg; Lifetime(0) Arg(0 1));
 spanless_eq_enum!(RangeEnd; Included(0) Excluded);
 spanless_eq_enum!(RangeLimits; HalfOpen Closed);
@@ -618,6 +620,7 @@
 spanless_eq_enum!(TraitObjectSyntax; Dyn DynStar None);
 spanless_eq_enum!(UintTy; Usize U8 U16 U32 U64 U128);
 spanless_eq_enum!(UnOp; Deref Not Neg);
+spanless_eq_enum!(UnsafeBinderCastKind; Wrap Unwrap);
 spanless_eq_enum!(UnsafeSource; CompilerGenerated UserProvided);
 spanless_eq_enum!(UseTreeKind; Simple(0) Nested(items span) Glob);
 spanless_eq_enum!(VariantData; Struct(fields recovered) Tuple(0 1) Unit(0));
@@ -633,7 +636,8 @@
     Assign(0 1 2) AssignOp(0 1 2) Field(0 1) Index(0 1 2) Underscore
     Range(0 1 2) Path(0 1) AddrOf(0 1 2) Break(0 1) Continue(0) Ret(0)
     InlineAsm(0) OffsetOf(0 1) MacCall(0) Struct(0) Repeat(0 1) Paren(0) Try(0)
-    Yield(0) Yeet(0) Become(0) IncludedBytes(0) FormatArgs(0) Err(0) Dummy);
+    Yield(0) Yeet(0) Become(0) IncludedBytes(0) FormatArgs(0)
+    UnsafeBinderCast(0 1 2) Err(0) Dummy);
 spanless_eq_enum!(InlineAsmOperand; In(reg expr) Out(reg late expr)
     InOut(reg late expr) SplitInOut(reg late in_expr out_expr) Const(anon_const)
     Sym(sym) Label(block));
@@ -645,10 +649,11 @@
     Int(0 1) Float(0 1) Bool(0) Err(0));
 spanless_eq_enum!(PatKind; Wild Ident(0 1 2) Struct(0 1 2 3) TupleStruct(0 1 2)
     Or(0) Path(0 1) Tuple(0) Box(0) Deref(0) Ref(0 1) Lit(0) Range(0 1 2)
-    Slice(0) Rest Never Paren(0) MacCall(0) Err(0));
+    Slice(0) Rest Never Guard(0 1) Paren(0) MacCall(0) Err(0));
 spanless_eq_enum!(TyKind; Slice(0) Array(0 1) Ptr(0) Ref(0 1) PinnedRef(0 1)
-    BareFn(0) Never Tup(0) Path(0 1) TraitObject(0 1) ImplTrait(0 1) Paren(0)
-    Typeof(0) Infer ImplicitSelf MacCall(0) CVarArgs Pat(0 1) Dummy Err(0));
+    BareFn(0) UnsafeBinder(0) Never Tup(0) Path(0 1) TraitObject(0 1)
+    ImplTrait(0 1) Paren(0) Typeof(0) Infer ImplicitSelf MacCall(0) CVarArgs
+    Pat(0 1) Dummy Err(0));
 
 impl SpanlessEq for Ident {
     fn eq(&self, other: &Self) -> bool {
@@ -717,8 +722,8 @@
 
 impl SpanlessEq for TokenStream {
     fn eq(&self, other: &Self) -> bool {
-        let mut this_trees = self.trees();
-        let mut other_trees = other.trees();
+        let mut this_trees = self.iter();
+        let mut other_trees = other.iter();
         loop {
             let this = match this_trees.next() {
                 None => return other_trees.next().is_none(),
@@ -776,7 +781,7 @@
         Some(TokenTree::Delimited(_span, _spacing, Delimiter::Bracket, stream)) => stream,
         _ => return false,
     };
-    let mut trees = stream.trees();
+    let mut trees = stream.iter();
     match trees.next() {
         Some(TokenTree::Token(
             Token {
@@ -828,16 +833,6 @@
     }
 }
 
-fn is_escaped_literal_attr_args(value: &AttrArgsEq, unescaped: Symbol) -> bool {
-    match value {
-        AttrArgsEq::Ast(expr) => match &expr.kind {
-            ExprKind::Lit(lit) => is_escaped_lit(lit, unescaped),
-            _ => false,
-        },
-        AttrArgsEq::Hir(lit) => is_escaped_literal_meta_item_lit(lit, unescaped),
-    }
-}
-
 fn is_escaped_literal_meta_item_lit(lit: &MetaItemLit, unescaped: Symbol) -> bool {
     match lit {
         MetaItemLit {
@@ -898,9 +893,10 @@
                 SpanlessEq::eq(&path, &normal2.item.path)
                     && match &normal2.item.args {
                         AttrArgs::Empty | AttrArgs::Delimited(_) => false,
-                        AttrArgs::Eq(_span, value) => {
-                            is_escaped_literal_attr_args(value, *unescaped)
-                        }
+                        AttrArgs::Eq { eq_span: _, expr } => match &expr.kind {
+                            ExprKind::Lit(lit) => is_escaped_lit(lit, *unescaped),
+                            _ => false,
+                        },
                     }
             }
             (AttrKind::Normal(_), AttrKind::DocComment(..)) => SpanlessEq::eq(other, self),
diff --git a/crates/syn/tests/common/mod.rs b/crates/syn/tests/common/mod.rs
index c85ac0b..ead830f 100644
--- a/crates/syn/tests/common/mod.rs
+++ b/crates/syn/tests/common/mod.rs
@@ -3,3 +3,4 @@
 
 pub mod eq;
 pub mod parse;
+pub mod visit;
diff --git a/crates/syn/tests/common/visit.rs b/crates/syn/tests/common/visit.rs
new file mode 100644
index 0000000..b4ae5ec
--- /dev/null
+++ b/crates/syn/tests/common/visit.rs
@@ -0,0 +1,94 @@
+use proc_macro2::{Delimiter, Group, TokenStream, TokenTree};
+use std::mem;
+use syn::visit_mut::{self, VisitMut};
+use syn::{Expr, File, Generics, LifetimeParam, MacroDelimiter, Stmt, StmtMacro, TypeParam};
+
+pub struct FlattenParens;
+
+impl FlattenParens {
+    pub fn visit_token_stream_mut(tokens: &mut TokenStream) {
+        *tokens = mem::take(tokens)
+            .into_iter()
+            .flat_map(|tt| {
+                if let TokenTree::Group(group) = tt {
+                    let delimiter = group.delimiter();
+                    let mut content = group.stream();
+                    Self::visit_token_stream_mut(&mut content);
+                    if let Delimiter::Parenthesis = delimiter {
+                        content
+                    } else {
+                        TokenStream::from(TokenTree::Group(Group::new(delimiter, content)))
+                    }
+                } else {
+                    TokenStream::from(tt)
+                }
+            })
+            .collect();
+    }
+}
+
+impl VisitMut for FlattenParens {
+    fn visit_expr_mut(&mut self, e: &mut Expr) {
+        while let Expr::Paren(paren) = e {
+            *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
+        }
+        visit_mut::visit_expr_mut(self, e);
+    }
+}
+
+pub struct AsIfPrinted;
+
+impl VisitMut for AsIfPrinted {
+    fn visit_file_mut(&mut self, file: &mut File) {
+        file.shebang = None;
+        visit_mut::visit_file_mut(self, file);
+    }
+
+    fn visit_generics_mut(&mut self, generics: &mut Generics) {
+        if generics.params.is_empty() {
+            generics.lt_token = None;
+            generics.gt_token = None;
+        }
+        if let Some(where_clause) = &generics.where_clause {
+            if where_clause.predicates.is_empty() {
+                generics.where_clause = None;
+            }
+        }
+        visit_mut::visit_generics_mut(self, generics);
+    }
+
+    fn visit_lifetime_param_mut(&mut self, param: &mut LifetimeParam) {
+        if param.bounds.is_empty() {
+            param.colon_token = None;
+        }
+        visit_mut::visit_lifetime_param_mut(self, param);
+    }
+
+    fn visit_stmt_mut(&mut self, stmt: &mut Stmt) {
+        if let Stmt::Expr(expr, semi) = stmt {
+            if let Expr::Macro(e) = expr {
+                if match e.mac.delimiter {
+                    MacroDelimiter::Brace(_) => true,
+                    MacroDelimiter::Paren(_) | MacroDelimiter::Bracket(_) => semi.is_some(),
+                } {
+                    let Expr::Macro(expr) = mem::replace(expr, Expr::PLACEHOLDER) else {
+                        unreachable!();
+                    };
+                    *stmt = Stmt::Macro(StmtMacro {
+                        attrs: expr.attrs,
+                        mac: expr.mac,
+                        semi_token: *semi,
+                    });
+                }
+            }
+        }
+        visit_mut::visit_stmt_mut(self, stmt);
+    }
+
+    fn visit_type_param_mut(&mut self, param: &mut TypeParam) {
+        if param.bounds.is_empty() {
+            param.colon_token = None;
+        }
+        visit_mut::visit_type_param_mut(self, param);
+    }
+}
diff --git a/crates/syn/tests/repo/mod.rs b/crates/syn/tests/repo/mod.rs
index 96f039c..81b29e2 100644
--- a/crates/syn/tests/repo/mod.rs
+++ b/crates/syn/tests/repo/mod.rs
@@ -15,7 +15,7 @@
 use tar::Archive;
 use walkdir::{DirEntry, WalkDir};
 
-const REVISION: &str = "86d69c705a552236a622eee3fdea94bf13c5f102";
+const REVISION: &str = "0aeaa5eb22180fdf12a8489e63c4daa18da6f236";
 
 #[rustfmt::skip]
 static EXCLUDE_FILES: &[&str] = &[
@@ -29,11 +29,32 @@
     "tests/rustdoc/inline_cross/auxiliary/non_lifetime_binders.rs",
     "tests/rustdoc/non_lifetime_binders.rs",
 
+    // TODO: unsafe binders: `unsafe<'a> &'a T`
+    // https://github.com/dtolnay/syn/issues/1791
+    "src/tools/rustfmt/tests/source/unsafe-binders.rs",
+    "src/tools/rustfmt/tests/target/unsafe-binders.rs",
+
+    // TODO: unsafe fields: `struct S { unsafe field: T }`
+    // https://github.com/dtolnay/syn/issues/1792
+    "src/tools/rustfmt/tests/source/unsafe-field.rs",
+    "src/tools/rustfmt/tests/target/unsafe-field.rs",
+    "tests/ui/unsafe-fields/auxiliary/unsafe-fields-crate-dep.rs",
+
+    // TODO: guard patterns: `match expr { (A if f()) | (B if g()) => {} }`
+    // https://github.com/dtolnay/syn/issues/1793
+    "src/tools/rustfmt/tests/target/guard_patterns.rs",
+
+    // TODO: struct field default: `struct S { field: i32 = 1 }`
+    // https://github.com/dtolnay/syn/issues/1774
+    "tests/ui/structs/auxiliary/struct_field_default.rs",
+    "tests/ui/structs/default-field-values-support.rs",
+
     // TODO: return type notation: `where T: Trait<method(): Send>` and `where T::method(..): Send`
     // https://github.com/dtolnay/syn/issues/1434
-    "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/return_type_syntax_assoc_type_bound.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/return_type_syntax_in_path.rs",
     "src/tools/rustfmt/tests/target/return-type-notation.rs",
+    "tests/ui/associated-type-bounds/all-generics-lookup.rs",
+    "tests/ui/associated-type-bounds/implied-from-self-where-clause.rs",
     "tests/ui/associated-type-bounds/return-type-notation/basic.rs",
     "tests/ui/associated-type-bounds/return-type-notation/higher-ranked-bound-works.rs",
     "tests/ui/associated-type-bounds/return-type-notation/namespace-conflict.rs",
@@ -169,6 +190,15 @@
     // https://github.com/dtolnay/syn/issues/1632
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/const_trait_bound.rs",
     "tests/ui/generic-const-items/const-trait-impl.rs",
+    "tests/ui/traits/const-traits/const-bound-in-host.rs",
+    "tests/ui/traits/const-traits/const-drop.rs",
+    "tests/ui/traits/const-traits/const-impl-trait.rs",
+    "tests/ui/traits/const-traits/const-in-closure.rs",
+    "tests/ui/traits/const-traits/dont-ice-on-const-pred-for-bounds.rs",
+    "tests/ui/traits/const-traits/effects/auxiliary/minicore.rs",
+    "tests/ui/traits/const-traits/effects/dont-prefer-param-env-for-infer-self-ty.rs",
+    "tests/ui/traits/const-traits/effects/minicore-const-fn-early-bound.rs",
+    "tests/ui/traits/const-traits/predicate-entailment-passes.rs",
     "tests/ui/traits/const-traits/tilde-const-syntax.rs",
 
     // TODO: unparenthesized half-open range pattern inside slice pattern: `[1..]`
@@ -180,7 +210,7 @@
     // https://github.com/dtolnay/syn/issues/1770
     "src/tools/rustfmt/tests/source/pin_sugar.rs",
     "src/tools/rustfmt/tests/target/pin_sugar.rs",
-    "tests/ui/async-await/pin-sugar.rs",
+    "tests/ui/async-await/pin-ergonomics/sugar.rs",
 
     // TODO: `|| .. .method()`
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/closure_range_method_call.rs",
@@ -231,10 +261,8 @@
     "tests/rustdoc/generic-associated-types/gats.rs",
 
     // Deprecated trait object syntax with parenthesized generic arguments and no dyn keyword
-    "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/bare_dyn_types_with_paren_as_generic_args.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/path_fn_trait_args.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/typepathfn_with_coloncolon.rs",
-    "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/value_parameters_no_patterns.rs",
     "src/tools/rustfmt/tests/source/attrib.rs",
     "src/tools/rustfmt/tests/source/closure.rs",
     "src/tools/rustfmt/tests/source/existential_type.rs",
@@ -268,7 +296,10 @@
     "tests/ui/parser/bounds-obj-parens.rs",
 
     // Various extensions to Rust syntax made up by rust-analyzer
+    "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/assoc_type_bound.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/const_param_default_path.rs",
+    "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/field_expr.rs",
+    "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/generic_arg_bounds.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/use_tree_abs_star.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/ok/0015_use_tree.rs",
     "src/tools/rust-analyzer/crates/parser/test_data/parser/ok/0029_range_forms.rs",
@@ -305,6 +336,7 @@
     "tests/ui/dyn-keyword/dyn-2015-no-warnings-without-lints.rs",
     "tests/ui/editions/edition-keywords-2015-2015.rs",
     "tests/ui/editions/edition-keywords-2015-2018.rs",
+    "tests/ui/lint/keyword-idents/auxiliary/multi_file_submod.rs",
     "tests/ui/lint/lint_pre_expansion_extern_module_aux.rs",
     "tests/ui/macros/macro-comma-support-rpass.rs",
     "tests/ui/macros/try-macro.rs",
diff --git a/crates/syn/tests/test_expr.rs b/crates/syn/tests/test_expr.rs
index 03ebd1d..67d5f0d 100644
--- a/crates/syn/tests/test_expr.rs
+++ b/crates/syn/tests/test_expr.rs
@@ -1,18 +1,36 @@
+#![cfg(not(miri))]
+#![recursion_limit = "1024"]
+#![feature(rustc_private)]
 #![allow(
+    clippy::match_like_matches_macro,
     clippy::needless_lifetimes,
     clippy::single_element_loop,
-    clippy::uninlined_format_args
+    clippy::too_many_lines,
+    clippy::uninlined_format_args,
+    clippy::unreadable_literal
 )]
 
 #[macro_use]
 mod macros;
 
-use proc_macro2::{Delimiter, Group};
+mod common;
+
+use crate::common::visit::{AsIfPrinted, FlattenParens};
+use proc_macro2::{Delimiter, Group, Ident, Span, TokenStream};
 use quote::{quote, ToTokens as _};
-use std::mem;
+use std::process::ExitCode;
 use syn::punctuated::Punctuated;
-use syn::visit_mut::{self, VisitMut};
-use syn::{parse_quote, token, Expr, ExprRange, ExprTuple, Stmt, Token};
+use syn::visit_mut::VisitMut as _;
+use syn::{
+    parse_quote, token, AngleBracketedGenericArguments, Arm, BinOp, Block, Expr, ExprArray,
+    ExprAssign, ExprAsync, ExprAwait, ExprBinary, ExprBlock, ExprBreak, ExprCall, ExprCast,
+    ExprClosure, ExprConst, ExprContinue, ExprField, ExprForLoop, ExprIf, ExprIndex, ExprLet,
+    ExprLit, ExprLoop, ExprMacro, ExprMatch, ExprMethodCall, ExprPath, ExprRange, ExprRawAddr,
+    ExprReference, ExprReturn, ExprStruct, ExprTry, ExprTryBlock, ExprTuple, ExprUnary, ExprUnsafe,
+    ExprWhile, ExprYield, GenericArgument, Label, Lifetime, Lit, LitInt, Macro, MacroDelimiter,
+    Member, Pat, PatWild, Path, PathArguments, PathSegment, PointerMutability, QSelf, RangeLimits,
+    ReturnType, Stmt, Token, Type, TypePath, UnOp,
+};
 
 #[test]
 fn test_expr_parse() {
@@ -385,6 +403,19 @@
     }
     "#);
 
+    snapshot!("() = .. + ()" as Expr, @r"
+    Expr::Binary {
+        left: Expr::Assign {
+            left: Expr::Tuple,
+            right: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+        op: BinOp::Add,
+        right: Expr::Tuple,
+    }
+    ");
+
     // A range with a lower bound cannot be the upper bound of another range,
     // and a range with an upper bound cannot be the lower bound of another
     // range.
@@ -393,6 +424,100 @@
 }
 
 #[test]
+fn test_ranges_bailout() {
+    syn::parse_str::<Expr>(".. ?").unwrap_err();
+    syn::parse_str::<Expr>(".. .field").unwrap_err();
+
+    snapshot!("return .. ?" as Expr, @r"
+    Expr::Try {
+        expr: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+    }
+    ");
+
+    snapshot!("break .. ?" as Expr, @r"
+    Expr::Try {
+        expr: Expr::Break {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+    }
+    ");
+
+    snapshot!("|| .. ?" as Expr, @r"
+    Expr::Try {
+        expr: Expr::Closure {
+            output: ReturnType::Default,
+            body: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+    }
+    ");
+
+    snapshot!("return .. .field" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        member: Member::Named("field"),
+    }
+    "#);
+
+    snapshot!("break .. .field" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Break {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        member: Member::Named("field"),
+    }
+    "#);
+
+    snapshot!("|| .. .field" as Expr, @r#"
+    Expr::Field {
+        base: Expr::Closure {
+            output: ReturnType::Default,
+            body: Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            },
+        },
+        member: Member::Named("field"),
+    }
+    "#);
+
+    snapshot!("return .. = ()" as Expr, @r"
+    Expr::Assign {
+        left: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        right: Expr::Tuple,
+    }
+    ");
+
+    snapshot!("return .. += ()" as Expr, @r"
+    Expr::Binary {
+        left: Expr::Return {
+            expr: Some(Expr::Range {
+                limits: RangeLimits::HalfOpen,
+            }),
+        },
+        op: BinOp::AddAssign,
+        right: Expr::Tuple,
+    }
+    ");
+}
+
+#[test]
 fn test_ambiguous_label() {
     for stmt in [
         quote! {
@@ -665,17 +790,6 @@
 
 #[test]
 fn test_fixup() {
-    struct FlattenParens;
-
-    impl VisitMut for FlattenParens {
-        fn visit_expr_mut(&mut self, e: &mut Expr) {
-            while let Expr::Paren(paren) = e {
-                *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
-            }
-            visit_mut::visit_expr_mut(self, e);
-        }
-    }
-
     for tokens in [
         quote! { 2 * (1 + 1) },
         quote! { 0 + (0 + 0) },
@@ -685,18 +799,30 @@
         quote! { (1 + 1).abs() },
         quote! { (lo..hi)[..] },
         quote! { (a..b)..(c..d) },
+        quote! { (x > ..) > x },
         quote! { (&mut fut).await },
         quote! { &mut (x as i32) },
         quote! { -(x as i32) },
-        quote! { if (S {} == 1) {} },
+        quote! { if (S {}) == 1 {} },
         quote! { { (m! {}) - 1 } },
         quote! { match m { _ => ({}) - 1 } },
         quote! { if let _ = (a && b) && c {} },
         quote! { if let _ = (S {}) {} },
+        quote! { if (S {}) == 0 && let Some(_) = x {} },
         quote! { break ('a: loop { break 'a 1 } + 1) },
         quote! { a + (|| b) + c },
         quote! { if let _ = ((break) - 1 || true) {} },
         quote! { if let _ = (break + 1 || true) {} },
+        quote! { if break (break) {} },
+        quote! { if break break {} {} },
+        quote! { if return (..) {} },
+        quote! { if return .. {} {} },
+        quote! { if || (Struct {}) {} },
+        quote! { if || (Struct {}).await {} },
+        quote! { if break || Struct {}.await {} },
+        quote! { if break 'outer 'block: {} {} },
+        quote! { if ..'block: {} {} },
+        quote! { if break ({}).await {} },
         quote! { (break)() },
         quote! { (..) = () },
         quote! { (..) += () },
@@ -704,6 +830,9 @@
         quote! { { (let _ = ()) } },
         quote! { (#[attr] thing).field },
         quote! { (self.f)() },
+        quote! { (return)..=return },
+        quote! { 1 + (return)..=1 + return },
+        quote! { .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. },
     ] {
         let original: Expr = syn::parse2(tokens).unwrap();
 
@@ -716,9 +845,802 @@
 
         assert!(
             original == reconstructed,
-            "original: {}\nreconstructed: {}",
+            "original: {}\n{:#?}\nreconstructed: {}\n{:#?}",
             original.to_token_stream(),
+            crate::macros::debug::Lite(&original),
             reconstructed.to_token_stream(),
+            crate::macros::debug::Lite(&reconstructed),
         );
     }
 }
+
+#[test]
+fn test_permutations() -> ExitCode {
+    fn iter(depth: usize, f: &mut dyn FnMut(Expr)) {
+        let span = Span::call_site();
+
+        // Expr::Path
+        f(Expr::Path(ExprPath {
+            // `x`
+            attrs: Vec::new(),
+            qself: None,
+            path: Path::from(Ident::new("x", span)),
+        }));
+        if false {
+            f(Expr::Path(ExprPath {
+                // `x::<T>`
+                attrs: Vec::new(),
+                qself: None,
+                path: Path {
+                    leading_colon: None,
+                    segments: Punctuated::from_iter([PathSegment {
+                        ident: Ident::new("x", span),
+                        arguments: PathArguments::AngleBracketed(AngleBracketedGenericArguments {
+                            colon2_token: Some(Token![::](span)),
+                            lt_token: Token![<](span),
+                            args: Punctuated::from_iter([GenericArgument::Type(Type::Path(
+                                TypePath {
+                                    qself: None,
+                                    path: Path::from(Ident::new("T", span)),
+                                },
+                            ))]),
+                            gt_token: Token![>](span),
+                        }),
+                    }]),
+                },
+            }));
+            f(Expr::Path(ExprPath {
+                // `<T as Trait>::CONST`
+                attrs: Vec::new(),
+                qself: Some(QSelf {
+                    lt_token: Token![<](span),
+                    ty: Box::new(Type::Path(TypePath {
+                        qself: None,
+                        path: Path::from(Ident::new("T", span)),
+                    })),
+                    position: 1,
+                    as_token: Some(Token![as](span)),
+                    gt_token: Token![>](span),
+                }),
+                path: Path {
+                    leading_colon: None,
+                    segments: Punctuated::from_iter([
+                        PathSegment::from(Ident::new("Trait", span)),
+                        PathSegment::from(Ident::new("CONST", span)),
+                    ]),
+                },
+            }));
+        }
+
+        let Some(depth) = depth.checked_sub(1) else {
+            return;
+        };
+
+        // Expr::Assign
+        iter(depth, &mut |expr| {
+            iter(0, &mut |simple| {
+                f(Expr::Assign(ExprAssign {
+                    // `x = $expr`
+                    attrs: Vec::new(),
+                    left: Box::new(simple.clone()),
+                    eq_token: Token![=](span),
+                    right: Box::new(expr.clone()),
+                }));
+                f(Expr::Assign(ExprAssign {
+                    // `$expr = x`
+                    attrs: Vec::new(),
+                    left: Box::new(expr.clone()),
+                    eq_token: Token![=](span),
+                    right: Box::new(simple),
+                }));
+            });
+        });
+
+        // Expr::Binary
+        iter(depth, &mut |expr| {
+            iter(0, &mut |simple| {
+                for op in [
+                    BinOp::Add(Token![+](span)),
+                    //BinOp::Sub(Token![-](span)),
+                    //BinOp::Mul(Token![*](span)),
+                    //BinOp::Div(Token![/](span)),
+                    //BinOp::Rem(Token![%](span)),
+                    //BinOp::And(Token![&&](span)),
+                    //BinOp::Or(Token![||](span)),
+                    //BinOp::BitXor(Token![^](span)),
+                    //BinOp::BitAnd(Token![&](span)),
+                    //BinOp::BitOr(Token![|](span)),
+                    //BinOp::Shl(Token![<<](span)),
+                    //BinOp::Shr(Token![>>](span)),
+                    //BinOp::Eq(Token![==](span)),
+                    BinOp::Lt(Token![<](span)),
+                    //BinOp::Le(Token![<=](span)),
+                    //BinOp::Ne(Token![!=](span)),
+                    //BinOp::Ge(Token![>=](span)),
+                    //BinOp::Gt(Token![>](span)),
+                    BinOp::ShlAssign(Token![<<=](span)),
+                ] {
+                    f(Expr::Binary(ExprBinary {
+                        // `x + $expr`
+                        attrs: Vec::new(),
+                        left: Box::new(simple.clone()),
+                        op,
+                        right: Box::new(expr.clone()),
+                    }));
+                    f(Expr::Binary(ExprBinary {
+                        // `$expr + x`
+                        attrs: Vec::new(),
+                        left: Box::new(expr.clone()),
+                        op,
+                        right: Box::new(simple.clone()),
+                    }));
+                }
+            });
+        });
+
+        // Expr::Block
+        f(Expr::Block(ExprBlock {
+            // `{}`
+            attrs: Vec::new(),
+            label: None,
+            block: Block {
+                brace_token: token::Brace(span),
+                stmts: Vec::new(),
+            },
+        }));
+
+        // Expr::Break
+        f(Expr::Break(ExprBreak {
+            // `break`
+            attrs: Vec::new(),
+            break_token: Token![break](span),
+            label: None,
+            expr: None,
+        }));
+        iter(depth, &mut |expr| {
+            f(Expr::Break(ExprBreak {
+                // `break $expr`
+                attrs: Vec::new(),
+                break_token: Token![break](span),
+                label: None,
+                expr: Some(Box::new(expr)),
+            }));
+        });
+
+        // Expr::Call
+        iter(depth, &mut |expr| {
+            f(Expr::Call(ExprCall {
+                // `$expr()`
+                attrs: Vec::new(),
+                func: Box::new(expr),
+                paren_token: token::Paren(span),
+                args: Punctuated::new(),
+            }));
+        });
+
+        // Expr::Cast
+        iter(depth, &mut |expr| {
+            f(Expr::Cast(ExprCast {
+                // `$expr as T`
+                attrs: Vec::new(),
+                expr: Box::new(expr),
+                as_token: Token![as](span),
+                ty: Box::new(Type::Path(TypePath {
+                    qself: None,
+                    path: Path::from(Ident::new("T", span)),
+                })),
+            }));
+        });
+
+        // Expr::Closure
+        iter(depth, &mut |expr| {
+            f(Expr::Closure(ExprClosure {
+                // `|| $expr`
+                attrs: Vec::new(),
+                lifetimes: None,
+                constness: None,
+                movability: None,
+                asyncness: None,
+                capture: None,
+                or1_token: Token![|](span),
+                inputs: Punctuated::new(),
+                or2_token: Token![|](span),
+                output: ReturnType::Default,
+                body: Box::new(expr),
+            }));
+        });
+
+        // Expr::Field
+        iter(depth, &mut |expr| {
+            f(Expr::Field(ExprField {
+                // `$expr.field`
+                attrs: Vec::new(),
+                base: Box::new(expr),
+                dot_token: Token![.](span),
+                member: Member::Named(Ident::new("field", span)),
+            }));
+        });
+
+        // Expr::If
+        iter(depth, &mut |expr| {
+            f(Expr::If(ExprIf {
+                // `if $expr {}`
+                attrs: Vec::new(),
+                if_token: Token![if](span),
+                cond: Box::new(expr),
+                then_branch: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+                else_branch: None,
+            }));
+        });
+
+        // Expr::Let
+        iter(depth, &mut |expr| {
+            f(Expr::Let(ExprLet {
+                attrs: Vec::new(),
+                let_token: Token![let](span),
+                pat: Box::new(Pat::Wild(PatWild {
+                    attrs: Vec::new(),
+                    underscore_token: Token![_](span),
+                })),
+                eq_token: Token![=](span),
+                expr: Box::new(expr),
+            }));
+        });
+
+        // Expr::Range
+        f(Expr::Range(ExprRange {
+            // `..`
+            attrs: Vec::new(),
+            start: None,
+            limits: RangeLimits::HalfOpen(Token![..](span)),
+            end: None,
+        }));
+        iter(depth, &mut |expr| {
+            f(Expr::Range(ExprRange {
+                // `..$expr`
+                attrs: Vec::new(),
+                start: None,
+                limits: RangeLimits::HalfOpen(Token![..](span)),
+                end: Some(Box::new(expr.clone())),
+            }));
+            f(Expr::Range(ExprRange {
+                // `$expr..`
+                attrs: Vec::new(),
+                start: Some(Box::new(expr)),
+                limits: RangeLimits::HalfOpen(Token![..](span)),
+                end: None,
+            }));
+        });
+
+        // Expr::Reference
+        iter(depth, &mut |expr| {
+            f(Expr::Reference(ExprReference {
+                // `&$expr`
+                attrs: Vec::new(),
+                and_token: Token![&](span),
+                mutability: None,
+                expr: Box::new(expr),
+            }));
+        });
+
+        // Expr::Return
+        f(Expr::Return(ExprReturn {
+            // `return`
+            attrs: Vec::new(),
+            return_token: Token![return](span),
+            expr: None,
+        }));
+        iter(depth, &mut |expr| {
+            f(Expr::Return(ExprReturn {
+                // `return $expr`
+                attrs: Vec::new(),
+                return_token: Token![return](span),
+                expr: Some(Box::new(expr)),
+            }));
+        });
+
+        // Expr::Try
+        iter(depth, &mut |expr| {
+            f(Expr::Try(ExprTry {
+                // `$expr?`
+                attrs: Vec::new(),
+                expr: Box::new(expr),
+                question_token: Token![?](span),
+            }));
+        });
+
+        // Expr::Unary
+        iter(depth, &mut |expr| {
+            for op in [
+                UnOp::Deref(Token![*](span)),
+                //UnOp::Not(Token![!](span)),
+                //UnOp::Neg(Token![-](span)),
+            ] {
+                f(Expr::Unary(ExprUnary {
+                    // `*$expr`
+                    attrs: Vec::new(),
+                    op,
+                    expr: Box::new(expr.clone()),
+                }));
+            }
+        });
+
+        if false {
+            // Expr::Array
+            f(Expr::Array(ExprArray {
+                // `[]`
+                attrs: Vec::new(),
+                bracket_token: token::Bracket(span),
+                elems: Punctuated::new(),
+            }));
+
+            // Expr::Async
+            f(Expr::Async(ExprAsync {
+                // `async {}`
+                attrs: Vec::new(),
+                async_token: Token![async](span),
+                capture: None,
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Await
+            iter(depth, &mut |expr| {
+                f(Expr::Await(ExprAwait {
+                    // `$expr.await`
+                    attrs: Vec::new(),
+                    base: Box::new(expr),
+                    dot_token: Token![.](span),
+                    await_token: Token![await](span),
+                }));
+            });
+
+            // Expr::Block
+            f(Expr::Block(ExprBlock {
+                // `'a: {}`
+                attrs: Vec::new(),
+                label: Some(Label {
+                    name: Lifetime::new("'a", span),
+                    colon_token: Token![:](span),
+                }),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+            iter(depth, &mut |expr| {
+                f(Expr::Block(ExprBlock {
+                    // `{ $expr }`
+                    attrs: Vec::new(),
+                    label: None,
+                    block: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::from([Stmt::Expr(expr.clone(), None)]),
+                    },
+                }));
+                f(Expr::Block(ExprBlock {
+                    // `{ $expr; }`
+                    attrs: Vec::new(),
+                    label: None,
+                    block: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::from([Stmt::Expr(expr, Some(Token![;](span)))]),
+                    },
+                }));
+            });
+
+            // Expr::Break
+            f(Expr::Break(ExprBreak {
+                // `break 'a`
+                attrs: Vec::new(),
+                break_token: Token![break](span),
+                label: Some(Lifetime::new("'a", span)),
+                expr: None,
+            }));
+            iter(depth, &mut |expr| {
+                f(Expr::Break(ExprBreak {
+                    // `break 'a $expr`
+                    attrs: Vec::new(),
+                    break_token: Token![break](span),
+                    label: Some(Lifetime::new("'a", span)),
+                    expr: Some(Box::new(expr)),
+                }));
+            });
+
+            // Expr::Closure
+            f(Expr::Closure(ExprClosure {
+                // `|| -> T {}`
+                attrs: Vec::new(),
+                lifetimes: None,
+                constness: None,
+                movability: None,
+                asyncness: None,
+                capture: None,
+                or1_token: Token![|](span),
+                inputs: Punctuated::new(),
+                or2_token: Token![|](span),
+                output: ReturnType::Type(
+                    Token![->](span),
+                    Box::new(Type::Path(TypePath {
+                        qself: None,
+                        path: Path::from(Ident::new("T", span)),
+                    })),
+                ),
+                body: Box::new(Expr::Block(ExprBlock {
+                    attrs: Vec::new(),
+                    label: None,
+                    block: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                })),
+            }));
+
+            // Expr::Const
+            f(Expr::Const(ExprConst {
+                // `const {}`
+                attrs: Vec::new(),
+                const_token: Token![const](span),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Continue
+            f(Expr::Continue(ExprContinue {
+                // `continue`
+                attrs: Vec::new(),
+                continue_token: Token![continue](span),
+                label: None,
+            }));
+            f(Expr::Continue(ExprContinue {
+                // `continue 'a`
+                attrs: Vec::new(),
+                continue_token: Token![continue](span),
+                label: Some(Lifetime::new("'a", span)),
+            }));
+
+            // Expr::ForLoop
+            iter(depth, &mut |expr| {
+                f(Expr::ForLoop(ExprForLoop {
+                    // `for _ in $expr {}`
+                    attrs: Vec::new(),
+                    label: None,
+                    for_token: Token![for](span),
+                    pat: Box::new(Pat::Wild(PatWild {
+                        attrs: Vec::new(),
+                        underscore_token: Token![_](span),
+                    })),
+                    in_token: Token![in](span),
+                    expr: Box::new(expr.clone()),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+                f(Expr::ForLoop(ExprForLoop {
+                    // `'a: for _ in $expr {}`
+                    attrs: Vec::new(),
+                    label: Some(Label {
+                        name: Lifetime::new("'a", span),
+                        colon_token: Token![:](span),
+                    }),
+                    for_token: Token![for](span),
+                    pat: Box::new(Pat::Wild(PatWild {
+                        attrs: Vec::new(),
+                        underscore_token: Token![_](span),
+                    })),
+                    in_token: Token![in](span),
+                    expr: Box::new(expr),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+            });
+
+            // Expr::Index
+            iter(depth, &mut |expr| {
+                f(Expr::Index(ExprIndex {
+                    // `$expr[0]`
+                    attrs: Vec::new(),
+                    expr: Box::new(expr),
+                    bracket_token: token::Bracket(span),
+                    index: Box::new(Expr::Lit(ExprLit {
+                        attrs: Vec::new(),
+                        lit: Lit::Int(LitInt::new("0", span)),
+                    })),
+                }));
+            });
+
+            // Expr::Loop
+            f(Expr::Loop(ExprLoop {
+                // `loop {}`
+                attrs: Vec::new(),
+                label: None,
+                loop_token: Token![loop](span),
+                body: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+            f(Expr::Loop(ExprLoop {
+                // `'a: loop {}`
+                attrs: Vec::new(),
+                label: Some(Label {
+                    name: Lifetime::new("'a", span),
+                    colon_token: Token![:](span),
+                }),
+                loop_token: Token![loop](span),
+                body: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Macro
+            f(Expr::Macro(ExprMacro {
+                // `m!()`
+                attrs: Vec::new(),
+                mac: Macro {
+                    path: Path::from(Ident::new("m", span)),
+                    bang_token: Token![!](span),
+                    delimiter: MacroDelimiter::Paren(token::Paren(span)),
+                    tokens: TokenStream::new(),
+                },
+            }));
+            f(Expr::Macro(ExprMacro {
+                // `m! {}`
+                attrs: Vec::new(),
+                mac: Macro {
+                    path: Path::from(Ident::new("m", span)),
+                    bang_token: Token![!](span),
+                    delimiter: MacroDelimiter::Brace(token::Brace(span)),
+                    tokens: TokenStream::new(),
+                },
+            }));
+
+            // Expr::Match
+            iter(depth, &mut |expr| {
+                f(Expr::Match(ExprMatch {
+                    // `match $expr {}`
+                    attrs: Vec::new(),
+                    match_token: Token![match](span),
+                    expr: Box::new(expr.clone()),
+                    brace_token: token::Brace(span),
+                    arms: Vec::new(),
+                }));
+                f(Expr::Match(ExprMatch {
+                    // `match x { _ => $expr }`
+                    attrs: Vec::new(),
+                    match_token: Token![match](span),
+                    expr: Box::new(Expr::Path(ExprPath {
+                        attrs: Vec::new(),
+                        qself: None,
+                        path: Path::from(Ident::new("x", span)),
+                    })),
+                    brace_token: token::Brace(span),
+                    arms: Vec::from([Arm {
+                        attrs: Vec::new(),
+                        pat: Pat::Wild(PatWild {
+                            attrs: Vec::new(),
+                            underscore_token: Token![_](span),
+                        }),
+                        guard: None,
+                        fat_arrow_token: Token![=>](span),
+                        body: Box::new(expr.clone()),
+                        comma: None,
+                    }]),
+                }));
+                f(Expr::Match(ExprMatch {
+                    // `match x { _ if $expr => {} }`
+                    attrs: Vec::new(),
+                    match_token: Token![match](span),
+                    expr: Box::new(Expr::Path(ExprPath {
+                        attrs: Vec::new(),
+                        qself: None,
+                        path: Path::from(Ident::new("x", span)),
+                    })),
+                    brace_token: token::Brace(span),
+                    arms: Vec::from([Arm {
+                        attrs: Vec::new(),
+                        pat: Pat::Wild(PatWild {
+                            attrs: Vec::new(),
+                            underscore_token: Token![_](span),
+                        }),
+                        guard: Some((Token![if](span), Box::new(expr))),
+                        fat_arrow_token: Token![=>](span),
+                        body: Box::new(Expr::Block(ExprBlock {
+                            attrs: Vec::new(),
+                            label: None,
+                            block: Block {
+                                brace_token: token::Brace(span),
+                                stmts: Vec::new(),
+                            },
+                        })),
+                        comma: None,
+                    }]),
+                }));
+            });
+
+            // Expr::MethodCall
+            iter(depth, &mut |expr| {
+                f(Expr::MethodCall(ExprMethodCall {
+                    // `$expr.method()`
+                    attrs: Vec::new(),
+                    receiver: Box::new(expr.clone()),
+                    dot_token: Token![.](span),
+                    method: Ident::new("method", span),
+                    turbofish: None,
+                    paren_token: token::Paren(span),
+                    args: Punctuated::new(),
+                }));
+                f(Expr::MethodCall(ExprMethodCall {
+                    // `$expr.method::<T>()`
+                    attrs: Vec::new(),
+                    receiver: Box::new(expr),
+                    dot_token: Token![.](span),
+                    method: Ident::new("method", span),
+                    turbofish: Some(AngleBracketedGenericArguments {
+                        colon2_token: Some(Token![::](span)),
+                        lt_token: Token![<](span),
+                        args: Punctuated::from_iter([GenericArgument::Type(Type::Path(
+                            TypePath {
+                                qself: None,
+                                path: Path::from(Ident::new("T", span)),
+                            },
+                        ))]),
+                        gt_token: Token![>](span),
+                    }),
+                    paren_token: token::Paren(span),
+                    args: Punctuated::new(),
+                }));
+            });
+
+            // Expr::RawAddr
+            iter(depth, &mut |expr| {
+                f(Expr::RawAddr(ExprRawAddr {
+                    // `&raw const $expr`
+                    attrs: Vec::new(),
+                    and_token: Token![&](span),
+                    raw: Token![raw](span),
+                    mutability: PointerMutability::Const(Token![const](span)),
+                    expr: Box::new(expr),
+                }));
+            });
+
+            // Expr::Struct
+            f(Expr::Struct(ExprStruct {
+                // `Struct {}`
+                attrs: Vec::new(),
+                qself: None,
+                path: Path::from(Ident::new("Struct", span)),
+                brace_token: token::Brace(span),
+                fields: Punctuated::new(),
+                dot2_token: None,
+                rest: None,
+            }));
+
+            // Expr::TryBlock
+            f(Expr::TryBlock(ExprTryBlock {
+                // `try {}`
+                attrs: Vec::new(),
+                try_token: Token![try](span),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::Unsafe
+            f(Expr::Unsafe(ExprUnsafe {
+                // `unsafe {}`
+                attrs: Vec::new(),
+                unsafe_token: Token![unsafe](span),
+                block: Block {
+                    brace_token: token::Brace(span),
+                    stmts: Vec::new(),
+                },
+            }));
+
+            // Expr::While
+            iter(depth, &mut |expr| {
+                f(Expr::While(ExprWhile {
+                    // `while $expr {}`
+                    attrs: Vec::new(),
+                    label: None,
+                    while_token: Token![while](span),
+                    cond: Box::new(expr.clone()),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+                f(Expr::While(ExprWhile {
+                    // `'a: while $expr {}`
+                    attrs: Vec::new(),
+                    label: Some(Label {
+                        name: Lifetime::new("'a", span),
+                        colon_token: Token![:](span),
+                    }),
+                    while_token: Token![while](span),
+                    cond: Box::new(expr),
+                    body: Block {
+                        brace_token: token::Brace(span),
+                        stmts: Vec::new(),
+                    },
+                }));
+            });
+
+            // Expr::Yield
+            f(Expr::Yield(ExprYield {
+                // `yield`
+                attrs: Vec::new(),
+                yield_token: Token![yield](span),
+                expr: None,
+            }));
+            iter(depth, &mut |expr| {
+                f(Expr::Yield(ExprYield {
+                    // `yield $expr`
+                    attrs: Vec::new(),
+                    yield_token: Token![yield](span),
+                    expr: Some(Box::new(expr)),
+                }));
+            });
+        }
+    }
+
+    let mut failures = 0;
+    macro_rules! fail {
+        ($($message:tt)*) => {{
+            eprintln!($($message)*);
+            failures += 1;
+            return;
+        }};
+    }
+    let mut assert = |mut original: Expr| {
+        let tokens = original.to_token_stream();
+        let Ok(mut parsed) = syn::parse2::<Expr>(tokens.clone()) else {
+            fail!(
+                "failed to parse: {}\n{:#?}",
+                tokens,
+                crate::macros::debug::Lite(&original),
+            );
+        };
+        AsIfPrinted.visit_expr_mut(&mut original);
+        FlattenParens.visit_expr_mut(&mut parsed);
+        if original != parsed {
+            fail!(
+                "before: {}\n{:#?}\nafter: {}\n{:#?}",
+                tokens,
+                crate::macros::debug::Lite(&original),
+                parsed.to_token_stream(),
+                crate::macros::debug::Lite(&parsed),
+            );
+        }
+        let mut tokens_no_paren = tokens.clone();
+        FlattenParens::visit_token_stream_mut(&mut tokens_no_paren);
+        if tokens.to_string() != tokens_no_paren.to_string() {
+            if let Ok(mut parsed2) = syn::parse2::<Expr>(tokens_no_paren) {
+                FlattenParens.visit_expr_mut(&mut parsed2);
+                if original == parsed2 {
+                    fail!("redundant parens: {}", tokens);
+                }
+            }
+        }
+    };
+
+    iter(4, &mut assert);
+    if failures > 0 {
+        eprintln!("FAILURES: {failures}");
+        ExitCode::FAILURE
+    } else {
+        ExitCode::SUCCESS
+    }
+}
diff --git a/crates/syn/tests/test_precedence.rs b/crates/syn/tests/test_precedence.rs
index e64cbf1..c7b4ace 100644
--- a/crates/syn/tests/test_precedence.rs
+++ b/crates/syn/tests/test_precedence.rs
@@ -205,12 +205,11 @@
         ExprKind, GenericArg, GenericBound, Local, LocalKind, Pat, PolyTraitRef, Stmt, StmtKind,
         StructExpr, StructRest, TraitBoundModifiers, Ty,
     };
-    use rustc_ast::mut_visit::{walk_flat_map_assoc_item, MutVisitor};
+    use rustc_ast::mut_visit::{visit_clobber, walk_flat_map_assoc_item, MutVisitor};
     use rustc_ast::visit::{AssocCtxt, BoundKind};
     use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
     use rustc_span::DUMMY_SP;
     use smallvec::SmallVec;
-    use std::mem;
     use std::ops::DerefMut;
     use thin_vec::ThinVec;
 
@@ -280,19 +279,13 @@
             match e.kind {
                 ExprKind::Block(..) | ExprKind::If(..) | ExprKind::Let(..) => {}
                 ExprKind::Binary(..) if contains_let_chain(e) => {}
-                _ => {
-                    let inner = mem::replace(
-                        e,
-                        P(Expr {
-                            id: ast::DUMMY_NODE_ID,
-                            kind: ExprKind::Dummy,
-                            span: DUMMY_SP,
-                            attrs: ThinVec::new(),
-                            tokens: None,
-                        }),
-                    );
-                    e.kind = ExprKind::Paren(inner);
-                }
+                _ => visit_clobber(&mut **e, |inner| Expr {
+                    id: ast::DUMMY_NODE_ID,
+                    kind: ExprKind::Paren(P(inner)),
+                    span: DUMMY_SP,
+                    attrs: ThinVec::new(),
+                    tokens: None,
+                }),
             }
         }
 
diff --git a/crates/syn/tests/test_unparenthesize.rs b/crates/syn/tests/test_unparenthesize.rs
index 5e155bf..1330aa2 100644
--- a/crates/syn/tests/test_unparenthesize.rs
+++ b/crates/syn/tests/test_unparenthesize.rs
@@ -1,22 +1,25 @@
 #![cfg(not(miri))]
+#![recursion_limit = "1024"]
+#![feature(rustc_private)]
 #![allow(
     clippy::manual_assert,
+    clippy::match_like_matches_macro,
     clippy::needless_lifetimes,
     clippy::uninlined_format_args
 )]
 
+use crate::common::visit::{AsIfPrinted, FlattenParens};
 use quote::ToTokens as _;
 use std::fs;
-use std::mem;
 use std::panic;
 use std::path::Path;
 use std::sync::atomic::{AtomicUsize, Ordering};
-use syn::visit_mut::{self, VisitMut};
-use syn::{Expr, Generics, LifetimeParam, TypeParam};
+use syn::visit_mut::VisitMut as _;
 
 #[macro_use]
 mod macros;
 
+mod common;
 mod repo;
 
 #[test]
@@ -34,54 +37,11 @@
     }
 }
 
-struct FlattenParens;
-
-impl VisitMut for FlattenParens {
-    fn visit_expr_mut(&mut self, e: &mut Expr) {
-        while let Expr::Paren(paren) = e {
-            *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
-        }
-        visit_mut::visit_expr_mut(self, e);
-    }
-}
-
-struct AsIfPrinted;
-
-impl VisitMut for AsIfPrinted {
-    fn visit_generics_mut(&mut self, generics: &mut Generics) {
-        if generics.params.is_empty() {
-            generics.lt_token = None;
-            generics.gt_token = None;
-        }
-        if let Some(where_clause) = &generics.where_clause {
-            if where_clause.predicates.is_empty() {
-                generics.where_clause = None;
-            }
-        }
-        visit_mut::visit_generics_mut(self, generics);
-    }
-
-    fn visit_lifetime_param_mut(&mut self, param: &mut LifetimeParam) {
-        if param.bounds.is_empty() {
-            param.colon_token = None;
-        }
-        visit_mut::visit_lifetime_param_mut(self, param);
-    }
-
-    fn visit_type_param_mut(&mut self, param: &mut TypeParam) {
-        if param.bounds.is_empty() {
-            param.colon_token = None;
-        }
-        visit_mut::visit_type_param_mut(self, param);
-    }
-}
-
 fn test(path: &Path, failed: &AtomicUsize) {
     let content = fs::read_to_string(path).unwrap();
 
     match panic::catch_unwind(|| -> syn::Result<()> {
         let mut before = syn::parse_file(&content)?;
-        before.shebang = None;
         FlattenParens.visit_file_mut(&mut before);
         let printed = before.to_token_stream();
         let mut after = syn::parse2::<syn::File>(printed.clone())?;
diff --git a/crates/thiserror-impl/.android-checksum.json b/crates/thiserror-impl/.android-checksum.json
index 74bae95..50354ed 100644
--- a/crates/thiserror-impl/.android-checksum.json
+++ b/crates/thiserror-impl/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"42f4289ec65527e4d97314e6785a734b092671f9ab3304a7fcf71d50313d5600","Android.bp":"b49c08ae62afc97574faabeecca0bf794a045432de029dd8d4e4ab1e648eb007","Cargo.toml":"4aa3eba5970844b091f72f184830b04c90f1e017a2a319fab459913739b1f4b7","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"d849492cd95ab234da2d6f64991c8c9d9cef792808a31482395d965ac79c040b","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","TEST_MAPPING":"f935a2c2019169411ab63fc9475f797223d7caf28484fc0287977fa0b8db3643","cargo_embargo.json":"2cfc52f9eb76af7f4e8556acf0400fb847df8011aaed77c31aaa5e81cb45d4df","rules.mk":"fdf160cd11dd3e7d82f61b1ffecd4499440870d0116d7c3da709e92acbd11158","src/ast.rs":"537a5d1657905dcb10281fc62074a07d61a6cfdbbd210c73b11a9482fdac3f75","src/attr.rs":"163c00ea8602a2a12272f221639fb6230d78513aff4ccbd0331eb18133cbc118","src/expand.rs":"45237e04020fc3e294b873bb3313ca3020bbee1c3feef9c6ae82494bd9147955","src/fallback.rs":"e0a4f8dba6262a5f0a3f1369715a41f515e057349cb69b98227d7e32debc19cc","src/fmt.rs":"31c1eeae14d205b1dd4010db751c28a32d821acc4bf5698e976aa3e4e12c10be","src/generics.rs":"6481fb544d9246686fcfc9ef7ef4dfbdec90fbfedc4e9326856bd33d74e36a05","src/lib.rs":"d3ff190f8b047890bcef40bdc49bed00982f4fbfc2884834b2e5e1d5437d0891","src/prop.rs":"d41e7ea14531916cd44704b215be09813a978ea02c6276735a76cbfcf36bda1c","src/scan_expr.rs":"0189cad44956e3ec597989c7324382068a5bf8cbf788caf44bc5cb027de93cf8","src/unraw.rs":"5f3f85a25ab3cb4163c1be4a9e060f1160dd2f4468ff5d07ad08e6e7f2237343","src/valid.rs":"fd6b0a136269681545b4966869ec3b2825457f21738f6ec1ded046aba2fe96bc"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"82085634ed40e5be4c3253c7984effe7177c27b582fb55d763f521e5dd14b4db","Android.bp":"0fb7531b974d59d386b04da5af77d06a1a071307e40df69602241d8ae02c5386","Cargo.toml":"4d8b112ec0e50d0936a9810d04f4e78e691c5fb17fef9349784661330a1fa322","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"26302627c7ccda5280f3d648e75062a311199b2f2e943196bc6b86cdc43ffe2b","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","TEST_MAPPING":"f935a2c2019169411ab63fc9475f797223d7caf28484fc0287977fa0b8db3643","cargo_embargo.json":"2cfc52f9eb76af7f4e8556acf0400fb847df8011aaed77c31aaa5e81cb45d4df","rules.mk":"fdf160cd11dd3e7d82f61b1ffecd4499440870d0116d7c3da709e92acbd11158","src/ast.rs":"537a5d1657905dcb10281fc62074a07d61a6cfdbbd210c73b11a9482fdac3f75","src/attr.rs":"163c00ea8602a2a12272f221639fb6230d78513aff4ccbd0331eb18133cbc118","src/expand.rs":"bf4e21b21ef1b8c9f6c46055e47be9ec0ee01a67490631a3c0035c669334e28c","src/fallback.rs":"e0a4f8dba6262a5f0a3f1369715a41f515e057349cb69b98227d7e32debc19cc","src/fmt.rs":"1966bbc1874a4a0aef50d41dd03526fbec7ed9b6f3d725fcc4377dd926da8ad2","src/generics.rs":"ea2c6b921d40185f8ac7f5fafac3425cb0ba1e69e8c8f3d73b15e410f2a9f67e","src/lib.rs":"d3ff190f8b047890bcef40bdc49bed00982f4fbfc2884834b2e5e1d5437d0891","src/prop.rs":"d41e7ea14531916cd44704b215be09813a978ea02c6276735a76cbfcf36bda1c","src/scan_expr.rs":"0189cad44956e3ec597989c7324382068a5bf8cbf788caf44bc5cb027de93cf8","src/unraw.rs":"4b33f4627978e5a57f92385e7f840416661c3c6c386b00fbf56b2cc311d500ae","src/valid.rs":"fd6b0a136269681545b4966869ec3b2825457f21738f6ec1ded046aba2fe96bc"}}
\ No newline at end of file
diff --git a/crates/thiserror-impl/.cargo-checksum.json b/crates/thiserror-impl/.cargo-checksum.json
index fbce4d9..79c31d7 100644
--- a/crates/thiserror-impl/.cargo-checksum.json
+++ b/crates/thiserror-impl/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"bf5dab971350d9f183e154f64489b08ad719eab42dc0674b3b60cd1885ba7918","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/ast.rs":"c717fffeb2923b2840d58fd02923a1926a48fa8336039f57a9e94f9275ae7ec6","src/attr.rs":"d3c7fa9e8269973f140e5382f753664ac32bee44c09875f678100b890aea4d06","src/expand.rs":"f77dc38ba8a13c112fb738ddd9fb0c8070b95c913f719f91b63925707b572bcc","src/fallback.rs":"505c5a56a07a8a25bf533b44111e44a85e13b9dac787f24f2191e3d7389db446","src/fmt.rs":"e739a63daa43171bc477f05cf63ff82c5347d77985e32d3b039198f3f9e1e584","src/generics.rs":"ac493703c9955400d4fab22cbbdbbc4bf4f6f72c112b34be8b784142142ff74f","src/lib.rs":"8ddbfd56670c3a508fd13f2f44d80782aac760f6a32db0a57af3c2c9ef27dd26","src/prop.rs":"82fb29bd85b0e1163c32dca2ff874e1dfbece7f681b986c6fe618f29e34bdd26","src/scan_expr.rs":"d46ae7a3eaaa6476553db3164676ec71aa82bcd8a2e4cad59deb07893c79f1c8","src/unraw.rs":"71b37ad9cb3e42948bf485561a229603742982f4953f83e0675dc59d8ac5c79e","src/valid.rs":"5a4e781773cc9a2f3129f620fa4f201f71fd3265b8315ca138239bec3bf618fb"},"package":"d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312"}
\ No newline at end of file
+{"files":{"Cargo.toml":"982b7dd54dccf1a665bb2e8485dc5c3bc5d8297cce4bd94cb92e56f8e6de434e","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/ast.rs":"c717fffeb2923b2840d58fd02923a1926a48fa8336039f57a9e94f9275ae7ec6","src/attr.rs":"d3c7fa9e8269973f140e5382f753664ac32bee44c09875f678100b890aea4d06","src/expand.rs":"06339e5ecc9fadc7baf0c8df4f98cef748f467dba82452645bce37227ad50baa","src/fallback.rs":"505c5a56a07a8a25bf533b44111e44a85e13b9dac787f24f2191e3d7389db446","src/fmt.rs":"e6391502143c44b9f04cdef9085a84392804bdde75d8b87d741fded7f7882c7a","src/generics.rs":"03134b3882790f657a11700e5fb0b0ca744214a47d609febaabc14926d2d7e03","src/lib.rs":"8ddbfd56670c3a508fd13f2f44d80782aac760f6a32db0a57af3c2c9ef27dd26","src/prop.rs":"82fb29bd85b0e1163c32dca2ff874e1dfbece7f681b986c6fe618f29e34bdd26","src/scan_expr.rs":"d46ae7a3eaaa6476553db3164676ec71aa82bcd8a2e4cad59deb07893c79f1c8","src/unraw.rs":"d4ee6048f7722160c3d61f69378d2c8d17068a319a8e6a33c6f25ea673e88312","src/valid.rs":"5a4e781773cc9a2f3129f620fa4f201f71fd3265b8315ca138239bec3bf618fb"},"package":"26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"}
\ No newline at end of file
diff --git a/crates/thiserror-impl/Android.bp b/crates/thiserror-impl/Android.bp
index 9e8ee7f..249aa2a 100644
--- a/crates/thiserror-impl/Android.bp
+++ b/crates/thiserror-impl/Android.bp
@@ -17,7 +17,7 @@
     name: "libthiserror_impl",
     crate_name: "thiserror_impl",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.0.6",
+    cargo_pkg_version: "2.0.11",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
diff --git a/crates/thiserror-impl/Cargo.toml b/crates/thiserror-impl/Cargo.toml
index 1f82cdd..f7f01cb 100644
--- a/crates/thiserror-impl/Cargo.toml
+++ b/crates/thiserror-impl/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "thiserror-impl"
-version = "2.0.6"
+version = "2.0.11"
 authors = ["David Tolnay <[email protected]>"]
 build = false
 autolib = false
diff --git a/crates/thiserror-impl/METADATA b/crates/thiserror-impl/METADATA
index 2447a47..c8d2961 100644
--- a/crates/thiserror-impl/METADATA
+++ b/crates/thiserror-impl/METADATA
@@ -1,17 +1,17 @@
 name: "thiserror-impl"
 description: "Implementation detail of the `thiserror` crate"
 third_party {
-  version: "2.0.6"
+  version: "2.0.11"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 12
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/thiserror-impl"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/thiserror-impl/thiserror-impl-2.0.6.crate"
-    version: "2.0.6"
+    value: "https://static.crates.io/crates/thiserror-impl/thiserror-impl-2.0.11.crate"
+    version: "2.0.11"
   }
 }
diff --git a/crates/thiserror-impl/src/expand.rs b/crates/thiserror-impl/src/expand.rs
index 20ba1d2..a304632 100644
--- a/crates/thiserror-impl/src/expand.rs
+++ b/crates/thiserror-impl/src/expand.rs
@@ -12,7 +12,7 @@
     match try_expand(input) {
         Ok(expanded) => expanded,
         // If there are invalid attributes in the input, expand to an Error impl
-        // anyway to minimize spurious knock-on errors in other code that uses
+        // anyway to minimize spurious secondary errors in other code that uses
         // this type as an Error.
         Err(error) => fallback::expand(input, error),
     }
@@ -169,15 +169,21 @@
         let from = unoptional_type(from_field.ty);
         let source_var = Ident::new("source", span);
         let body = from_initializer(from_field, backtrace_field, &source_var);
-        quote_spanned! {span=>
-            #[allow(deprecated, unused_qualifications, clippy::needless_lifetimes)]
+        let from_function = quote! {
+            fn from(#source_var: #from) -> Self {
+                #ty #body
+            }
+        };
+        let from_impl = quote_spanned! {span=>
             #[automatically_derived]
             impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause {
-                fn from(#source_var: #from) -> Self {
-                    #ty #body
-                }
+                #from_function
             }
-        }
+        };
+        Some(quote! {
+            #[allow(deprecated, unused_qualifications, clippy::needless_lifetimes)]
+            #from_impl
+        })
     });
 
     if input.generics.type_params().next().is_some() {
@@ -433,14 +439,20 @@
         let from = unoptional_type(from_field.ty);
         let source_var = Ident::new("source", span);
         let body = from_initializer(from_field, backtrace_field, &source_var);
-        Some(quote_spanned! {span=>
-            #[allow(deprecated, unused_qualifications, clippy::needless_lifetimes)]
+        let from_function = quote! {
+            fn from(#source_var: #from) -> Self {
+                #ty::#variant #body
+            }
+        };
+        let from_impl = quote_spanned! {span=>
             #[automatically_derived]
             impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause {
-                fn from(#source_var: #from) -> Self {
-                    #ty::#variant #body
-                }
+                #from_function
             }
+        };
+        Some(quote! {
+            #[allow(deprecated, unused_qualifications, clippy::needless_lifetimes)]
+            #from_impl
         })
     });
 
diff --git a/crates/thiserror-impl/src/fmt.rs b/crates/thiserror-impl/src/fmt.rs
index 5c0ff50..1da28c1 100644
--- a/crates/thiserror-impl/src/fmt.rs
+++ b/crates/thiserror-impl/src/fmt.rs
@@ -107,12 +107,14 @@
                 }
             };
             infinite_recursive |= member == *"self" && bound == Trait::Display;
-            if let Some(&field) = member_index.get(&member) {
-                implied_bounds.insert((field, bound));
-            } else {
-                out += &member.to_string();
-                continue;
-            }
+            let field = match member_index.get(&member) {
+                Some(&field) => field,
+                None => {
+                    out += &member.to_string();
+                    continue;
+                }
+            };
+            implied_bounds.insert((field, bound));
             let formatvar_prefix = if bonus_display {
                 "__display"
             } else if bound == Trait::Pointer {
@@ -129,15 +131,17 @@
             while user_named_args.contains(&formatvar) {
                 formatvar = IdentUnraw::new(format_ident!("_{}", formatvar.to_string()));
             }
+            formatvar.set_span(span);
             out += &formatvar.to_string();
             if !macro_named_args.insert(formatvar.clone()) {
                 // Already added to bindings by a previous use.
                 continue;
             }
-            let binding_value = match &member {
+            let mut binding_value = match &member {
                 MemberUnraw::Unnamed(index) => format_ident!("_{}", index),
                 MemberUnraw::Named(ident) => ident.to_local(),
             };
+            binding_value.set_span(span.resolved_at(fields[field].member.span()));
             let wrapped_binding_value = if bonus_display {
                 quote_spanned!(span=> #binding_value.as_display())
             } else if bound == Trait::Pointer {
diff --git a/crates/thiserror-impl/src/generics.rs b/crates/thiserror-impl/src/generics.rs
index 254c2ed..26fe0a9 100644
--- a/crates/thiserror-impl/src/generics.rs
+++ b/crates/thiserror-impl/src/generics.rs
@@ -25,11 +25,12 @@
 
 fn crawl(in_scope: &ParamsInScope, ty: &Type, found: &mut bool) {
     if let Type::Path(ty) = ty {
-        if ty.qself.is_none() {
-            if let Some(ident) = ty.path.get_ident() {
-                if in_scope.names.contains(ident) {
-                    *found = true;
-                }
+        if let Some(qself) = &ty.qself {
+            crawl(in_scope, &qself.ty, found);
+        } else {
+            let front = ty.path.segments.first().unwrap();
+            if front.arguments.is_none() && in_scope.names.contains(&front.ident) {
+                *found = true;
             }
         }
         for segment in &ty.path.segments {
diff --git a/crates/thiserror-impl/src/unraw.rs b/crates/thiserror-impl/src/unraw.rs
index a232621..73b9970 100644
--- a/crates/thiserror-impl/src/unraw.rs
+++ b/crates/thiserror-impl/src/unraw.rs
@@ -28,6 +28,10 @@
         }
         unraw
     }
+
+    pub fn set_span(&mut self, span: Span) {
+        self.0.set_span(span);
+    }
 }
 
 impl Display for IdentUnraw {
diff --git a/crates/thiserror/.android-checksum.json b/crates/thiserror/.android-checksum.json
index f147ea1..81ec816 100644
--- a/crates/thiserror/.android-checksum.json
+++ b/crates/thiserror/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"9e716151114fdd98277a171030510909cac6b5e769b33c12dc7870e9edf06b77","Android.bp":"40ba9d10c2cf598c4399a2ce7bfb14959ac10a47244dda782b2a8b3e770fe6fc","Cargo.toml":"6f7d3839e20e0a58da5fd06c1ea9e8565e6096a67ac3565514d55120bfa42dc3","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"24c3994aa0bbdb8a6b99767cc3e5a3c7076b58f13cf6806b2e4d5bba38231720","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","README.md":"76160b61c09049e479407435b9a03cabda4e8a3c280ee963f7c3c915b530675a","TEST_MAPPING":"f935a2c2019169411ab63fc9475f797223d7caf28484fc0287977fa0b8db3643","build.rs":"8006f0f5ee493f4cfe5e0c8c4c186c219e87168f2de4f32cb7032378982f6940","build/probe.rs":"b39312d34ace0e0b2702e10d6036ef100fb8d23c8355f46ff635e22758bdfbe5","cargo_embargo.json":"eaf3579e645fdf1e9282be1229cb7d06b2c028364842aaf72b02778a82d6120e","rules.mk":"95f35cc5a8c54bd3bc180fdd3cba24caa2c80dbf6f380f00816e2b7ebb07d254","rust-toolchain.toml":"25bc44c2a4cb625e0f16003c73ac0db2fc79a3b79a5b0e6d4b6175c6dbe5af69","src/aserror.rs":"eb2fafd9cca3217d103bf4c8abf016db3c3f7d3af7d7a8e2270bd961ecfbb3b7","src/display.rs":"8ce7fa11380d90b9f3ade582aca93f74ae54d215d7c6d0a4a65151c5612c2bbe","src/lib.rs":"881d298d065e44be650e7f9dbea62592cc8b7c6b70523fe32950761973a26600","src/provide.rs":"3217a7800360cf3a7d8a689b1aa7ecf1832a49719eebebfc9f29ec10667feb5f","src/var.rs":"9983204d7fc8fd890e3cba8b82e8ea35dfdaf285765e4d8661ed7ae8a34cabf3","tests/compiletest.rs":"5876a4728abd95ed4ed3b78777fe95428d32a32730d7718f58001bdbd4d1e168","tests/test_backtrace.rs":"696ba834938c705ae9d5c5647cf2a114a62272863e8bb5d2b0f54f7988e6c717","tests/test_display.rs":"57ce6c4c156a58b0d0f8689fca145401591180fbf29f1830c1f61f7a3f790996","tests/test_error.rs":"546fc4db53b241b4963018eda3582d4ff5d352abd841ff956c8ebb9c14115a03","tests/test_expr.rs":"6417e45a9829d0c967b57051f7ad62ff4d599586f396237af90844ab00c303c6","tests/test_from.rs":"f95e48e2d8ebc8dc347b521c6b8d870abd5f6fc07c75f42b78be78657a74c2ff","tests/test_generics.rs":"5ce2e41ff9b69e6f005f93201b04da42304c706034c2241a7f9c86f571888ed6","tests/test_lints.rs":"c6488211a32d3287720917abc8274bdcd3699dbe70ec3a6b28e279a9cb775e58","tests/test_option.rs":"f36d54e86d15a59bcd04cca4003774d2ff7b11e36d6286f4cc824078dfc502eb","tests/test_path.rs":"6bd2a500d46c07c2614aacaac6a75c2488b62db768dc8aa8f95a01f5e4bc1b72","tests/test_source.rs":"38c4d61e5f988dd276a38522d3b8bf8aa31b0c792174188937fcabee4dfa5d65","tests/test_transparent.rs":"090214f938799d553e063019feb2ba7a77e3ea73bb3f61d81251e47dc68dc553","tests/ui/bad-field-attr.rs":"bf347c298087f6f0d0a1eac59267839ae53adcd5540b85ae9c63c3a45fa706cd","tests/ui/bad-field-attr.stderr":"281d1c5f032d66d2aff8606f3aab497b634d7f527184d5afaf9241e1faf64c5f","tests/ui/concat-display.rs":"f1175ba9be43368c509dc45e6e405eaad05a9d4eb77e14dc926dc71bbae999af","tests/ui/concat-display.stderr":"c18d04c9bc7fa530e846b5eb8121ed7733bea7d0abeed2c5a73e9d3e6c005f55","tests/ui/display-underscore.rs":"62de9b01cda9132a1b70a2cebc1338ea1927024bce589b0334d1c54e42e4a045","tests/ui/display-underscore.stderr":"cd84a129befdd0b3d64a352726b657d0e26a9c2595185279652bc5e4a7ba239b","tests/ui/duplicate-enum-source.rs":"36542154222586a4f39b7b5d52844649766b74ff70fd09e42509b080d95f5d71","tests/ui/duplicate-enum-source.stderr":"93d9795714e247e2d428ba74be5edc93736cd5b548e2f3ecec97d6fb9f0b18f2","tests/ui/duplicate-fmt.rs":"7bb9cd7dfeef6c34f81f9e87291e0531fc4ccc374e4113b9db409769c27bdf55","tests/ui/duplicate-fmt.stderr":"dccd907e645857bfe7fef66cd92e822e71e89f683c5fbe54473d2c1a1bbdedb9","tests/ui/duplicate-struct-source.rs":"2b23a91807be37ce71b1083c7c1866b6493018724a3f16678530345b8e92d46f","tests/ui/duplicate-struct-source.stderr":"17b1deae8183b4c1a650adf511814a98db0f3c34c3a0a310a81212be0343dadb","tests/ui/duplicate-transparent.rs":"2c90c839f4d0ef13a552a5af8439ae868a9213f7565b981a518205b7d4e477b7","tests/ui/duplicate-transparent.stderr":"6f8e8a3c566df779c18085cbe57a7b17f8374d5d5783a94b8f7bcfe8abb57e73","tests/ui/expression-fallback.rs":"97503986b26e0e4f51d85ccd1486b959a06fe61fb64dbd0e7b94363b15e7d585","tests/ui/expression-fallback.stderr":"fd1e8ed9158239b6e5a901fa00a561e98d00176c3a422599ddb3e0c5775734de","tests/ui/fallback-impl-with-display.rs":"48af8de8a000a7d47c64d2b78ed7e0b9e76f3991fd995d4f8e7ef3978b9a50d8","tests/ui/fallback-impl-with-display.stderr":"b5b51dc41ebfb5eb0f6a93ce5388abf0e4c8e6c89408c4db2987492f235f125d","tests/ui/from-backtrace-backtrace.rs":"7916b789d091b3b5b694fb5bb712dc3e018f8761a20ed2c3705e68b3f9ceea69","tests/ui/from-backtrace-backtrace.stderr":"6b0f7a1b448d1addb7e4e3592a2e8378907f67e4974663edc041d9e00f45c02b","tests/ui/from-not-source.rs":"75b6faeb9e1460ca9852bd18e4e947d6fbd3791e585fe9f22d70dd7d82029f10","tests/ui/from-not-source.stderr":"b05feb4ac8ba62379a552e0c5e6fba8d10a45d500b0dcae3a7169806236d3abd","tests/ui/invalid-input-impl-anyway.rs":"b46154acdfbd7b7baa0a933f063596418fd1e5eb2c7b51decced4a0de2faf255","tests/ui/invalid-input-impl-anyway.stderr":"42ad10ca6586eaeb482a32c702162d9126e701ecda574e3c9b11f19ea1e005a5","tests/ui/lifetime.rs":"4285a3a46eaf7e653975e8f896802b4cdbe867cce2854372eac37b9e0d2d9b25","tests/ui/lifetime.stderr":"91cdc5f9e5400d52c75eec2ec448f3ac5fcda2258a0d823d9e33bd14e0b58947","tests/ui/missing-display.rs":"2c9abba361bd1d823ef27b8e90152918cffa6635638e526dfe92e08a77608169","tests/ui/missing-display.stderr":"536453e6c152805bc534706276f78654630d79028b42900766769dced941a483","tests/ui/missing-fmt.rs":"6af19714f0f60028a9b5ae19392ca00858ae58dfcf2e6dc9bfae4414636221ac","tests/ui/missing-fmt.stderr":"16cfd840423200479c9f18fcfea7ef158ff1d6554e73d379dab4fe34a663e8e8","tests/ui/no-display.rs":"d02b04857182cf9b2da83437a17ef19c613768eebc3617337f89f02fb7f7974d","tests/ui/no-display.stderr":"3bf1a6e6791377563de07c3dda248c9e96103f04ce101f37f8a4e728424af32a","tests/ui/numbered-positional-tuple.rs":"c9179f8e6a3e60ad34b20f5b682c2da74ff3644653691dcc4b0476fe16d564fd","tests/ui/numbered-positional-tuple.stderr":"565350599805426fcf093ebd1a9c4fddafddb61c5703edfc9ce09c890f56d3b8","tests/ui/raw-identifier.rs":"1ef32c66a82cd48d836943668201b72543c53ace9b9b0f055228d1ddb3e2b276","tests/ui/raw-identifier.stderr":"f8afbcec8baabf852fad0d8b780dc54592548772bb475cb858c29f5a8d8b5226","tests/ui/same-from-type.rs":"1080f8028fb748ea1e527645656ea29ba4853d9ab14ed25a3b64addd1e5021e5","tests/ui/same-from-type.stderr":"8be189354803124419d8f288cd16f6eee13719e05ebfa214be38ec9f018486a6","tests/ui/source-enum-not-error.rs":"8b66db858b247f3979a06deaf8580e445e67e23f45751dcd5ef7218b833f433f","tests/ui/source-enum-not-error.stderr":"8d96818d43219105f32ae41c5c9c59c461728b2663a5d138c25e2250a62af1d1","tests/ui/source-enum-unnamed-field-not-error.rs":"27e7d6d589b4a3e974484577bc108ae8f4310adc23ca547d1c9e828753c37a51","tests/ui/source-enum-unnamed-field-not-error.stderr":"bd373ded6993059c46bad10ba6fbba39564dbdacde24c676f40a87b52fd0556c","tests/ui/source-struct-not-error.rs":"e36b6441053a1c63f3c69af2b4a3e833865006c4faf7d9c51ecb3fe2dc39e7c4","tests/ui/source-struct-not-error.stderr":"d7d1cc742060dd26ff84786909cfa49b346b0e8ec1921ca444df13eb026aa9e9","tests/ui/source-struct-unnamed-field-not-error.rs":"e82a9061d401b23dc6676881f74522807632741cf5944bdc3996d02697de5b79","tests/ui/source-struct-unnamed-field-not-error.stderr":"ed3f7b430b37f573903ec9cc8f6f89272b4d7b310ed6ba5593778f85aae047e1","tests/ui/struct-with-fmt.rs":"4895c24195726465f1b68c22723fc84609419963b953ecfd5956dcc5b288b360","tests/ui/struct-with-fmt.stderr":"5f99f229dd01a94a4bb94c070591235e6f94373d13c25d49c4e7e2fd1bb3d317","tests/ui/transparent-display.rs":"5abd47616b338d4bfb95732c82d8ee41d873ce6ac8bc1c3dd1ef544d3debc734","tests/ui/transparent-display.stderr":"2d0a78931017ab7979b47dd3ce6598a6eaa17921087a34c046e6fad16c6ae480","tests/ui/transparent-enum-many.rs":"cda644d43222d17c8169e754ab59141e9cac2afc4b65b744e6cb4079f23cbaad","tests/ui/transparent-enum-many.stderr":"c3d389b42c8c6117571a5aef1cb71176b2d27097ff434dc6ed66a29589005228","tests/ui/transparent-enum-not-error.rs":"e47febf3bcccf29b337a768cc66a1cc4f022ab6094a4fa5ef19202e03348bdfb","tests/ui/transparent-enum-not-error.stderr":"99579294e88378a49a90da1966b013d9ac7c88b2b2fcda556242202833f69206","tests/ui/transparent-enum-source.rs":"150fad9540b7a86a3bc51549fa0a8b172ffd7648a3a8c3f095c4865e3d37413b","tests/ui/transparent-enum-source.stderr":"0aeed0f88273ad06756fbe307e9f1449665d2382ac1c81122c85fe880b8c98e8","tests/ui/transparent-enum-unnamed-field-not-error.rs":"afa3d81d6becca7ac62cbb697a1b21847342b0871a43ad3d5113219729abc854","tests/ui/transparent-enum-unnamed-field-not-error.stderr":"f01a220d38ebff3e66d66174600fdf768f963319753d10468512858354826295","tests/ui/transparent-struct-many.rs":"73a9fbc5649117b46fa691ba096a67dd5372d8bfadaa71dd42fc26c5f1da0617","tests/ui/transparent-struct-many.stderr":"7111a46e578e3bb6fc2a81fc6374c0de81dabc2dc03bd6d9f80ba7b94eeab68d","tests/ui/transparent-struct-not-error.rs":"af6d7cd5aa80cc8440fc7983e66d2ecc47badcdf103e3209e5494ca06279891f","tests/ui/transparent-struct-not-error.stderr":"6a9add9db88ac1a6364cd912a07b2b3f5227f8db6e3a2e20b25ba5fd310e1f93","tests/ui/transparent-struct-source.rs":"9a36c4273061bf33de0681b862c2cfbc554f891d2c033a6f5f198ebc6cdc2a57","tests/ui/transparent-struct-source.stderr":"96b8b76fd5d235e10fd135a51de73ff16f42fb72e89a63423646f3010193056d","tests/ui/transparent-struct-unnamed-field-not-error.rs":"c0b776bfef8c8f90ab453f4dda64e2c66687a8a91e32a6c51eac0c729b4ca967","tests/ui/transparent-struct-unnamed-field-not-error.stderr":"a9c8f742caf7d0c0b4a79893fdc5da11e716ddf0d833a06ca3e36d76eab07134","tests/ui/unconditional-recursion.rs":"19a01c25685f9c9e3dfa137da973b6422d192a8bcf0c2dd82717b56c17838c72","tests/ui/unconditional-recursion.stderr":"b38a8adc33f3b1d7297c75087d5a7c975a5443b4fa2be37ef8bcac5fe6904e74","tests/ui/unexpected-field-fmt.rs":"461cbc37768b9d357784c3a1958c7b7d9bedcb3ac5f065f6ad26002540bc1585","tests/ui/unexpected-field-fmt.stderr":"cf9cc6db1d468c49c3fcd02ffe846e0a6306806477c0459f6feb588163ca3ead","tests/ui/unexpected-struct-source.rs":"2ad5a79ad119d310310ff02da4e4f18c1127a42d9954dc1e30dae9a7e7e44373","tests/ui/unexpected-struct-source.stderr":"f3930172b5a705e45a2fa85a443d06ac3e34e9dfb1309a878226c71d502c5d82","tests/ui/union.rs":"d03e526e970e667423f3579a966e99b328794586a8dd9cdce1210a4db303fdc6","tests/ui/union.stderr":"4ba0864f18a58b84acb83e08bec5dc3b6ad857ef101dfa9a087e735294fc2aa7"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"6628719163f217dced7d3df46b361ea7875863edd38e2af2259fb9644aac537e","Android.bp":"b7728c539835d0ef33db1daa81826ac0e98df1e2c9415729544ba00385b76bc2","Cargo.toml":"ac746b6d2d17a37458bdcc6a04e4ca1de7a67daba519a256e7fba7ea1b9268a5","LICENSE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-APACHE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","LICENSE-MIT":"38620a3cfaeec97a9197e8c39e436ea7f0bc86699b1f1c35f1aa41785b6d4eac","METADATA":"55ababb5c4b72d5ff522c57207b9698c828fe97a66d50a05f79baf132be69000","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"50f827348bfd5def2df4f30cb41264072cf9c180bd9ed698437e8d85b2482754","README.md":"76160b61c09049e479407435b9a03cabda4e8a3c280ee963f7c3c915b530675a","TEST_MAPPING":"f935a2c2019169411ab63fc9475f797223d7caf28484fc0287977fa0b8db3643","build.rs":"8006f0f5ee493f4cfe5e0c8c4c186c219e87168f2de4f32cb7032378982f6940","build/probe.rs":"b39312d34ace0e0b2702e10d6036ef100fb8d23c8355f46ff635e22758bdfbe5","cargo_embargo.json":"eaf3579e645fdf1e9282be1229cb7d06b2c028364842aaf72b02778a82d6120e","rules.mk":"95f35cc5a8c54bd3bc180fdd3cba24caa2c80dbf6f380f00816e2b7ebb07d254","rust-toolchain.toml":"25bc44c2a4cb625e0f16003c73ac0db2fc79a3b79a5b0e6d4b6175c6dbe5af69","src/aserror.rs":"eb2fafd9cca3217d103bf4c8abf016db3c3f7d3af7d7a8e2270bd961ecfbb3b7","src/display.rs":"8ce7fa11380d90b9f3ade582aca93f74ae54d215d7c6d0a4a65151c5612c2bbe","src/lib.rs":"b10b27b78f6890a73910ea923823c84fa3fa7434c0de3ffaa07fda367be93868","src/provide.rs":"3217a7800360cf3a7d8a689b1aa7ecf1832a49719eebebfc9f29ec10667feb5f","src/var.rs":"9983204d7fc8fd890e3cba8b82e8ea35dfdaf285765e4d8661ed7ae8a34cabf3","tests/compiletest.rs":"5876a4728abd95ed4ed3b78777fe95428d32a32730d7718f58001bdbd4d1e168","tests/test_backtrace.rs":"51a8358592ce410888bf90ae9f5f0a47fae236e7c03a197fa2b7d3ec09b652ab","tests/test_display.rs":"3b6fdc5a4f1c51898c0b42dad2e4d8d61d24927d1d9e9eed4853e6fb16c85b44","tests/test_error.rs":"546fc4db53b241b4963018eda3582d4ff5d352abd841ff956c8ebb9c14115a03","tests/test_expr.rs":"226c345d04ee48b8d63dcf616a6140c2bbc59988774f0c23eb4c88577eed72a3","tests/test_from.rs":"f95e48e2d8ebc8dc347b521c6b8d870abd5f6fc07c75f42b78be78657a74c2ff","tests/test_generics.rs":"907a43e3c2ec2357e61db14f4bb63f75efb24a92034773a99b22efc1dd097d34","tests/test_lints.rs":"6e9c53b6590a795e6286af8410818fb20a8fd9a46600d9621c203d3a571d9c39","tests/test_option.rs":"c409b2cea42a0fe968007690e89715e43023a50303cce9b86d0a4d6885e794f6","tests/test_path.rs":"55b0e66dc4215a1f47bf456e0349180e6df83208f84395758ee88f0f2949ff6d","tests/test_source.rs":"38c4d61e5f988dd276a38522d3b8bf8aa31b0c792174188937fcabee4dfa5d65","tests/test_transparent.rs":"090214f938799d553e063019feb2ba7a77e3ea73bb3f61d81251e47dc68dc553","tests/ui/bad-field-attr.rs":"bf347c298087f6f0d0a1eac59267839ae53adcd5540b85ae9c63c3a45fa706cd","tests/ui/bad-field-attr.stderr":"281d1c5f032d66d2aff8606f3aab497b634d7f527184d5afaf9241e1faf64c5f","tests/ui/concat-display.rs":"f1175ba9be43368c509dc45e6e405eaad05a9d4eb77e14dc926dc71bbae999af","tests/ui/concat-display.stderr":"c18d04c9bc7fa530e846b5eb8121ed7733bea7d0abeed2c5a73e9d3e6c005f55","tests/ui/display-underscore.rs":"62de9b01cda9132a1b70a2cebc1338ea1927024bce589b0334d1c54e42e4a045","tests/ui/display-underscore.stderr":"cd84a129befdd0b3d64a352726b657d0e26a9c2595185279652bc5e4a7ba239b","tests/ui/duplicate-enum-source.rs":"36542154222586a4f39b7b5d52844649766b74ff70fd09e42509b080d95f5d71","tests/ui/duplicate-enum-source.stderr":"93d9795714e247e2d428ba74be5edc93736cd5b548e2f3ecec97d6fb9f0b18f2","tests/ui/duplicate-fmt.rs":"7bb9cd7dfeef6c34f81f9e87291e0531fc4ccc374e4113b9db409769c27bdf55","tests/ui/duplicate-fmt.stderr":"dccd907e645857bfe7fef66cd92e822e71e89f683c5fbe54473d2c1a1bbdedb9","tests/ui/duplicate-struct-source.rs":"2b23a91807be37ce71b1083c7c1866b6493018724a3f16678530345b8e92d46f","tests/ui/duplicate-struct-source.stderr":"17b1deae8183b4c1a650adf511814a98db0f3c34c3a0a310a81212be0343dadb","tests/ui/duplicate-transparent.rs":"2c90c839f4d0ef13a552a5af8439ae868a9213f7565b981a518205b7d4e477b7","tests/ui/duplicate-transparent.stderr":"6f8e8a3c566df779c18085cbe57a7b17f8374d5d5783a94b8f7bcfe8abb57e73","tests/ui/expression-fallback.rs":"97503986b26e0e4f51d85ccd1486b959a06fe61fb64dbd0e7b94363b15e7d585","tests/ui/expression-fallback.stderr":"fd1e8ed9158239b6e5a901fa00a561e98d00176c3a422599ddb3e0c5775734de","tests/ui/fallback-impl-with-display.rs":"48af8de8a000a7d47c64d2b78ed7e0b9e76f3991fd995d4f8e7ef3978b9a50d8","tests/ui/fallback-impl-with-display.stderr":"b5b51dc41ebfb5eb0f6a93ce5388abf0e4c8e6c89408c4db2987492f235f125d","tests/ui/from-backtrace-backtrace.rs":"7916b789d091b3b5b694fb5bb712dc3e018f8761a20ed2c3705e68b3f9ceea69","tests/ui/from-backtrace-backtrace.stderr":"6b0f7a1b448d1addb7e4e3592a2e8378907f67e4974663edc041d9e00f45c02b","tests/ui/from-not-source.rs":"75b6faeb9e1460ca9852bd18e4e947d6fbd3791e585fe9f22d70dd7d82029f10","tests/ui/from-not-source.stderr":"b05feb4ac8ba62379a552e0c5e6fba8d10a45d500b0dcae3a7169806236d3abd","tests/ui/invalid-input-impl-anyway.rs":"b46154acdfbd7b7baa0a933f063596418fd1e5eb2c7b51decced4a0de2faf255","tests/ui/invalid-input-impl-anyway.stderr":"42ad10ca6586eaeb482a32c702162d9126e701ecda574e3c9b11f19ea1e005a5","tests/ui/lifetime.rs":"4285a3a46eaf7e653975e8f896802b4cdbe867cce2854372eac37b9e0d2d9b25","tests/ui/lifetime.stderr":"91cdc5f9e5400d52c75eec2ec448f3ac5fcda2258a0d823d9e33bd14e0b58947","tests/ui/missing-display.rs":"2c9abba361bd1d823ef27b8e90152918cffa6635638e526dfe92e08a77608169","tests/ui/missing-display.stderr":"536453e6c152805bc534706276f78654630d79028b42900766769dced941a483","tests/ui/missing-fmt.rs":"6af19714f0f60028a9b5ae19392ca00858ae58dfcf2e6dc9bfae4414636221ac","tests/ui/missing-fmt.stderr":"16cfd840423200479c9f18fcfea7ef158ff1d6554e73d379dab4fe34a663e8e8","tests/ui/no-display.rs":"d02b04857182cf9b2da83437a17ef19c613768eebc3617337f89f02fb7f7974d","tests/ui/no-display.stderr":"3bf1a6e6791377563de07c3dda248c9e96103f04ce101f37f8a4e728424af32a","tests/ui/numbered-positional-tuple.rs":"c9179f8e6a3e60ad34b20f5b682c2da74ff3644653691dcc4b0476fe16d564fd","tests/ui/numbered-positional-tuple.stderr":"565350599805426fcf093ebd1a9c4fddafddb61c5703edfc9ce09c890f56d3b8","tests/ui/raw-identifier.rs":"1ef32c66a82cd48d836943668201b72543c53ace9b9b0f055228d1ddb3e2b276","tests/ui/raw-identifier.stderr":"f8afbcec8baabf852fad0d8b780dc54592548772bb475cb858c29f5a8d8b5226","tests/ui/same-from-type.rs":"13d24c8764667819db33491af13438577512d29c756e06cc0a1d749e2549dd51","tests/ui/same-from-type.stderr":"977cc395a135a1cd95a67499883a25f2e36e89afe3f2a7a036f29dbe9c876740","tests/ui/source-enum-not-error.rs":"8b66db858b247f3979a06deaf8580e445e67e23f45751dcd5ef7218b833f433f","tests/ui/source-enum-not-error.stderr":"8d96818d43219105f32ae41c5c9c59c461728b2663a5d138c25e2250a62af1d1","tests/ui/source-enum-unnamed-field-not-error.rs":"27e7d6d589b4a3e974484577bc108ae8f4310adc23ca547d1c9e828753c37a51","tests/ui/source-enum-unnamed-field-not-error.stderr":"bd373ded6993059c46bad10ba6fbba39564dbdacde24c676f40a87b52fd0556c","tests/ui/source-struct-not-error.rs":"e36b6441053a1c63f3c69af2b4a3e833865006c4faf7d9c51ecb3fe2dc39e7c4","tests/ui/source-struct-not-error.stderr":"d7d1cc742060dd26ff84786909cfa49b346b0e8ec1921ca444df13eb026aa9e9","tests/ui/source-struct-unnamed-field-not-error.rs":"e82a9061d401b23dc6676881f74522807632741cf5944bdc3996d02697de5b79","tests/ui/source-struct-unnamed-field-not-error.stderr":"ed3f7b430b37f573903ec9cc8f6f89272b4d7b310ed6ba5593778f85aae047e1","tests/ui/struct-with-fmt.rs":"4895c24195726465f1b68c22723fc84609419963b953ecfd5956dcc5b288b360","tests/ui/struct-with-fmt.stderr":"5f99f229dd01a94a4bb94c070591235e6f94373d13c25d49c4e7e2fd1bb3d317","tests/ui/transparent-display.rs":"5abd47616b338d4bfb95732c82d8ee41d873ce6ac8bc1c3dd1ef544d3debc734","tests/ui/transparent-display.stderr":"2d0a78931017ab7979b47dd3ce6598a6eaa17921087a34c046e6fad16c6ae480","tests/ui/transparent-enum-many.rs":"cda644d43222d17c8169e754ab59141e9cac2afc4b65b744e6cb4079f23cbaad","tests/ui/transparent-enum-many.stderr":"c3d389b42c8c6117571a5aef1cb71176b2d27097ff434dc6ed66a29589005228","tests/ui/transparent-enum-not-error.rs":"e47febf3bcccf29b337a768cc66a1cc4f022ab6094a4fa5ef19202e03348bdfb","tests/ui/transparent-enum-not-error.stderr":"99579294e88378a49a90da1966b013d9ac7c88b2b2fcda556242202833f69206","tests/ui/transparent-enum-source.rs":"150fad9540b7a86a3bc51549fa0a8b172ffd7648a3a8c3f095c4865e3d37413b","tests/ui/transparent-enum-source.stderr":"0aeed0f88273ad06756fbe307e9f1449665d2382ac1c81122c85fe880b8c98e8","tests/ui/transparent-enum-unnamed-field-not-error.rs":"afa3d81d6becca7ac62cbb697a1b21847342b0871a43ad3d5113219729abc854","tests/ui/transparent-enum-unnamed-field-not-error.stderr":"f01a220d38ebff3e66d66174600fdf768f963319753d10468512858354826295","tests/ui/transparent-struct-many.rs":"73a9fbc5649117b46fa691ba096a67dd5372d8bfadaa71dd42fc26c5f1da0617","tests/ui/transparent-struct-many.stderr":"7111a46e578e3bb6fc2a81fc6374c0de81dabc2dc03bd6d9f80ba7b94eeab68d","tests/ui/transparent-struct-not-error.rs":"af6d7cd5aa80cc8440fc7983e66d2ecc47badcdf103e3209e5494ca06279891f","tests/ui/transparent-struct-not-error.stderr":"6a9add9db88ac1a6364cd912a07b2b3f5227f8db6e3a2e20b25ba5fd310e1f93","tests/ui/transparent-struct-source.rs":"9a36c4273061bf33de0681b862c2cfbc554f891d2c033a6f5f198ebc6cdc2a57","tests/ui/transparent-struct-source.stderr":"96b8b76fd5d235e10fd135a51de73ff16f42fb72e89a63423646f3010193056d","tests/ui/transparent-struct-unnamed-field-not-error.rs":"c0b776bfef8c8f90ab453f4dda64e2c66687a8a91e32a6c51eac0c729b4ca967","tests/ui/transparent-struct-unnamed-field-not-error.stderr":"a9c8f742caf7d0c0b4a79893fdc5da11e716ddf0d833a06ca3e36d76eab07134","tests/ui/unconditional-recursion.rs":"19a01c25685f9c9e3dfa137da973b6422d192a8bcf0c2dd82717b56c17838c72","tests/ui/unconditional-recursion.stderr":"b38a8adc33f3b1d7297c75087d5a7c975a5443b4fa2be37ef8bcac5fe6904e74","tests/ui/unexpected-field-fmt.rs":"461cbc37768b9d357784c3a1958c7b7d9bedcb3ac5f065f6ad26002540bc1585","tests/ui/unexpected-field-fmt.stderr":"cf9cc6db1d468c49c3fcd02ffe846e0a6306806477c0459f6feb588163ca3ead","tests/ui/unexpected-struct-source.rs":"2ad5a79ad119d310310ff02da4e4f18c1127a42d9954dc1e30dae9a7e7e44373","tests/ui/unexpected-struct-source.stderr":"f3930172b5a705e45a2fa85a443d06ac3e34e9dfb1309a878226c71d502c5d82","tests/ui/union.rs":"d03e526e970e667423f3579a966e99b328794586a8dd9cdce1210a4db303fdc6","tests/ui/union.stderr":"4ba0864f18a58b84acb83e08bec5dc3b6ad857ef101dfa9a087e735294fc2aa7"}}
\ No newline at end of file
diff --git a/crates/thiserror/.cargo-checksum.json b/crates/thiserror/.cargo-checksum.json
index 355feed..f0a52fd 100644
--- a/crates/thiserror/.cargo-checksum.json
+++ b/crates/thiserror/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"fd0b3df2a4d4eb7fa65bd8f1080fec658829e8544335f16d4adec029c54308ae","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"1b665c5bcd24e6a8f052427ac09de48d74c04b7255e597e3d43ac7ca0a3a1e2f","build.rs":"d9ff69377315792766c92c0ac6f464c954e7b1f1a7794da7adebc2dd1249aa40","build/probe.rs":"8df55471d6b75623d423b17ebbf493335ee66140d1ddd232c88db3e59f61298c","rust-toolchain.toml":"6bbb61302978c736b2da03e4fb40e3beab908f85d533ab46fd541e637b5f3e0f","src/aserror.rs":"380007eea1e65681f157af143be01b0a779ee7ae07cf0a884b24438b218dd1cb","src/display.rs":"52385248e945246f7ef5b7dd45d1c327bed2cdbc10349029fc170658376814b2","src/lib.rs":"3f57829cd574cfe0a31703f0ba301318bdd4399f5a5c6d9fddf2d7a9773ae1a7","src/provide.rs":"a58cb09f60ad0181c7a47c0442c9d23b8e1f79f93a2b488db3b27c211e3f497f","src/var.rs":"a7390e29fe607bfccc690c2333e8d1b85923ece2eb62555dd07fa01f7b37e226","tests/compiletest.rs":"4e381aa8ca3eabb7ac14d1e0c3700b3223e47640547a6988cfa13ad68255f60f","tests/test_backtrace.rs":"d773443b25d24cb75e788d6dd21ed1d283e66563c6399b396cd61df8524766d2","tests/test_display.rs":"cf732d62caf92218766650d61235a8bb51e725da0f62b67c6b4152d297b9de19","tests/test_error.rs":"eba9a2bae06e45365dc9f1be39d00e5cdee57127909c5f4b1f5558fe1dbb60ef","tests/test_expr.rs":"727f08245aa73f440d477d39fbcd24ca6e64f648192df84f353ecddfc1061d37","tests/test_from.rs":"36bd22be7b048cd187a19076aeac1456040f20a0b677b01c6003998b63439ea1","tests/test_generics.rs":"a77cb1646d3eaea8031c4521b86206ebd6c4357fd5744f6d55ce3100a121540d","tests/test_lints.rs":"8e48ab92c669722c1d5406d0050a091a81cc89fd8f20369994b8e756c27c834e","tests/test_option.rs":"e73039a518b41b72bdd1e9c55a098ed82c265d0ef9b090ed20d729764b707697","tests/test_path.rs":"049bee9ef1c384d5f91882284ab704f9fc74477ac310f2b9c764feffdfe0f53d","tests/test_source.rs":"36a6de84484bdae8eae487ef41a93e5c71ae88d1c7e1194911295672db0b15ab","tests/test_transparent.rs":"c224b3030b7d3e3dc6851787255bea30ff063c4b3f7767a5d7b43b56959a8347","tests/ui/bad-field-attr.rs":"c5b567e3091969a01061843fb2d95c5e1aa3fa81edfeecdf416a84a6fba40aa8","tests/ui/bad-field-attr.stderr":"78f576d5ec66464a77f1cdf0f5bb7dcdf18f7f04f1165983a6239ec59d908ea3","tests/ui/concat-display.rs":"3995bd6b3bdd67df7bb16499775d89600c0dd20895633fe807396a64c117078d","tests/ui/concat-display.stderr":"251878d4c334e7d6735b7a440ffa0739c3443b85aba60cd7786b60d2497c93f8","tests/ui/display-underscore.rs":"0cab8048b4a37a676b00c5f68414c235573c920423d9a2f4dfac887a6f805399","tests/ui/display-underscore.stderr":"bb11d3c000cbd110e3539cc3fee053f824f1bdd3a8b1d7ad9548f6ceae96e684","tests/ui/duplicate-enum-source.rs":"bfe28ce18042d446a76c7411aa233598211ce1157fdd3cb87bff3b3fa7c33131","tests/ui/duplicate-enum-source.stderr":"3d32fead420b27b4497be49080bc3b78f7f0ba339ead3de6c94e5dc20302c18f","tests/ui/duplicate-fmt.rs":"ba89e292892043fdc7dfefec13f0f8bc5f52b3ab03cd0278a019612ce34dcd85","tests/ui/duplicate-fmt.stderr":"65e78d22526d30a37e663ffe63aaa1c37576aba81c6a8dc5b9ee65cc00956872","tests/ui/duplicate-struct-source.rs":"f3d5f8e3d6fccfcdbb630db291353709583a920c6bf46f9f9de9966b67ea4c0f","tests/ui/duplicate-struct-source.stderr":"fb761d76668ac42357cf37b03c0abdbae5de0a828034990850291c9cb6ab766d","tests/ui/duplicate-transparent.rs":"41a9447e85f1a47027023442acde55c3d8610ec46d91b39bd43a42d7a004d747","tests/ui/duplicate-transparent.stderr":"4975abad43e973df158f18098d9bcb9dc39f8e75d3e733ed5d6620d1ee065c11","tests/ui/expression-fallback.rs":"00fcfa22a9860feb3c737cc4eca44512de85412d2cce69a690afa9e4bdc8758b","tests/ui/expression-fallback.stderr":"7859db67522b7d35819c4cfaa725f76136cdea990a65d2469638d4c2c899db8c","tests/ui/fallback-impl-with-display.rs":"0b8ce57ba958008f90aaa078fa1066b47b8d4a5146b6a91ec7d8d96122f0637a","tests/ui/fallback-impl-with-display.stderr":"1b3dad712b97598fbee70125471de1a8106eb161d42ce1f790ae07be8c8984ba","tests/ui/from-backtrace-backtrace.rs":"0caac64486c0eb9c076553c0502d468fbc477602a9a2595165a1dcd95524e5ff","tests/ui/from-backtrace-backtrace.stderr":"e24156ae0828878f3282341732b6e032eaa8cb4b4db366a6b5437ed0731d40a7","tests/ui/from-not-source.rs":"a8dff2e92c21b1b97c48af89b7832bfb6b3bb4437a691bb882779e63fc792869","tests/ui/from-not-source.stderr":"525038e8b841707b927434cca4549168f73bd305faca17552a0d1fffa542ccc4","tests/ui/invalid-input-impl-anyway.rs":"6de91f71ddf038dffa3b9da33763a2ec3a5aa0047528e19ba998d5efe3aada5b","tests/ui/invalid-input-impl-anyway.stderr":"fa2725053cd87fc37f87546b377e6e5eed95c45e2a960863303b21a1935fdddb","tests/ui/lifetime.rs":"1da6748767b9a5b25ad7c013becb2e243b39c7c764cbdf00487794f6fc812890","tests/ui/lifetime.stderr":"d889a23f71324afe95dafc5f9d15337fbdbc9977cb8924f0cafe3a3becf4ced7","tests/ui/missing-display.rs":"c1fd1bc0ec0fb103d7f7b128837f717d49485662839899d570b3c983f1332888","tests/ui/missing-display.stderr":"9e7d3ad7da309dd2b420d50936c849c9b766d90553e357712b90437b6486b3c9","tests/ui/missing-fmt.rs":"bc9e2830e54c2474ff6c27a766ed3dee88d29e40f93f30e8d64d63233866c17d","tests/ui/missing-fmt.stderr":"9a20ccee9b660fe31a5b3199307b48580bb8305cb9ce33d97d3fc767a0cfc614","tests/ui/no-display.rs":"0525bbaf69d6badec85ad92dfe0dc9a4dcabb28a859f4caac40a52f1d37d9e25","tests/ui/no-display.stderr":"506a11a27e96b2d5a560fbb93cfddb22fc257ddafc08b047f612fafdf3f74eda","tests/ui/numbered-positional-tuple.rs":"7d000b1abcde04abcfe21bd592144e8cbcd953608895aef934d4655e2349e63a","tests/ui/numbered-positional-tuple.stderr":"58b2dde4578862b3d2ca9d8f309b05dbbce059e7b6bb8ad3096a702b0f63c5cf","tests/ui/raw-identifier.rs":"2593eb4bee6a2b20f36ccd08a7265f2e284a4f020f8381c325bb8fe630213e8d","tests/ui/raw-identifier.stderr":"0461c9c5a2f2630734822940d543df7f32cd4ed2e34bb323f6edbd13335dbf2f","tests/ui/same-from-type.rs":"b1b0a29b952a172a3b49887831f8aca5978ae98643221350ea6fb50823912c96","tests/ui/same-from-type.stderr":"778265c1f17895cd834806983919a85b0f265299037b781c9419b3670761cf48","tests/ui/source-enum-not-error.rs":"3add5e7b4503d964bcae0848904822e1473c1d08c5a146c2df5347314ce1b8df","tests/ui/source-enum-not-error.stderr":"aeba0a8a0084833e470b6be2250370809f53c279ad603232af5302b9de9f8cce","tests/ui/source-enum-unnamed-field-not-error.rs":"a98989e908b84a8e6e6dceef02af7bdd1098a444d229950f67ed4f54d55c62e7","tests/ui/source-enum-unnamed-field-not-error.stderr":"579144cada6850a8a9b34f5ae4d36a5c19dfc4acf3dde78f57ffb5fe1a5e8da3","tests/ui/source-struct-not-error.rs":"09fb7713637242dca9192585a6daeb8d732dc1c1d0fa522b74f1c98618e6d949","tests/ui/source-struct-not-error.stderr":"b45eb66f078fec68d44feff1f8d6a676c341e9e9d9acb35daa58ec1ea20f9dae","tests/ui/source-struct-unnamed-field-not-error.rs":"eee605a9aafbb093666393e25cef4f7d7b8e90d518b9fadbdbed9685c66ccfcd","tests/ui/source-struct-unnamed-field-not-error.stderr":"2da577e0cb8ea8c7f0a2ae69c0f7db908432217c6290a72abba46a8f539982be","tests/ui/struct-with-fmt.rs":"a681659e0c161c8dd7b9f42e3ac026759ed085948cfb42458247eb96a2122a69","tests/ui/struct-with-fmt.stderr":"e560ce1e6a696b404f729ec317d6793ccb2a72fe8a508f0adb807b3982c1c9ff","tests/ui/transparent-display.rs":"b3c59583eb64b0b5a246444456d03cf52d51bcdc08885023600dbb44fd87e5f2","tests/ui/transparent-display.stderr":"16d538914e0d92026bde4b4bec75660217da9ecc6b621d12d2eb81d33ed1d1da","tests/ui/transparent-enum-many.rs":"2a40a764fb4683bff57973eec61507a6c00f7d4d7a32da6e7bd0190c2e445434","tests/ui/transparent-enum-many.stderr":"f1d78c1d6d8edbef153420db4fb9ca3dc6076fa043b5b1bc0cd291daa417a3ea","tests/ui/transparent-enum-not-error.rs":"f6315993e68bc71d6d4d39afa4d059695308ef785f92cc0d1df3e9ff55be2a9a","tests/ui/transparent-enum-not-error.stderr":"3a5fe056cd4566f402b03cb591394e0ba85bd74da53df3c8d50bda4a05c2e5ba","tests/ui/transparent-enum-source.rs":"18f606a98ac0a53f08dc56f5f923b9cbe75d25ed34479c777b48dac305d5968c","tests/ui/transparent-enum-source.stderr":"1b2e0ac53951034575d43ec0396c4e2b3cfb272db2aef8d6baa13a7e1632cc84","tests/ui/transparent-enum-unnamed-field-not-error.rs":"0c720567e9e0f87921055dfa9f607661725377633445e01a4b5048c7a7a50a85","tests/ui/transparent-enum-unnamed-field-not-error.stderr":"6d84e9a7f4e88daba12931a6c1508be60bb19125d06e44fa2fa205126d953bb1","tests/ui/transparent-struct-many.rs":"72c6b6c1a44c203d3bc68989b2f1ec092531ef75b745432824c3776c290326f6","tests/ui/transparent-struct-many.stderr":"7bd0536dbb54a0ce7d4a8e66ca7624a1b132d8a1d1e4fecca642ec77494ac01c","tests/ui/transparent-struct-not-error.rs":"fd814d3141c9182b1267b558d9daef8dd6e8b6462e1ad42b197f3a1c0703dce2","tests/ui/transparent-struct-not-error.stderr":"ac7634ea72096d8a5c1a91fd4f1b45ef870130a2698d9ae7c6530cec2f9799d5","tests/ui/transparent-struct-source.rs":"863fa691ed7d27e8767da58d9ee11fd40d6642274b36338ca1074c07964ea2b3","tests/ui/transparent-struct-source.stderr":"267dab65929e67d32347fb467a00b43af931f8205d727d7671938580217fc70e","tests/ui/transparent-struct-unnamed-field-not-error.rs":"fbff5874be44a5dcc347693d7929537256b187dfec467ed72c9968c095228d8d","tests/ui/transparent-struct-unnamed-field-not-error.stderr":"ea99d5422348c2588ad7374360e2a24649f040b9c5614c9308eff958f61960ec","tests/ui/unconditional-recursion.rs":"a6cc8c97a95644b4c5979fbc2fc5e18bdb58ff1e8a8ab471c9e3bb64a8ddddc4","tests/ui/unconditional-recursion.stderr":"7349acab2499b55cd48d86b8c0ac65b080225f3d43d6582653259d7b9e085a52","tests/ui/unexpected-field-fmt.rs":"29fba7b4d81c642ec8e47cfe053aa515acf9080a86d65e685363a48993becfe3","tests/ui/unexpected-field-fmt.stderr":"20731c4a08af04bed3ff513903adadd690b6bc532b15604557e7f25575a8338f","tests/ui/unexpected-struct-source.rs":"c6cbe882d622635c216feb8290b1bd536ce0ec4feee16bc087667a21b3641d5c","tests/ui/unexpected-struct-source.stderr":"7c8227513478f6cc09e8a28be337c8a0e758a06ca5978d774c91bd43c4a54043","tests/ui/union.rs":"331adff27cebd8b95b03b6742cc8247331fda1f961e1590ed39c8d39f50cf1d8","tests/ui/union.stderr":"5f67ad29753d6fb14bc03aef7d4a1f660ee7796e469c037efbf8b13456934ad3"},"package":"8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47"}
\ No newline at end of file
+{"files":{"Cargo.toml":"c30c8a8ddcf9a396a0bbe0de23347ccd04222071386bd048140b416dee303bf5","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"1b665c5bcd24e6a8f052427ac09de48d74c04b7255e597e3d43ac7ca0a3a1e2f","build.rs":"d9ff69377315792766c92c0ac6f464c954e7b1f1a7794da7adebc2dd1249aa40","build/probe.rs":"8df55471d6b75623d423b17ebbf493335ee66140d1ddd232c88db3e59f61298c","rust-toolchain.toml":"6bbb61302978c736b2da03e4fb40e3beab908f85d533ab46fd541e637b5f3e0f","src/aserror.rs":"380007eea1e65681f157af143be01b0a779ee7ae07cf0a884b24438b218dd1cb","src/display.rs":"52385248e945246f7ef5b7dd45d1c327bed2cdbc10349029fc170658376814b2","src/lib.rs":"a35b28deac69622fe1854741efa7d76f79367cb1b79e3dc5f25cca47bf802eeb","src/provide.rs":"a58cb09f60ad0181c7a47c0442c9d23b8e1f79f93a2b488db3b27c211e3f497f","src/var.rs":"a7390e29fe607bfccc690c2333e8d1b85923ece2eb62555dd07fa01f7b37e226","tests/compiletest.rs":"4e381aa8ca3eabb7ac14d1e0c3700b3223e47640547a6988cfa13ad68255f60f","tests/test_backtrace.rs":"b4b2ab8057b76a46491503da7326a2411df824eab34d7d4c853081f6887b6f2f","tests/test_display.rs":"5432eeeaa18be38e9ad317766433c86424d13758520eed2fc37a1871934a5545","tests/test_error.rs":"eba9a2bae06e45365dc9f1be39d00e5cdee57127909c5f4b1f5558fe1dbb60ef","tests/test_expr.rs":"8d53ad09cadc513d1210fa7124e4f33f5db7bd5ec39b38861d08ddf4c0d64b70","tests/test_from.rs":"36bd22be7b048cd187a19076aeac1456040f20a0b677b01c6003998b63439ea1","tests/test_generics.rs":"219d0e2ad94f65134ca9b8b4735a211addbbff0dd6820a40a227fc6e5bf6960a","tests/test_lints.rs":"ebc4f3d99b7ae210160ab590ff8a4350632d6aa731df416f7a450567d038d00d","tests/test_option.rs":"71606cb816c15d5373065579d8ab3c9206bb6f3738b0bfbea56511c43bcb05e7","tests/test_path.rs":"92f218304955022aec69d5ce09c9454cf62e17b05eb795c1ffb80d46fa42758c","tests/test_source.rs":"36a6de84484bdae8eae487ef41a93e5c71ae88d1c7e1194911295672db0b15ab","tests/test_transparent.rs":"c224b3030b7d3e3dc6851787255bea30ff063c4b3f7767a5d7b43b56959a8347","tests/ui/bad-field-attr.rs":"c5b567e3091969a01061843fb2d95c5e1aa3fa81edfeecdf416a84a6fba40aa8","tests/ui/bad-field-attr.stderr":"78f576d5ec66464a77f1cdf0f5bb7dcdf18f7f04f1165983a6239ec59d908ea3","tests/ui/concat-display.rs":"3995bd6b3bdd67df7bb16499775d89600c0dd20895633fe807396a64c117078d","tests/ui/concat-display.stderr":"251878d4c334e7d6735b7a440ffa0739c3443b85aba60cd7786b60d2497c93f8","tests/ui/display-underscore.rs":"0cab8048b4a37a676b00c5f68414c235573c920423d9a2f4dfac887a6f805399","tests/ui/display-underscore.stderr":"bb11d3c000cbd110e3539cc3fee053f824f1bdd3a8b1d7ad9548f6ceae96e684","tests/ui/duplicate-enum-source.rs":"bfe28ce18042d446a76c7411aa233598211ce1157fdd3cb87bff3b3fa7c33131","tests/ui/duplicate-enum-source.stderr":"3d32fead420b27b4497be49080bc3b78f7f0ba339ead3de6c94e5dc20302c18f","tests/ui/duplicate-fmt.rs":"ba89e292892043fdc7dfefec13f0f8bc5f52b3ab03cd0278a019612ce34dcd85","tests/ui/duplicate-fmt.stderr":"65e78d22526d30a37e663ffe63aaa1c37576aba81c6a8dc5b9ee65cc00956872","tests/ui/duplicate-struct-source.rs":"f3d5f8e3d6fccfcdbb630db291353709583a920c6bf46f9f9de9966b67ea4c0f","tests/ui/duplicate-struct-source.stderr":"fb761d76668ac42357cf37b03c0abdbae5de0a828034990850291c9cb6ab766d","tests/ui/duplicate-transparent.rs":"41a9447e85f1a47027023442acde55c3d8610ec46d91b39bd43a42d7a004d747","tests/ui/duplicate-transparent.stderr":"4975abad43e973df158f18098d9bcb9dc39f8e75d3e733ed5d6620d1ee065c11","tests/ui/expression-fallback.rs":"00fcfa22a9860feb3c737cc4eca44512de85412d2cce69a690afa9e4bdc8758b","tests/ui/expression-fallback.stderr":"7859db67522b7d35819c4cfaa725f76136cdea990a65d2469638d4c2c899db8c","tests/ui/fallback-impl-with-display.rs":"0b8ce57ba958008f90aaa078fa1066b47b8d4a5146b6a91ec7d8d96122f0637a","tests/ui/fallback-impl-with-display.stderr":"1b3dad712b97598fbee70125471de1a8106eb161d42ce1f790ae07be8c8984ba","tests/ui/from-backtrace-backtrace.rs":"0caac64486c0eb9c076553c0502d468fbc477602a9a2595165a1dcd95524e5ff","tests/ui/from-backtrace-backtrace.stderr":"e24156ae0828878f3282341732b6e032eaa8cb4b4db366a6b5437ed0731d40a7","tests/ui/from-not-source.rs":"a8dff2e92c21b1b97c48af89b7832bfb6b3bb4437a691bb882779e63fc792869","tests/ui/from-not-source.stderr":"525038e8b841707b927434cca4549168f73bd305faca17552a0d1fffa542ccc4","tests/ui/invalid-input-impl-anyway.rs":"6de91f71ddf038dffa3b9da33763a2ec3a5aa0047528e19ba998d5efe3aada5b","tests/ui/invalid-input-impl-anyway.stderr":"fa2725053cd87fc37f87546b377e6e5eed95c45e2a960863303b21a1935fdddb","tests/ui/lifetime.rs":"1da6748767b9a5b25ad7c013becb2e243b39c7c764cbdf00487794f6fc812890","tests/ui/lifetime.stderr":"d889a23f71324afe95dafc5f9d15337fbdbc9977cb8924f0cafe3a3becf4ced7","tests/ui/missing-display.rs":"c1fd1bc0ec0fb103d7f7b128837f717d49485662839899d570b3c983f1332888","tests/ui/missing-display.stderr":"9e7d3ad7da309dd2b420d50936c849c9b766d90553e357712b90437b6486b3c9","tests/ui/missing-fmt.rs":"bc9e2830e54c2474ff6c27a766ed3dee88d29e40f93f30e8d64d63233866c17d","tests/ui/missing-fmt.stderr":"9a20ccee9b660fe31a5b3199307b48580bb8305cb9ce33d97d3fc767a0cfc614","tests/ui/no-display.rs":"0525bbaf69d6badec85ad92dfe0dc9a4dcabb28a859f4caac40a52f1d37d9e25","tests/ui/no-display.stderr":"506a11a27e96b2d5a560fbb93cfddb22fc257ddafc08b047f612fafdf3f74eda","tests/ui/numbered-positional-tuple.rs":"7d000b1abcde04abcfe21bd592144e8cbcd953608895aef934d4655e2349e63a","tests/ui/numbered-positional-tuple.stderr":"58b2dde4578862b3d2ca9d8f309b05dbbce059e7b6bb8ad3096a702b0f63c5cf","tests/ui/raw-identifier.rs":"2593eb4bee6a2b20f36ccd08a7265f2e284a4f020f8381c325bb8fe630213e8d","tests/ui/raw-identifier.stderr":"0461c9c5a2f2630734822940d543df7f32cd4ed2e34bb323f6edbd13335dbf2f","tests/ui/same-from-type.rs":"6db0bcbe507f3204d6bc8d4cf382b9e36228bccaca01c199a89cd6df87bcae0c","tests/ui/same-from-type.stderr":"e0084050070564e7d22a13db8b401a145e4e3311ae5ac2f8f83b998cadd079a8","tests/ui/source-enum-not-error.rs":"3add5e7b4503d964bcae0848904822e1473c1d08c5a146c2df5347314ce1b8df","tests/ui/source-enum-not-error.stderr":"aeba0a8a0084833e470b6be2250370809f53c279ad603232af5302b9de9f8cce","tests/ui/source-enum-unnamed-field-not-error.rs":"a98989e908b84a8e6e6dceef02af7bdd1098a444d229950f67ed4f54d55c62e7","tests/ui/source-enum-unnamed-field-not-error.stderr":"579144cada6850a8a9b34f5ae4d36a5c19dfc4acf3dde78f57ffb5fe1a5e8da3","tests/ui/source-struct-not-error.rs":"09fb7713637242dca9192585a6daeb8d732dc1c1d0fa522b74f1c98618e6d949","tests/ui/source-struct-not-error.stderr":"b45eb66f078fec68d44feff1f8d6a676c341e9e9d9acb35daa58ec1ea20f9dae","tests/ui/source-struct-unnamed-field-not-error.rs":"eee605a9aafbb093666393e25cef4f7d7b8e90d518b9fadbdbed9685c66ccfcd","tests/ui/source-struct-unnamed-field-not-error.stderr":"2da577e0cb8ea8c7f0a2ae69c0f7db908432217c6290a72abba46a8f539982be","tests/ui/struct-with-fmt.rs":"a681659e0c161c8dd7b9f42e3ac026759ed085948cfb42458247eb96a2122a69","tests/ui/struct-with-fmt.stderr":"e560ce1e6a696b404f729ec317d6793ccb2a72fe8a508f0adb807b3982c1c9ff","tests/ui/transparent-display.rs":"b3c59583eb64b0b5a246444456d03cf52d51bcdc08885023600dbb44fd87e5f2","tests/ui/transparent-display.stderr":"16d538914e0d92026bde4b4bec75660217da9ecc6b621d12d2eb81d33ed1d1da","tests/ui/transparent-enum-many.rs":"2a40a764fb4683bff57973eec61507a6c00f7d4d7a32da6e7bd0190c2e445434","tests/ui/transparent-enum-many.stderr":"f1d78c1d6d8edbef153420db4fb9ca3dc6076fa043b5b1bc0cd291daa417a3ea","tests/ui/transparent-enum-not-error.rs":"f6315993e68bc71d6d4d39afa4d059695308ef785f92cc0d1df3e9ff55be2a9a","tests/ui/transparent-enum-not-error.stderr":"3a5fe056cd4566f402b03cb591394e0ba85bd74da53df3c8d50bda4a05c2e5ba","tests/ui/transparent-enum-source.rs":"18f606a98ac0a53f08dc56f5f923b9cbe75d25ed34479c777b48dac305d5968c","tests/ui/transparent-enum-source.stderr":"1b2e0ac53951034575d43ec0396c4e2b3cfb272db2aef8d6baa13a7e1632cc84","tests/ui/transparent-enum-unnamed-field-not-error.rs":"0c720567e9e0f87921055dfa9f607661725377633445e01a4b5048c7a7a50a85","tests/ui/transparent-enum-unnamed-field-not-error.stderr":"6d84e9a7f4e88daba12931a6c1508be60bb19125d06e44fa2fa205126d953bb1","tests/ui/transparent-struct-many.rs":"72c6b6c1a44c203d3bc68989b2f1ec092531ef75b745432824c3776c290326f6","tests/ui/transparent-struct-many.stderr":"7bd0536dbb54a0ce7d4a8e66ca7624a1b132d8a1d1e4fecca642ec77494ac01c","tests/ui/transparent-struct-not-error.rs":"fd814d3141c9182b1267b558d9daef8dd6e8b6462e1ad42b197f3a1c0703dce2","tests/ui/transparent-struct-not-error.stderr":"ac7634ea72096d8a5c1a91fd4f1b45ef870130a2698d9ae7c6530cec2f9799d5","tests/ui/transparent-struct-source.rs":"863fa691ed7d27e8767da58d9ee11fd40d6642274b36338ca1074c07964ea2b3","tests/ui/transparent-struct-source.stderr":"267dab65929e67d32347fb467a00b43af931f8205d727d7671938580217fc70e","tests/ui/transparent-struct-unnamed-field-not-error.rs":"fbff5874be44a5dcc347693d7929537256b187dfec467ed72c9968c095228d8d","tests/ui/transparent-struct-unnamed-field-not-error.stderr":"ea99d5422348c2588ad7374360e2a24649f040b9c5614c9308eff958f61960ec","tests/ui/unconditional-recursion.rs":"a6cc8c97a95644b4c5979fbc2fc5e18bdb58ff1e8a8ab471c9e3bb64a8ddddc4","tests/ui/unconditional-recursion.stderr":"7349acab2499b55cd48d86b8c0ac65b080225f3d43d6582653259d7b9e085a52","tests/ui/unexpected-field-fmt.rs":"29fba7b4d81c642ec8e47cfe053aa515acf9080a86d65e685363a48993becfe3","tests/ui/unexpected-field-fmt.stderr":"20731c4a08af04bed3ff513903adadd690b6bc532b15604557e7f25575a8338f","tests/ui/unexpected-struct-source.rs":"c6cbe882d622635c216feb8290b1bd536ce0ec4feee16bc087667a21b3641d5c","tests/ui/unexpected-struct-source.stderr":"7c8227513478f6cc09e8a28be337c8a0e758a06ca5978d774c91bd43c4a54043","tests/ui/union.rs":"331adff27cebd8b95b03b6742cc8247331fda1f961e1590ed39c8d39f50cf1d8","tests/ui/union.stderr":"5f67ad29753d6fb14bc03aef7d4a1f660ee7796e469c037efbf8b13456934ad3"},"package":"d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"}
\ No newline at end of file
diff --git a/crates/thiserror/Android.bp b/crates/thiserror/Android.bp
index f4f46b0..867ad28 100644
--- a/crates/thiserror/Android.bp
+++ b/crates/thiserror/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "thiserror",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.0.6",
+    cargo_pkg_version: "2.0.11",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
@@ -39,7 +39,7 @@
     name: "libthiserror_nostd",
     crate_name: "thiserror",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.0.6",
+    cargo_pkg_version: "2.0.11",
     crate_root: "src/lib.rs",
     edition: "2021",
     proc_macros: ["libthiserror_impl"],
diff --git a/crates/thiserror/Cargo.toml b/crates/thiserror/Cargo.toml
index 2b9714f..0280f35 100644
--- a/crates/thiserror/Cargo.toml
+++ b/crates/thiserror/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "thiserror"
-version = "2.0.6"
+version = "2.0.11"
 authors = ["David Tolnay <[email protected]>"]
 build = "build.rs"
 autolib = false
@@ -37,6 +37,10 @@
 rustdoc-args = ["--generate-link-to-definition"]
 targets = ["x86_64-unknown-linux-gnu"]
 
+[features]
+default = ["std"]
+std = []
+
 [lib]
 name = "thiserror"
 path = "src/lib.rs"
@@ -90,7 +94,7 @@
 path = "tests/test_transparent.rs"
 
 [dependencies.thiserror-impl]
-version = "=2.0.6"
+version = "=2.0.11"
 
 [dev-dependencies.anyhow]
 version = "1.0.73"
@@ -104,7 +108,3 @@
 [dev-dependencies.trybuild]
 version = "1.0.81"
 features = ["diff"]
-
-[features]
-default = ["std"]
-std = []
diff --git a/crates/thiserror/METADATA b/crates/thiserror/METADATA
index 785b081..f18a9a7 100644
--- a/crates/thiserror/METADATA
+++ b/crates/thiserror/METADATA
@@ -1,17 +1,17 @@
 name: "thiserror"
 description: "derive(Error)"
 third_party {
-  version: "2.0.6"
+  version: "2.0.11"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 12
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/thiserror"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/thiserror/thiserror-2.0.6.crate"
-    version: "2.0.6"
+    value: "https://static.crates.io/crates/thiserror/thiserror-2.0.11.crate"
+    version: "2.0.11"
   }
 }
diff --git a/crates/thiserror/src/lib.rs b/crates/thiserror/src/lib.rs
index 2110b94..99df8bf 100644
--- a/crates/thiserror/src/lib.rs
+++ b/crates/thiserror/src/lib.rs
@@ -259,7 +259,7 @@
 //!   [`anyhow`]: https://github.com/dtolnay/anyhow
 
 #![no_std]
-#![doc(html_root_url = "https://docs.rs/thiserror/2.0.6")]
+#![doc(html_root_url = "https://docs.rs/thiserror/2.0.11")]
 #![allow(
     clippy::module_name_repetitions,
     clippy::needless_lifetimes,
diff --git a/crates/thiserror/tests/test_backtrace.rs b/crates/thiserror/tests/test_backtrace.rs
index 2a4cffa..cc25676 100644
--- a/crates/thiserror/tests/test_backtrace.rs
+++ b/crates/thiserror/tests/test_backtrace.rs
@@ -1,3 +1,4 @@
+#![cfg(feature = "std")]
 #![cfg_attr(thiserror_nightly_testing, feature(error_generic_member_access))]
 
 use thiserror::Error;
diff --git a/crates/thiserror/tests/test_display.rs b/crates/thiserror/tests/test_display.rs
index 5ee6e36..71c4a4a 100644
--- a/crates/thiserror/tests/test_display.rs
+++ b/crates/thiserror/tests/test_display.rs
@@ -266,7 +266,7 @@
 }
 
 #[test]
-fn test_macro_rules() {
+fn test_macro_rules_variant_from_call_site() {
     // Regression test for https://github.com/dtolnay/thiserror/issues/86
 
     macro_rules! decl_error {
@@ -292,6 +292,30 @@
 }
 
 #[test]
+fn test_macro_rules_message_from_call_site() {
+    // Regression test for https://github.com/dtolnay/thiserror/issues/398
+
+    macro_rules! decl_error {
+        ($($errors:tt)*) => {
+            #[derive(Error, Debug)]
+            pub enum Error {
+                $($errors)*
+            }
+        };
+    }
+
+    decl_error! {
+        #[error("{0}")]
+        Unnamed(u8),
+        #[error("{x}")]
+        Named { x: u8 },
+    }
+
+    assert("0", Error::Unnamed(0));
+    assert("0", Error::Named { x: 0 });
+}
+
+#[test]
 fn test_raw() {
     #[derive(Error, Debug)]
     #[error("braced raw error: {fn}")]
diff --git a/crates/thiserror/tests/test_expr.rs b/crates/thiserror/tests/test_expr.rs
index 4252280..1872fb5 100644
--- a/crates/thiserror/tests/test_expr.rs
+++ b/crates/thiserror/tests/test_expr.rs
@@ -1,6 +1,7 @@
 #![allow(clippy::iter_cloned_collect, clippy::uninlined_format_args)]
 
 use core::fmt::Display;
+#[cfg(feature = "std")]
 use std::path::PathBuf;
 use thiserror::Error;
 
@@ -90,6 +91,7 @@
 }
 
 // Regression test for https://github.com/dtolnay/thiserror/issues/335
+#[cfg(feature = "std")]
 #[test]
 #[allow(non_snake_case)]
 fn test_assoc_type_equality_constraint() {
diff --git a/crates/thiserror/tests/test_generics.rs b/crates/thiserror/tests/test_generics.rs
index 36f1181..bcbfee0 100644
--- a/crates/thiserror/tests/test_generics.rs
+++ b/crates/thiserror/tests/test_generics.rs
@@ -1,6 +1,7 @@
 #![allow(clippy::needless_late_init, clippy::uninlined_format_args)]
 
 use core::fmt::{self, Debug, Display};
+use core::str::FromStr;
 use thiserror::Error;
 
 pub struct NoFormat;
@@ -160,6 +161,24 @@
 #[error(transparent)]
 pub struct StructTransparentGeneric<E>(pub E);
 
+// Should expand to:
+//
+//     impl<T: FromStr> Display for AssociatedTypeError<T>
+//     where
+//         T::Err: Display;
+//
+//     impl<T: FromStr> Error for AssociatedTypeError<T>
+//     where
+//         Self: Debug + Display;
+//
+#[derive(Error, Debug)]
+pub enum AssociatedTypeError<T: FromStr> {
+    #[error("couldn't parse matrix")]
+    Other,
+    #[error("couldn't parse entry: {0}")]
+    EntryParseError(T::Err),
+}
+
 // Regression test for https://github.com/dtolnay/thiserror/issues/345
 #[test]
 fn test_no_bound_on_named_fmt() {
diff --git a/crates/thiserror/tests/test_lints.rs b/crates/thiserror/tests/test_lints.rs
index d272454..af5830d 100644
--- a/crates/thiserror/tests/test_lints.rs
+++ b/crates/thiserror/tests/test_lints.rs
@@ -5,6 +5,17 @@
 pub use std::error::Error;
 
 #[test]
+fn test_allow_attributes() {
+    #![deny(clippy::allow_attributes)]
+
+    #[derive(Error, Debug)]
+    #[error("...")]
+    pub struct MyError(#[from] anyhow::Error);
+
+    let _: MyError;
+}
+
+#[test]
 fn test_unused_qualifications() {
     #![deny(unused_qualifications)]
 
diff --git a/crates/thiserror/tests/test_option.rs b/crates/thiserror/tests/test_option.rs
index fbdbec0..21cd5e1 100644
--- a/crates/thiserror/tests/test_option.rs
+++ b/crates/thiserror/tests/test_option.rs
@@ -1,3 +1,4 @@
+#![cfg(feature = "std")]
 #![cfg_attr(thiserror_nightly_testing, feature(error_generic_member_access))]
 
 #[cfg(thiserror_nightly_testing)]
diff --git a/crates/thiserror/tests/test_path.rs b/crates/thiserror/tests/test_path.rs
index 5bb6972..fa85c1d 100644
--- a/crates/thiserror/tests/test_path.rs
+++ b/crates/thiserror/tests/test_path.rs
@@ -1,3 +1,5 @@
+#![cfg(feature = "std")]
+
 use core::fmt::Display;
 use ref_cast::RefCast;
 use std::path::{Path, PathBuf};
diff --git a/crates/thiserror/tests/ui/same-from-type.rs b/crates/thiserror/tests/ui/same-from-type.rs
index bc32b07..0ebdf45 100644
--- a/crates/thiserror/tests/ui/same-from-type.rs
+++ b/crates/thiserror/tests/ui/same-from-type.rs
@@ -5,7 +5,7 @@
     #[error("failed to open")]
     OpenFile(#[from] std::io::Error),
     #[error("failed to close")]
-    CloseFIle(#[from] std::io::Error),
+    CloseFile(#[from] std::io::Error),
 }
 
 fn main() {}
diff --git a/crates/thiserror/tests/ui/same-from-type.stderr b/crates/thiserror/tests/ui/same-from-type.stderr
index 92944d2..a655163 100644
--- a/crates/thiserror/tests/ui/same-from-type.stderr
+++ b/crates/thiserror/tests/ui/same-from-type.stderr
@@ -4,5 +4,5 @@
 6 |     OpenFile(#[from] std::io::Error),
   |              ------- first implementation here
 7 |     #[error("failed to close")]
-8 |     CloseFIle(#[from] std::io::Error),
+8 |     CloseFile(#[from] std::io::Error),
   |               ^^^^^^^ conflicting implementation for `Error`
diff --git a/crates/tokio-macros/.android-checksum.json b/crates/tokio-macros/.android-checksum.json
index 5eaa7ff..7722686 100644
--- a/crates/tokio-macros/.android-checksum.json
+++ b/crates/tokio-macros/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"fafc23809d37c73ec55bbdb86b700e99a331542a184a513e660ad7a32fb6e31c","Android.bp":"029635376bf54196c43f76b38104b5e8edb3de48ece1e1778d54bad6ba8fa17b","CHANGELOG.md":"92d0642557a975637a70f80250cbbf3c426fe9274e95ec4bc41548568d8a657a","Cargo.toml":"01943f768c32760f73cb1a13cd82af1f6cf5591452dd0735770d75f7bcabcdef","LICENSE":"a17ab14c797e7b65c15985982ee00d3dcee1fefb8aac87dbae76a710ba2913a2","METADATA":"4f6c316626a64e642eca02df0b04697bff463499039382f8bc03734b72204477","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"2ce5d67bfab53489bb3351d5e5dbdf05f7b073c45e765ca77381bc12ee5a26f4","TEST_MAPPING":"c024977f1d74e9c72b87573f1c7cfe9a7f8d1daadb084005fb7edf55d17c0d6c","cargo_embargo.json":"e37f85d7910d24b95d6031db6603828d484aadca5822522d571d9c334ef6f3aa","src/entry.rs":"7ca7bd35b1bdaa13e955bf865317b875c4dcdb955f337ba0cf648b2d2e340e30","src/lib.rs":"2170b0828f20e4b3c59d529b0df9d4fffb80015d1c293966c96520eef98422bf","src/select.rs":"c01fc21a478c7b859926771c97697faf8d40ff4d0b8cb44e0be9a3aa35ecf38e"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"02cc2d46c1e5b2a0a98ee9ff0347f16eee74c93db5f923d328fbcd42f517449a","Android.bp":"661f146f5e57fcfd053942222994398a496216f339dc9d5cd388fb2020c722f8","CHANGELOG.md":"09121d23efd7af8690cd56e999954ded88ae7d5788462ef47cd73ea6ce6e0a48","Cargo.toml":"bbf4c19cd5f40b6f6dcd633d14f0e29c6e129cee48482106c0cabe2f382996e8","LICENSE":"a17ab14c797e7b65c15985982ee00d3dcee1fefb8aac87dbae76a710ba2913a2","METADATA":"9fdf318b8593e25d70164562c0dd4afc5a7b352cdc83788d7f4822be1f93dccd","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"2ce5d67bfab53489bb3351d5e5dbdf05f7b073c45e765ca77381bc12ee5a26f4","TEST_MAPPING":"c024977f1d74e9c72b87573f1c7cfe9a7f8d1daadb084005fb7edf55d17c0d6c","cargo_embargo.json":"e37f85d7910d24b95d6031db6603828d484aadca5822522d571d9c334ef6f3aa","src/entry.rs":"99011f43ee7a6aced620edff7f48d075aca12eede42a0d1d2d247959f84e2fd2","src/lib.rs":"ecf3c91e8649b688e48c3d968947b1b1dc4b84a099ff953cb2a8b35f6f19c20f","src/select.rs":"ec926a6b0b4e7dabffc8e49da4ab21549d623131373a735bc3312c29c7d2eeeb"}}
\ No newline at end of file
diff --git a/crates/tokio-macros/.cargo-checksum.json b/crates/tokio-macros/.cargo-checksum.json
index 65d2000..c101d98 100644
--- a/crates/tokio-macros/.cargo-checksum.json
+++ b/crates/tokio-macros/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"bc308e94c0a0c9a8c595fdb708dec60d08dca5f4fc67b64287676b619675f91b","Cargo.toml":"b86acb2f048fd43ade67bc01187f9eea2df4855a0261102cca651453a23d5cba","LICENSE":"0b83dc40cba89b9922bb84b0a9c7d2768ce37c1d7e138b7424fd4549915778c9","README.md":"6094ea500349ce239a12b07d7dfd4ea965a7f14c993da2abc4b3c39a0479683a","src/entry.rs":"4b7e392119553a795508aaf021eac5311da50702ac47f536753f8c8e7141593a","src/lib.rs":"b146a3bcf92aaf042e0ff7fd5387b69bc9882d2b5e0ab70298df83ee54ad6d7c","src/select.rs":"8fdef69056b4c24d109439e68535b51c0781505c4b6fc49cacf10d32097c54f1"},"package":"693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"556610ed3cd61018dae1a3062267246682e0dd605212e075be8109945e234f28","Cargo.toml":"7b971193559c96cd4a27accd0ef6cb06be1934469ae3b689f18b8ce3950ebae8","LICENSE":"0b83dc40cba89b9922bb84b0a9c7d2768ce37c1d7e138b7424fd4549915778c9","README.md":"6094ea500349ce239a12b07d7dfd4ea965a7f14c993da2abc4b3c39a0479683a","src/entry.rs":"7855d3c594f1611d16ee7c9354af479c7e8451a405e8cb1d751de3ed9db8336d","src/lib.rs":"aa212b0b82497eed55f0fac4a210e74ca7c1d49e5d717932e8f3b8ce48105460","src/select.rs":"a8af3f0dbc3ac3102081abc09ab1a1a8bfaab5fde1331b20ab397384be730fef"},"package":"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"}
\ No newline at end of file
diff --git a/crates/tokio-macros/Android.bp b/crates/tokio-macros/Android.bp
index 0d62301..e812963 100644
--- a/crates/tokio-macros/Android.bp
+++ b/crates/tokio-macros/Android.bp
@@ -17,7 +17,7 @@
     name: "libtokio_macros",
     crate_name: "tokio_macros",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.4.0",
+    cargo_pkg_version: "2.5.0",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
diff --git a/crates/tokio-macros/CHANGELOG.md b/crates/tokio-macros/CHANGELOG.md
index 9b30d34..5dac1ff 100644
--- a/crates/tokio-macros/CHANGELOG.md
+++ b/crates/tokio-macros/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 2.5.0 (Jan 8th, 2025)
+
+- macros: suppress `clippy::needless_return` in `#[tokio::main]` ([#6874])
+
+[#6874]: https://github.com/tokio-rs/tokio/pull/6874
+
 # 2.4.0 (July 22nd, 2024)
 
 - msrv: increase MSRV to 1.70 ([#6645])
diff --git a/crates/tokio-macros/Cargo.toml b/crates/tokio-macros/Cargo.toml
index f789a1c..f2310a6 100644
--- a/crates/tokio-macros/Cargo.toml
+++ b/crates/tokio-macros/Cargo.toml
@@ -13,8 +13,13 @@
 edition = "2021"
 rust-version = "1.70"
 name = "tokio-macros"
-version = "2.4.0"
+version = "2.5.0"
 authors = ["Tokio Contributors <[email protected]>"]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 Tokio's proc macros.
 """
@@ -28,6 +33,8 @@
 all-features = true
 
 [lib]
+name = "tokio_macros"
+path = "src/lib.rs"
 proc-macro = true
 
 [dependencies.proc-macro2]
diff --git a/crates/tokio-macros/METADATA b/crates/tokio-macros/METADATA
index 7a22f81..4d863de 100644
--- a/crates/tokio-macros/METADATA
+++ b/crates/tokio-macros/METADATA
@@ -1,17 +1,17 @@
 name: "tokio-macros"
 description: "Tokio\'s proc macros."
 third_party {
-  version: "2.4.0"
+  version: "2.5.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 4
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/tokio-macros"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/tokio-macros/tokio-macros-2.4.0.crate"
-    version: "2.4.0"
+    value: "https://static.crates.io/crates/tokio-macros/tokio-macros-2.5.0.crate"
+    version: "2.5.0"
   }
 }
diff --git a/crates/tokio-macros/src/entry.rs b/crates/tokio-macros/src/entry.rs
index acdc261..07554cf 100644
--- a/crates/tokio-macros/src/entry.rs
+++ b/crates/tokio-macros/src/entry.rs
@@ -20,7 +20,7 @@
             "single_thread" => Err("The single threaded runtime flavor is called `current_thread`.".to_string()),
             "basic_scheduler" => Err("The `basic_scheduler` runtime flavor has been renamed to `current_thread`.".to_string()),
             "threaded_scheduler" => Err("The `threaded_scheduler` runtime flavor has been renamed to `multi_thread`.".to_string()),
-            _ => Err(format!("No such runtime flavor `{}`. The runtime flavors are `current_thread` and `multi_thread`.", s)),
+            _ => Err(format!("No such runtime flavor `{s}`. The runtime flavors are `current_thread` and `multi_thread`.")),
         }
     }
 }
@@ -36,7 +36,7 @@
         match s {
             "ignore" => Ok(UnhandledPanic::Ignore),
             "shutdown_runtime" => Ok(UnhandledPanic::ShutdownRuntime),
-            _ => Err(format!("No such unhandled panic behavior `{}`. The unhandled panic behaviors are `ignore` and `shutdown_runtime`.", s)),
+            _ => Err(format!("No such unhandled panic behavior `{s}`. The unhandled panic behaviors are `ignore` and `shutdown_runtime`.")),
         }
     }
 
@@ -239,12 +239,12 @@
             Ok(value) => Ok(value),
             Err(e) => Err(syn::Error::new(
                 span,
-                format!("Failed to parse value of `{}` as integer: {}", field, e),
+                format!("Failed to parse value of `{field}` as integer: {e}"),
             )),
         },
         _ => Err(syn::Error::new(
             span,
-            format!("Failed to parse value of `{}` as integer.", field),
+            format!("Failed to parse value of `{field}` as integer."),
         )),
     }
 }
@@ -255,7 +255,7 @@
         syn::Lit::Verbatim(s) => Ok(s.to_string()),
         _ => Err(syn::Error::new(
             span,
-            format!("Failed to parse value of `{}` as string.", field),
+            format!("Failed to parse value of `{field}` as string."),
         )),
     }
 }
@@ -275,7 +275,7 @@
         }
         _ => Err(syn::Error::new(
             span,
-            format!("Failed to parse value of `{}` as path.", field),
+            format!("Failed to parse value of `{field}` as path."),
         )),
     }
 }
@@ -285,7 +285,7 @@
         syn::Lit::Bool(b) => Ok(b.value),
         _ => Err(syn::Error::new(
             span,
-            format!("Failed to parse value of `{}` as bool.", field),
+            format!("Failed to parse value of `{field}` as bool."),
         )),
     }
 }
@@ -342,8 +342,7 @@
                     }
                     name => {
                         let msg = format!(
-                            "Unknown attribute {} is specified; expected one of: `flavor`, `worker_threads`, `start_paused`, `crate`, `unhandled_panic`",
-                            name,
+                            "Unknown attribute {name} is specified; expected one of: `flavor`, `worker_threads`, `start_paused`, `crate`, `unhandled_panic`",
                         );
                         return Err(syn::Error::new_spanned(namevalue, msg));
                     }
@@ -358,21 +357,19 @@
                 let msg = match name.as_str() {
                     "threaded_scheduler" | "multi_thread" => {
                         format!(
-                            "Set the runtime flavor with #[{}(flavor = \"multi_thread\")].",
-                            macro_name
+                            "Set the runtime flavor with #[{macro_name}(flavor = \"multi_thread\")]."
                         )
                     }
                     "basic_scheduler" | "current_thread" | "single_threaded" => {
                         format!(
-                            "Set the runtime flavor with #[{}(flavor = \"current_thread\")].",
-                            macro_name
+                            "Set the runtime flavor with #[{macro_name}(flavor = \"current_thread\")]."
                         )
                     }
                     "flavor" | "worker_threads" | "start_paused" | "crate" | "unhandled_panic" => {
-                        format!("The `{}` attribute requires an argument.", name)
+                        format!("The `{name}` attribute requires an argument.")
                     }
                     name => {
-                        format!("Unknown attribute {} is specified; expected one of: `flavor`, `worker_threads`, `start_paused`, `crate`, `unhandled_panic`.", name)
+                        format!("Unknown attribute {name} is specified; expected one of: `flavor`, `worker_threads`, `start_paused`, `crate`, `unhandled_panic`.")
                     }
                 };
                 return Err(syn::Error::new_spanned(path, msg));
@@ -438,8 +435,9 @@
     };
 
     let body_ident = quote! { body };
+    // This explicit `return` is intentional. See tokio-rs/tokio#4636
     let last_block = quote_spanned! {last_stmt_end_span=>
-        #[allow(clippy::expect_used, clippy::diverging_sub_expression)]
+        #[allow(clippy::expect_used, clippy::diverging_sub_expression, clippy::needless_return)]
         {
             return #rt
                 .enable_all()
diff --git a/crates/tokio-macros/src/lib.rs b/crates/tokio-macros/src/lib.rs
index b5d31c7..29ea286 100644
--- a/crates/tokio-macros/src/lib.rs
+++ b/crates/tokio-macros/src/lib.rs
@@ -211,6 +211,7 @@
 /// This option is only compatible with the `current_thread` runtime.
 ///
 /// ```no_run
+/// # #![allow(unknown_lints, unexpected_cfgs)]
 /// #[cfg(tokio_unstable)]
 /// #[tokio::main(flavor = "current_thread", unhandled_panic = "shutdown_runtime")]
 /// async fn main() {
@@ -225,6 +226,7 @@
 /// Equivalent code not using `#[tokio::main]`
 ///
 /// ```no_run
+/// # #![allow(unknown_lints, unexpected_cfgs)]
 /// #[cfg(tokio_unstable)]
 /// fn main() {
 ///     tokio::runtime::Builder::new_current_thread()
@@ -478,6 +480,7 @@
 /// This option is only compatible with the `current_thread` runtime.
 ///
 /// ```no_run
+/// # #![allow(unknown_lints, unexpected_cfgs)]
 /// #[cfg(tokio_unstable)]
 /// #[tokio::test(flavor = "current_thread", unhandled_panic = "shutdown_runtime")]
 /// async fn my_test() {
@@ -492,6 +495,7 @@
 /// Equivalent code not using `#[tokio::test]`
 ///
 /// ```no_run
+/// # #![allow(unknown_lints, unexpected_cfgs)]
 /// #[cfg(tokio_unstable)]
 /// #[test]
 /// fn my_test() {
diff --git a/crates/tokio-macros/src/select.rs b/crates/tokio-macros/src/select.rs
index 324b8f9..0ef6cfb 100644
--- a/crates/tokio-macros/src/select.rs
+++ b/crates/tokio-macros/src/select.rs
@@ -11,7 +11,7 @@
     };
 
     let variants = (0..branches)
-        .map(|num| Ident::new(&format!("_{}", num), Span::call_site()))
+        .map(|num| Ident::new(&format!("_{num}"), Span::call_site()))
         .collect::<Vec<_>>();
 
     // Use a bitfield to track which futures completed
diff --git a/crates/tracing-core/.android-checksum.json b/crates/tracing-core/.android-checksum.json
index 5b26783..1c7c51e 100644
--- a/crates/tracing-core/.android-checksum.json
+++ b/crates/tracing-core/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"a5931a8746d6eb5854c4f4dd7b5b87914f3b1239a6f917b96daadc865f6be020","Android.bp":"5ae93e54f6657c0f7b15ef8adeffef16a763434eac1757d30efe7f5ac7035f17","CHANGELOG.md":"4a615ccc8f604e89097b8839d60594051f4a587142ec628fd1a8e452e4b75be5","Cargo.toml":"ea3cb8679acc41b31e927a8ae6daac62782b37c26f2417eea1c93d4084e2a8ff","LICENSE":"81b5afff24bf73e7d6660ff9e03a493ba57f494dad837134a654b3945a3199d7","METADATA":"fc707500582db3622674d8497141c9d5ba5575c12cb19985b1666c337928cfae","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"fa36cb03f0e2232b03ae20c689f76fcfa0164d3bafe316ad579660106004b881","TEST_MAPPING":"704033c7d7f45c6a99e2cf1a1115c0c333e2603b7220f483bdb179d40f5d2980","cargo_embargo.json":"4ddd8358d79bc3ec472e58f0e295a8006b443eb4db00a52da3afafbc7cc5bd11","src/callsite.rs":"1282bbaf7090a564eb63323cc95fbb991f5b9290b123d4babbe274c73e467de3","src/dispatcher.rs":"4ec81a1cf38773f389623c28092c6c43a16ca0cc84a69ea63bba5848dd0538e4","src/event.rs":"bdd69cbccc2b6940f31c70ff3021956eba5113902c55a7259fb6b381d0273eac","src/field.rs":"23f0d9cefed92cc2395c1c29b27b9db823134dc7442acb25f639dcb4a430700e","src/lazy.rs":"2dd856721f3731f51efbff05c05d42fb5cb46ffe64d2b653ce054d2ccf7bcca4","src/lib.rs":"38c17f6d9f62e52ae3b09e894f921fbe5e642e7f2b867286032bc72ae82d6842","src/metadata.rs":"17d2216089292b495cfba1424802be7289c2f574a573d3885abd6475a137c8f0","src/parent.rs":"64808c21ae93bb80079504ab8de09c26478fbded7d6b7bc59d0bf60e707d3924","src/span.rs":"2d44f4ab124f760e48783678f231ddc8648c561abdff50af93c17d59af5eb2f2","src/spin/LICENSE":"88b2256ca5a6436d06c356182cc3a7d96001ff1c5e589a5fb1389df349dc88db","src/spin/mod.rs":"aa4fb3264d71b15e01d3a3892d4fb6e4733aff3f29e59a0553cbee810c91e41c","src/spin/mutex.rs":"cc07680d8594fc347df312dfc98815f75b8b6e8200ef9ef648b09303251f1048","src/spin/once.rs":"45271adc68ef4ef30fb6ad6a6e71ec9f949e235c0ef549a7df510fa9e81cb33a","src/stdlib.rs":"4a22d5ba8b601331161cfdc96ebe7a2ab7946b4e359ebe228ae121f8d8b26de8","src/subscriber.rs":"a4592cea08396d2256d2bdad399f6b5b64138fa025c0e428b3d61a8e7cfdd7b0","tests/common/mod.rs":"08e619aede8f777d9d7afe3213d1aee19975f7231cc4e2a31fe8aac64ace0a37","tests/dispatch.rs":"302ecf444f9f97dbed98860a1fcc3b78bbf913888f5e7ab2ff56e32013c694a4","tests/global_dispatch.rs":"c05b0a5019baa302f2f138064f72a0c556429092e76ecc79bc17e9c29f321777","tests/local_dispatch_before_init.rs":"b8f9490bfcc09efe5769489f2698da716c6420a3aa29cb1601494ca238f97b55","tests/macros.rs":"f7c49d00ab05d2c3d826790a65dd02e8d6f3c03683acaec5b44015709e4fb7f4"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"33bef475fcd2aff93d3a734a76c46287f2c2c2794c2b44eee92c59dec7640089","Android.bp":"c5f1955c1b1ecad79608d1eac34d091996762561bba28000d13fcfd2541f913a","CHANGELOG.md":"c542c47dcdce0f2ae1f0704f7248a8667f529f738bb507a4d9ba53ed4df87e4a","Cargo.toml":"fe6f275a57654dba28b6200cc23241211046f44ebd061ae3d8a97038e02e0da5","LICENSE":"81b5afff24bf73e7d6660ff9e03a493ba57f494dad837134a654b3945a3199d7","METADATA":"142f0858ebd6777ec2dbade702de005c8c7c757ac8840f8c1100675c115c60e9","MODULE_LICENSE_MIT":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"bda66c2feeee6c4926ac25c50703674504ed3f937e6c6e5f249304c67bab3511","TEST_MAPPING":"704033c7d7f45c6a99e2cf1a1115c0c333e2603b7220f483bdb179d40f5d2980","cargo_embargo.json":"4ddd8358d79bc3ec472e58f0e295a8006b443eb4db00a52da3afafbc7cc5bd11","src/callsite.rs":"7eee7d857cf8365307c3c510cf03b5be867ccf7fd394c72dea388e2d8c2e06f7","src/dispatcher.rs":"4cf26e32842c9e6faf2f89617f19cf626d0af0c91f91f987da1b9f498a1235d6","src/event.rs":"bdd69cbccc2b6940f31c70ff3021956eba5113902c55a7259fb6b381d0273eac","src/field.rs":"554563d29b2fa88c259a240a0254bdc1cc54019a1b4fe1c600dab21433b9bb48","src/lazy.rs":"2dd856721f3731f51efbff05c05d42fb5cb46ffe64d2b653ce054d2ccf7bcca4","src/lib.rs":"6fa735052cb8b8dd3227ac3ec2fecca36d099cc05918bebb075cb0a6b737a94d","src/metadata.rs":"fdaa30a7e84f8d937d27b7d16e8e6bd3c4e9ff946329293e7c1231ac2bdde338","src/parent.rs":"64808c21ae93bb80079504ab8de09c26478fbded7d6b7bc59d0bf60e707d3924","src/span.rs":"2d44f4ab124f760e48783678f231ddc8648c561abdff50af93c17d59af5eb2f2","src/spin/LICENSE":"88b2256ca5a6436d06c356182cc3a7d96001ff1c5e589a5fb1389df349dc88db","src/spin/mod.rs":"aa4fb3264d71b15e01d3a3892d4fb6e4733aff3f29e59a0553cbee810c91e41c","src/spin/mutex.rs":"cc07680d8594fc347df312dfc98815f75b8b6e8200ef9ef648b09303251f1048","src/spin/once.rs":"45271adc68ef4ef30fb6ad6a6e71ec9f949e235c0ef549a7df510fa9e81cb33a","src/stdlib.rs":"4a22d5ba8b601331161cfdc96ebe7a2ab7946b4e359ebe228ae121f8d8b26de8","src/subscriber.rs":"a4592cea08396d2256d2bdad399f6b5b64138fa025c0e428b3d61a8e7cfdd7b0","tests/common/mod.rs":"08e619aede8f777d9d7afe3213d1aee19975f7231cc4e2a31fe8aac64ace0a37","tests/dispatch.rs":"302ecf444f9f97dbed98860a1fcc3b78bbf913888f5e7ab2ff56e32013c694a4","tests/global_dispatch.rs":"c05b0a5019baa302f2f138064f72a0c556429092e76ecc79bc17e9c29f321777","tests/local_dispatch_before_init.rs":"b8f9490bfcc09efe5769489f2698da716c6420a3aa29cb1601494ca238f97b55","tests/macros.rs":"f7c49d00ab05d2c3d826790a65dd02e8d6f3c03683acaec5b44015709e4fb7f4","tests/missed_register_callsite.rs":"e6cae36eda5f7e303de89d426c0cf8f19fbd1d5803104bf9f8eda5542e7b59ef"}}
\ No newline at end of file
diff --git a/crates/tracing-core/.cargo-checksum.json b/crates/tracing-core/.cargo-checksum.json
index a445372..783cf59 100644
--- a/crates/tracing-core/.cargo-checksum.json
+++ b/crates/tracing-core/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"5c72ced3c4b609b6121b0ca5f980f8292f8b542d3f11c7b97581f23fd6ab7e1b","Cargo.toml":"7ae6601ad9768415a61eba2be6c82e30c71c6d3c76561f230ce6eafa2e66255f","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"0ace2b660151cc4aa04d954daef0b60151c2f797d695dfb0b78d931f497c82ac","src/callsite.rs":"83789dd16601faa675e2c75e1bbfe1512c2d4b405b880bf99db2a6f6bbb15363","src/dispatcher.rs":"2a751f9256e8418105d1f7134fd80500f39b920c8a17b02eaf3dcd701d1737ad","src/event.rs":"f2673bf5d266972e567e521c9cd92fb33f28b0c7e010937e3bc2bf9eb483087f","src/field.rs":"0f7ec541d932beae7ee67d0fcb09cfeabacdcb4ee6310a7b20f9fb07a75e091f","src/lazy.rs":"318e3558e4446abf26294287167c0788e343044a28072f9217bd985929809087","src/lib.rs":"d0f56d6d890f721e1d769376f500dc3e80b7ac969330c98049c344fda47a107a","src/metadata.rs":"319e8a80804c7e927595e73d2139c027b2c4d58887af4a95ab2bb3411e7ab3d1","src/parent.rs":"5d5ad733343280a64a1feb6a008e186c39305ec554f14279012b8d7915821471","src/span.rs":"dcf2135e4ca158c1be45007f0be25426c375a4081f8f3c5a4d7f7382d8a950a4","src/spin/LICENSE":"58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79","src/spin/mod.rs":"c458ce5e875acb7fbfb279f23254f4924d7c6d6fee419b740800d2e8087d1524","src/spin/mutex.rs":"4d30ff2b59b18fd7909f016e1abdf9aa0c04aa11d047a46e98cffe1319e32dad","src/spin/once.rs":"3781fd4eae0db04d80c03a039906c99b1e01d1583b29ac0144e6fbbd5a0fef0b","src/stdlib.rs":"698693062b8109cace3ffea02e9c2372b7d5b5d43c0b11cb4800b0e7b1a69971","src/subscriber.rs":"c7b6d52633e479bcad50fc30e1bf596339e575533761d269498cfc79e99020ef","tests/common/mod.rs":"0bbb217baa17df0f96cc1ff57dfa74ccc5a959e7f66b15bb7d25d5f43358a278","tests/dispatch.rs":"d3f000fab43734a854c82a7783142910c5e79f806cbd3f8ec5eded598c59ddb1","tests/global_dispatch.rs":"cdc05d77e448ee8b50bfb930abafa3f19b4c6f922b7bebc7797fa1dbdaa1d398","tests/local_dispatch_before_init.rs":"338846cd519e9a3a6895f958b11bd3f97e4350d08adb50f95b8552113a593b0d","tests/macros.rs":"b1603d888b349c8d103794deceec3b1ae4538b8d3eba805f3f561899e8ad0dd2"},"package":"c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"262f834f190937393a9f1b1bb477495d44b4f6281c37d4afa2bf1851e6bb4bc6","Cargo.toml":"a82d888a16b81163af0264a7c5c59349dde16301969c2cc042267c35a9b1d6e2","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"93ab4db7061cdcf30ff13549c3a79ff650f7b458b8d0b593b0de527eb81019b8","src/callsite.rs":"65db0d8920bff49834af9060ea899d7e993a5c9a23c728d3a444c56d679bf160","src/dispatcher.rs":"5d7b44bfdf1912bbbf3d19f5b6a481eedaaa4c2544bbc9536719c463d1ceb602","src/event.rs":"f2673bf5d266972e567e521c9cd92fb33f28b0c7e010937e3bc2bf9eb483087f","src/field.rs":"2c1b4f9d89c973bb7bd006e4a3efd038d71a52444b3eeaf550c1b95e9157dbde","src/lazy.rs":"318e3558e4446abf26294287167c0788e343044a28072f9217bd985929809087","src/lib.rs":"6cb4ebe77b5e8e2ea0825fd92922e0d2af221fa931aafe8fc68cd00cce9c918d","src/metadata.rs":"abd9bd7e2965d5d9c21f04944c6779f558cee2b945fd4bbfb0af1e2a79b121cb","src/parent.rs":"5d5ad733343280a64a1feb6a008e186c39305ec554f14279012b8d7915821471","src/span.rs":"dcf2135e4ca158c1be45007f0be25426c375a4081f8f3c5a4d7f7382d8a950a4","src/spin/LICENSE":"58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79","src/spin/mod.rs":"c458ce5e875acb7fbfb279f23254f4924d7c6d6fee419b740800d2e8087d1524","src/spin/mutex.rs":"4d30ff2b59b18fd7909f016e1abdf9aa0c04aa11d047a46e98cffe1319e32dad","src/spin/once.rs":"3781fd4eae0db04d80c03a039906c99b1e01d1583b29ac0144e6fbbd5a0fef0b","src/stdlib.rs":"698693062b8109cace3ffea02e9c2372b7d5b5d43c0b11cb4800b0e7b1a69971","src/subscriber.rs":"c7b6d52633e479bcad50fc30e1bf596339e575533761d269498cfc79e99020ef","tests/common/mod.rs":"0bbb217baa17df0f96cc1ff57dfa74ccc5a959e7f66b15bb7d25d5f43358a278","tests/dispatch.rs":"d3f000fab43734a854c82a7783142910c5e79f806cbd3f8ec5eded598c59ddb1","tests/global_dispatch.rs":"cdc05d77e448ee8b50bfb930abafa3f19b4c6f922b7bebc7797fa1dbdaa1d398","tests/local_dispatch_before_init.rs":"338846cd519e9a3a6895f958b11bd3f97e4350d08adb50f95b8552113a593b0d","tests/macros.rs":"b1603d888b349c8d103794deceec3b1ae4538b8d3eba805f3f561899e8ad0dd2","tests/missed_register_callsite.rs":"c8af23ec5ac08a2c5dffe8b39f96d67a785d113f52d721e46417d2c85f8fc8fe"},"package":"e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"}
\ No newline at end of file
diff --git a/crates/tracing-core/Android.bp b/crates/tracing-core/Android.bp
index 73d9a08..35a13e9 100644
--- a/crates/tracing-core/Android.bp
+++ b/crates/tracing-core/Android.bp
@@ -18,14 +18,13 @@
     host_supported: true,
     crate_name: "tracing_core",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
         "default",
         "once_cell",
         "std",
-        "valuable",
     ],
     rustlibs: ["libonce_cell"],
     apex_available: [
@@ -42,7 +41,7 @@
     host_supported: true,
     crate_name: "tracing_core",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "src/lib.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -54,7 +53,6 @@
         "default",
         "once_cell",
         "std",
-        "valuable",
     ],
     rustlibs: ["libonce_cell"],
 }
@@ -64,7 +62,7 @@
     host_supported: true,
     crate_name: "dispatch",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "tests/dispatch.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -76,7 +74,6 @@
         "default",
         "once_cell",
         "std",
-        "valuable",
     ],
     rustlibs: [
         "libonce_cell",
@@ -89,7 +86,7 @@
     host_supported: true,
     crate_name: "global_dispatch",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "tests/global_dispatch.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -101,7 +98,6 @@
         "default",
         "once_cell",
         "std",
-        "valuable",
     ],
     rustlibs: [
         "libonce_cell",
@@ -114,7 +110,7 @@
     host_supported: true,
     crate_name: "local_dispatch_before_init",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "tests/local_dispatch_before_init.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -126,7 +122,6 @@
         "default",
         "once_cell",
         "std",
-        "valuable",
     ],
     rustlibs: [
         "libonce_cell",
@@ -139,7 +134,7 @@
     host_supported: true,
     crate_name: "macros",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.32",
+    cargo_pkg_version: "0.1.33",
     crate_root: "tests/macros.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -151,7 +146,30 @@
         "default",
         "once_cell",
         "std",
-        "valuable",
+    ],
+    rustlibs: [
+        "libonce_cell",
+        "libtracing_core",
+    ],
+}
+
+rust_test {
+    name: "tracing-core_test_tests_missed_register_callsite",
+    host_supported: true,
+    crate_name: "missed_register_callsite",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.1.33",
+    crate_root: "tests/missed_register_callsite.rs",
+    test_suites: ["general-tests"],
+    auto_gen_config: true,
+    test_options: {
+        unit_test: true,
+    },
+    edition: "2018",
+    features: [
+        "default",
+        "once_cell",
+        "std",
     ],
     rustlibs: [
         "libonce_cell",
diff --git a/crates/tracing-core/CHANGELOG.md b/crates/tracing-core/CHANGELOG.md
index 2e92f74..be6bb1e 100644
--- a/crates/tracing-core/CHANGELOG.md
+++ b/crates/tracing-core/CHANGELOG.md
@@ -1,3 +1,36 @@
+# 0.1.33 (November 25, 2024)
+
+### Added
+
+- Add index API for `Field` ([#2820])
+- allow `&[u8]` to be recorded as event/span field ([#2954])
+
+### Changed
+
+- Bump MSRV to 1.63 ([#2793])
+- Use const `thread_local`s when possible ([#2838])
+
+### Fixed
+
+- Fix missed `register_callsite` error ([#2938])
+- Do not add `valuable/std` feature as dependency unless `valuable` is used ([#3002])
+- prefix macro calls with ::core to avoid clashing with local macros ([#3024])
+
+### Documented
+
+- Fix incorrect (incorrectly updated) docs for LevelFilter ([#2767])
+
+Thanks to new contributor @maddiemort for contributing to this release!
+
+[#2767]: https://github.com/tokio-rs/tracing/pull/2767
+[#2793]: https://github.com/tokio-rs/tracing/pull/2793
+[#2820]: https://github.com/tokio-rs/tracing/pull/2820
+[#2838]: https://github.com/tokio-rs/tracing/pull/2838
+[#2938]: https://github.com/tokio-rs/tracing/pull/2938
+[#2954]: https://github.com/tokio-rs/tracing/pull/2954
+[#3002]: https://github.com/tokio-rs/tracing/pull/3002
+[#3024]: https://github.com/tokio-rs/tracing/pull/3024
+
 # 0.1.32 (October 13, 2023)
 
 ### Documented
diff --git a/crates/tracing-core/Cargo.toml b/crates/tracing-core/Cargo.toml
index 961b391..2b40f15 100644
--- a/crates/tracing-core/Cargo.toml
+++ b/crates/tracing-core/Cargo.toml
@@ -11,10 +11,15 @@
 
 [package]
 edition = "2018"
-rust-version = "1.56.0"
+rust-version = "1.63.0"
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
 authors = ["Tokio Contributors <[email protected]>"]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 Core primitives for application-level tracing.
 """
@@ -32,6 +37,7 @@
 ]
 license = "MIT"
 repository = "https://github.com/tokio-rs/tracing"
+resolver = "2"
 
 [package.metadata.docs.rs]
 all-features = true
@@ -46,6 +52,30 @@
     "tracing_unstable",
 ]
 
+[lib]
+name = "tracing_core"
+path = "src/lib.rs"
+
+[[test]]
+name = "dispatch"
+path = "tests/dispatch.rs"
+
+[[test]]
+name = "global_dispatch"
+path = "tests/global_dispatch.rs"
+
+[[test]]
+name = "local_dispatch_before_init"
+path = "tests/local_dispatch_before_init.rs"
+
+[[test]]
+name = "macros"
+path = "tests/macros.rs"
+
+[[test]]
+name = "missed_register_callsite"
+path = "tests/missed_register_callsite.rs"
+
 [dependencies.once_cell]
 version = "1.13.0"
 optional = true
@@ -53,7 +83,7 @@
 [features]
 default = [
     "std",
-    "valuable/std",
+    "valuable?/std",
 ]
 std = ["once_cell"]
 
@@ -64,3 +94,11 @@
 
 [badges.maintenance]
 status = "actively-developed"
+
+[lints.rust.unexpected_cfgs]
+level = "warn"
+priority = 0
+check-cfg = [
+    "cfg(flaky_tests)",
+    "cfg(tracing_unstable)",
+]
diff --git a/crates/tracing-core/METADATA b/crates/tracing-core/METADATA
index 80b6a1b..dc71a3d 100644
--- a/crates/tracing-core/METADATA
+++ b/crates/tracing-core/METADATA
@@ -1,17 +1,17 @@
 name: "tracing-core"
 description: "Core primitives for application-level tracing."
 third_party {
-  version: "0.1.32"
+  version: "0.1.33"
   license_type: NOTICE
   last_upgrade_date {
     year: 2024
-    month: 2
-    day: 6
+    month: 12
+    day: 20
   }
   homepage: "https://crates.io/crates/tracing-core"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/tracing-core/tracing-core-0.1.32.crate"
-    version: "0.1.32"
+    value: "https://static.crates.io/crates/tracing-core/tracing-core-0.1.33.crate"
+    version: "0.1.33"
   }
 }
diff --git a/crates/tracing-core/README.md b/crates/tracing-core/README.md
index 3655948..32f67cd 100644
--- a/crates/tracing-core/README.md
+++ b/crates/tracing-core/README.md
@@ -16,9 +16,9 @@
 [Documentation][docs-url] | [Chat][discord-url]
 
 [crates-badge]: https://img.shields.io/crates/v/tracing-core.svg
-[crates-url]: https://crates.io/crates/tracing-core/0.1.31
+[crates-url]: https://crates.io/crates/tracing-core/0.1.33
 [docs-badge]: https://docs.rs/tracing-core/badge.svg
-[docs-url]: https://docs.rs/tracing-core/0.1.31
+[docs-url]: https://docs.rs/tracing-core/0.1.33
 [docs-master-badge]: https://img.shields.io/badge/docs-master-blue
 [docs-master-url]: https://tracing-rs.netlify.com/tracing_core
 [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
@@ -53,7 +53,7 @@
 In addition, it defines the global callsite registry and per-thread current
 dispatcher which other components of the tracing system rely on.
 
-*Compiler support: [requires `rustc` 1.56+][msrv]*
+*Compiler support: [requires `rustc` 1.63+][msrv]*
 
 [msrv]: #supported-rust-versions
 
@@ -79,27 +79,27 @@
 
   ```toml
   [dependencies]
-  tracing-core = { version = "0.1.31", default-features = false }
+  tracing-core = { version = "0.1.33", default-features = false }
   ```
 
   **Note**:`tracing-core`'s `no_std` support requires `liballoc`.
 
 [`tracing`]: ../tracing
-[`span::Id`]: https://docs.rs/tracing-core/0.1.31/tracing_core/span/struct.Id.html
-[`Event`]: https://docs.rs/tracing-core/0.1.31/tracing_core/event/struct.Event.html
-[`Subscriber`]: https://docs.rs/tracing-core/0.1.31/tracing_core/subscriber/trait.Subscriber.html
-[`Metadata`]: https://docs.rs/tracing-core/0.1.31/tracing_core/metadata/struct.Metadata.html
-[`Callsite`]: https://docs.rs/tracing-core/0.1.31/tracing_core/callsite/trait.Callsite.html
-[`Field`]: https://docs.rs/tracing-core/0.1.31/tracing_core/field/struct.Field.html
-[`FieldSet`]: https://docs.rs/tracing-core/0.1.31/tracing_core/field/struct.FieldSet.html
-[`Value`]: https://docs.rs/tracing-core/0.1.31/tracing_core/field/trait.Value.html
-[`ValueSet`]: https://docs.rs/tracing-core/0.1.31/tracing_core/field/struct.ValueSet.html
-[`Dispatch`]: https://docs.rs/tracing-core/0.1.31/tracing_core/dispatcher/struct.Dispatch.html
+[`span::Id`]: https://docs.rs/tracing-core/0.1.33/tracing_core/span/struct.Id.html
+[`Event`]: https://docs.rs/tracing-core/0.1.33/tracing_core/event/struct.Event.html
+[`Subscriber`]: https://docs.rs/tracing-core/0.1.33/tracing_core/subscriber/trait.Subscriber.html
+[`Metadata`]: https://docs.rs/tracing-core/0.1.33/tracing_core/metadata/struct.Metadata.html
+[`Callsite`]: https://docs.rs/tracing-core/0.1.33/tracing_core/callsite/trait.Callsite.html
+[`Field`]: https://docs.rs/tracing-core/0.1.33/tracing_core/field/struct.Field.html
+[`FieldSet`]: https://docs.rs/tracing-core/0.1.33/tracing_core/field/struct.FieldSet.html
+[`Value`]: https://docs.rs/tracing-core/0.1.33/tracing_core/field/trait.Value.html
+[`ValueSet`]: https://docs.rs/tracing-core/0.1.33/tracing_core/field/struct.ValueSet.html
+[`Dispatch`]: https://docs.rs/tracing-core/0.1.33/tracing_core/dispatcher/struct.Dispatch.html
 
 ## Supported Rust Versions
 
 Tracing is built against the latest stable release. The minimum supported
-version is 1.56. The current Tracing version is not guaranteed to build on Rust
+version is 1.63. The current Tracing version is not guaranteed to build on Rust
 versions earlier than the minimum supported version.
 
 Tracing follows the same compiler support policies as the rest of the Tokio
diff --git a/crates/tracing-core/src/callsite.rs b/crates/tracing-core/src/callsite.rs
index 62fa8c4..68b4ecb 100644
--- a/crates/tracing-core/src/callsite.rs
+++ b/crates/tracing-core/src/callsite.rs
@@ -235,8 +235,6 @@
 /// [`Callsite`]: crate::callsite::Callsite
 /// [reg-docs]: crate::callsite#registering-callsites
 pub fn register(callsite: &'static dyn Callsite) {
-    rebuild_callsite_interest(callsite, &DISPATCHERS.rebuilder());
-
     // Is this a `DefaultCallsite`? If so, use the fancy linked list!
     if callsite.private_type_id(private::Private(())).0 == TypeId::of::<DefaultCallsite>() {
         let callsite = unsafe {
@@ -248,10 +246,11 @@
             &*(callsite as *const dyn Callsite as *const DefaultCallsite)
         };
         CALLSITES.push_default(callsite);
-        return;
+    } else {
+        CALLSITES.push_dyn(callsite);
     }
 
-    CALLSITES.push_dyn(callsite);
+    rebuild_callsite_interest(callsite, &DISPATCHERS.rebuilder());
 }
 
 static CALLSITES: Callsites = Callsites {
@@ -317,8 +316,8 @@
         ) {
             Ok(_) => {
                 // Okay, we advanced the state, try to register the callsite.
-                rebuild_callsite_interest(self, &DISPATCHERS.rebuilder());
                 CALLSITES.push_default(self);
+                rebuild_callsite_interest(self, &DISPATCHERS.rebuilder());
                 self.registration.store(Self::REGISTERED, Ordering::Release);
             }
             // Great, the callsite is already registered! Just load its
diff --git a/crates/tracing-core/src/dispatcher.rs b/crates/tracing-core/src/dispatcher.rs
index de02afb..fc9f295 100644
--- a/crates/tracing-core/src/dispatcher.rs
+++ b/crates/tracing-core/src/dispatcher.rs
@@ -123,6 +123,8 @@
 //! currently default `Dispatch`. This is used primarily by `tracing`
 //! instrumentation.
 //!
+use core::ptr::addr_of;
+
 use crate::{
     callsite, span,
     subscriber::{self, NoSubscriber, Subscriber},
@@ -144,12 +146,6 @@
     error,
 };
 
-#[cfg(feature = "alloc")]
-use alloc::sync::{Arc, Weak};
-
-#[cfg(feature = "alloc")]
-use core::ops::Deref;
-
 /// `Dispatch` trace data to a [`Subscriber`].
 #[derive(Clone)]
 pub struct Dispatch {
@@ -187,9 +183,11 @@
 
 #[cfg(feature = "std")]
 thread_local! {
-    static CURRENT_STATE: State = State {
-        default: RefCell::new(None),
-        can_enter: Cell::new(true),
+    static CURRENT_STATE: State = const {
+        State {
+            default: RefCell::new(None),
+            can_enter: Cell::new(true),
+        }
     };
 }
 
@@ -455,7 +453,7 @@
     unsafe {
         // This is safe given the invariant that setting the global dispatcher
         // also sets `GLOBAL_INIT` to `INITIALIZED`.
-        &GLOBAL_DISPATCH
+        &*addr_of!(GLOBAL_DISPATCH)
     }
 }
 
diff --git a/crates/tracing-core/src/field.rs b/crates/tracing-core/src/field.rs
index 90c4eaa..c09b863 100644
--- a/crates/tracing-core/src/field.rs
+++ b/crates/tracing-core/src/field.rs
@@ -112,7 +112,7 @@
 use crate::callsite;
 use crate::stdlib::{
     borrow::Borrow,
-    fmt,
+    fmt::{self, Write},
     hash::{Hash, Hasher},
     num,
     ops::Range,
@@ -308,6 +308,11 @@
         self.record_debug(field, &value)
     }
 
+    /// Visit a byte slice.
+    fn record_bytes(&mut self, field: &Field, value: &[u8]) {
+        self.record_debug(field, &HexBytes(value))
+    }
+
     /// Records a type implementing `Error`.
     ///
     /// <div class="example-wrap" style="display:inline-block">
@@ -380,6 +385,26 @@
     t.as_value()
 }
 
+struct HexBytes<'a>(&'a [u8]);
+
+impl<'a> fmt::Debug for HexBytes<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.write_char('[')?;
+
+        let mut bytes = self.0.iter();
+
+        if let Some(byte) = bytes.next() {
+            f.write_fmt(format_args!("{byte:02x}"))?;
+        }
+
+        for byte in bytes {
+            f.write_fmt(format_args!(" {byte:02x}"))?;
+        }
+
+        f.write_char(']')
+    }
+}
+
 // ===== impl Visit =====
 
 impl<'a, 'b> Visit for fmt::DebugStruct<'a, 'b> {
@@ -540,6 +565,14 @@
     }
 }
 
+impl crate::sealed::Sealed for [u8] {}
+
+impl Value for [u8] {
+    fn record(&self, key: &Field, visitor: &mut dyn Visit) {
+        visitor.record_bytes(key, self)
+    }
+}
+
 #[cfg(feature = "std")]
 impl crate::sealed::Sealed for dyn std::error::Error + 'static {}
 
@@ -771,6 +804,11 @@
     pub fn name(&self) -> &'static str {
         self.fields.names[self.i]
     }
+
+    /// Returns the index of this field in its [`FieldSet`].
+    pub fn index(&self) -> usize {
+        self.i
+    }
 }
 
 impl fmt::Display for Field {
@@ -836,10 +874,7 @@
     /// Returns the [`Field`] named `name`, or `None` if no such field exists.
     ///
     /// [`Field`]: super::Field
-    pub fn field<Q: ?Sized>(&self, name: &Q) -> Option<Field>
-    where
-        Q: Borrow<str>,
-    {
+    pub fn field<Q: Borrow<str> + ?Sized>(&self, name: &Q) -> Option<Field> {
         let name = &name.borrow();
         self.names.iter().position(|f| f == name).map(|i| Field {
             i,
@@ -1090,8 +1125,8 @@
     use crate::stdlib::{borrow::ToOwned, string::String};
 
     // Make sure TEST_CALLSITE_* have non-zero size, so they can't be located at the same address.
-    struct TestCallsite1(u8);
-    static TEST_CALLSITE_1: TestCallsite1 = TestCallsite1(0);
+    struct TestCallsite1();
+    static TEST_CALLSITE_1: TestCallsite1 = TestCallsite1();
     static TEST_META_1: Metadata<'static> = metadata! {
         name: "field_test1",
         target: module_path!(),
@@ -1111,8 +1146,8 @@
         }
     }
 
-    struct TestCallsite2(u8);
-    static TEST_CALLSITE_2: TestCallsite2 = TestCallsite2(0);
+    struct TestCallsite2();
+    static TEST_CALLSITE_2: TestCallsite2 = TestCallsite2();
     static TEST_META_2: Metadata<'static> = metadata! {
         name: "field_test2",
         target: module_path!(),
@@ -1145,6 +1180,17 @@
     }
 
     #[test]
+    fn index_of_field_in_fieldset_is_correct() {
+        let fields = TEST_META_1.fields();
+        let foo = fields.field("foo").unwrap();
+        assert_eq!(foo.index(), 0);
+        let bar = fields.field("bar").unwrap();
+        assert_eq!(bar.index(), 1);
+        let baz = fields.field("baz").unwrap();
+        assert_eq!(baz.index(), 2);
+    }
+
+    #[test]
     fn empty_value_set_is_empty() {
         let fields = TEST_META_1.fields();
         let valueset = fields.value_set(&[]);
@@ -1252,4 +1298,23 @@
         });
         assert_eq!(result, format!("{}", err));
     }
+
+    #[test]
+    fn record_bytes() {
+        let fields = TEST_META_1.fields();
+        let first = &b"abc"[..];
+        let second: &[u8] = &[192, 255, 238];
+        let values = &[
+            (&fields.field("foo").unwrap(), Some(&first as &dyn Value)),
+            (&fields.field("bar").unwrap(), Some(&" " as &dyn Value)),
+            (&fields.field("baz").unwrap(), Some(&second as &dyn Value)),
+        ];
+        let valueset = fields.value_set(values);
+        let mut result = String::new();
+        valueset.record(&mut |_: &Field, value: &dyn fmt::Debug| {
+            use core::fmt::Write;
+            write!(&mut result, "{:?}", value).unwrap();
+        });
+        assert_eq!(result, format!("{}", r#"[61 62 63]" "[c0 ff ee]"#));
+    }
 }
diff --git a/crates/tracing-core/src/lib.rs b/crates/tracing-core/src/lib.rs
index d43a6b8..4286d88 100644
--- a/crates/tracing-core/src/lib.rs
+++ b/crates/tracing-core/src/lib.rs
@@ -23,7 +23,7 @@
 //! In addition, it defines the global callsite registry and per-thread current
 //! dispatcher which other components of the tracing system rely on.
 //!
-//! *Compiler support: [requires `rustc` 1.56+][msrv]*
+//! *Compiler support: [requires `rustc` 1.63+][msrv]*
 //!
 //! [msrv]: #supported-rust-versions
 //!
@@ -92,7 +92,7 @@
 //! ## Supported Rust Versions
 //!
 //! Tracing is built against the latest stable release. The minimum supported
-//! version is 1.56. The current Tracing version is not guaranteed to build on
+//! version is 1.63. The current Tracing version is not guaranteed to build on
 //! Rust versions earlier than the minimum supported version.
 //!
 //! Tracing follows the same compiler support policies as the rest of the Tokio
@@ -135,7 +135,8 @@
     overflowing_literals,
     path_statements,
     patterns_in_fns_without_body,
-    private_in_public,
+    private_interfaces,
+    private_bounds,
     unconditional_recursion,
     unused,
     unused_allocation,
@@ -146,6 +147,14 @@
 #[cfg(not(feature = "std"))]
 extern crate alloc;
 
+#[doc(hidden)]
+pub mod __macro_support {
+    // Re-export the `core` functions that are used in macros. This allows
+    // a crate to be named `core` and avoid name clashes.
+    // See here: https://github.com/tokio-rs/tracing/issues/2761
+    pub use core::{file, line, module_path, option::Option};
+}
+
 /// Statically constructs an [`Identifier`] for the provided [`Callsite`].
 ///
 /// This may be used in contexts such as static initializers.
@@ -243,9 +252,9 @@
             $name,
             $target,
             $level,
-            ::core::option::Option::Some(file!()),
-            ::core::option::Option::Some(line!()),
-            ::core::option::Option::Some(module_path!()),
+            $crate::__macro_support::Option::Some($crate::__macro_support::file!()),
+            $crate::__macro_support::Option::Some($crate::__macro_support::line!()),
+            $crate::__macro_support::Option::Some($crate::__macro_support::module_path!()),
             $crate::field::FieldSet::new($fields, $crate::identify_callsite!($callsite)),
             $kind,
         )
diff --git a/crates/tracing-core/src/metadata.rs b/crates/tracing-core/src/metadata.rs
index 5e475c1..5cec421 100644
--- a/crates/tracing-core/src/metadata.rs
+++ b/crates/tracing-core/src/metadata.rs
@@ -222,10 +222,9 @@
 
 /// A filter comparable to a verbosity [`Level`].
 ///
-/// If a [`Level`] is considered less than a `LevelFilter`, it should be
-/// considered enabled; if greater than or equal to the `LevelFilter`,
-/// that level is disabled. See [`LevelFilter::current`] for more
-/// details.
+/// If a [`Level`] is considered less than or equal to a `LevelFilter`, it
+/// should be considered enabled; if greater than the `LevelFilter`, that level
+/// is disabled. See [`LevelFilter::current`] for more details.
 ///
 /// Note that this is essentially identical to the `Level` type, but with the
 /// addition of an [`OFF`] level that completely disables all trace
@@ -378,7 +377,7 @@
     pub const SPAN: Kind = Kind(Self::SPAN_BIT);
 
     /// `enabled!` callsite. [`Subscriber`][`crate::subscriber::Subscriber`]s can assume
-    /// this `Kind` means they will never recieve a
+    /// this `Kind` means they will never receive a
     /// full event with this [`Metadata`].
     pub const HINT: Kind = Kind(Self::HINT_BIT);
 
diff --git a/crates/tracing-core/tests/missed_register_callsite.rs b/crates/tracing-core/tests/missed_register_callsite.rs
new file mode 100644
index 0000000..1532082
--- /dev/null
+++ b/crates/tracing-core/tests/missed_register_callsite.rs
@@ -0,0 +1,125 @@
+use std::{
+    ptr,
+    sync::atomic::{AtomicPtr, Ordering},
+    thread::{self, JoinHandle},
+    time::Duration,
+};
+
+use tracing_core::{
+    callsite::{Callsite as _, DefaultCallsite},
+    dispatcher::set_default,
+    field::{FieldSet, Value},
+    span, Dispatch, Event, Kind, Level, Metadata, Subscriber,
+};
+
+struct TestSubscriber {
+    sleep: Duration,
+    callsite: AtomicPtr<Metadata<'static>>,
+}
+
+impl TestSubscriber {
+    fn new(sleep_micros: u64) -> Self {
+        Self {
+            sleep: Duration::from_micros(sleep_micros),
+            callsite: AtomicPtr::new(ptr::null_mut()),
+        }
+    }
+}
+
+impl Subscriber for TestSubscriber {
+    fn register_callsite(&self, metadata: &'static Metadata<'static>) -> tracing_core::Interest {
+        if !self.sleep.is_zero() {
+            thread::sleep(self.sleep);
+        }
+
+        self.callsite
+            .store(metadata as *const _ as *mut _, Ordering::SeqCst);
+
+        tracing_core::Interest::always()
+    }
+
+    fn event(&self, event: &tracing_core::Event<'_>) {
+        let stored_callsite = self.callsite.load(Ordering::SeqCst);
+        let event_callsite: *mut Metadata<'static> = event.metadata() as *const _ as *mut _;
+
+        // This assert is the actual test.
+        assert_eq!(
+            stored_callsite, event_callsite,
+            "stored callsite: {stored_callsite:#?} does not match event \
+            callsite: {event_callsite:#?}. Was `event` called before \
+            `register_callsite`?"
+        );
+    }
+
+    fn enabled(&self, _metadata: &Metadata<'_>) -> bool {
+        true
+    }
+    fn new_span(&self, _span: &span::Attributes<'_>) -> span::Id {
+        span::Id::from_u64(0)
+    }
+    fn record(&self, _span: &span::Id, _values: &span::Record<'_>) {}
+    fn record_follows_from(&self, _span: &span::Id, _follows: &span::Id) {}
+    fn enter(&self, _span: &tracing_core::span::Id) {}
+    fn exit(&self, _span: &tracing_core::span::Id) {}
+}
+
+fn subscriber_thread(idx: usize, register_sleep_micros: u64) -> JoinHandle<()> {
+    thread::Builder::new()
+        .name(format!("subscriber-{idx}"))
+        .spawn(move || {
+            // We use a sleep to ensure the starting order of the 2 threads.
+            let subscriber = TestSubscriber::new(register_sleep_micros);
+            let _dispatch_guard = set_default(&Dispatch::new(subscriber));
+
+            static CALLSITE: DefaultCallsite = {
+                // The values of the metadata are unimportant
+                static META: Metadata<'static> = Metadata::new(
+                    "event ",
+                    "module::path",
+                    Level::INFO,
+                    None,
+                    None,
+                    None,
+                    FieldSet::new(&["message"], tracing_core::callsite::Identifier(&CALLSITE)),
+                    Kind::EVENT,
+                );
+                DefaultCallsite::new(&META)
+            };
+            let _interest = CALLSITE.interest();
+
+            let meta = CALLSITE.metadata();
+            let field = meta.fields().field("message").unwrap();
+            let message = format!("event-from-{idx}", idx = idx);
+            let values = [(&field, Some(&message as &dyn Value))];
+            let value_set = CALLSITE.metadata().fields().value_set(&values);
+
+            Event::dispatch(meta, &value_set);
+
+            // Wait a bit for everything to end (we don't want to remove the subscriber
+            // immediately because that will influence the test).
+            thread::sleep(Duration::from_millis(10));
+        })
+        .expect("failed to spawn thread")
+}
+
+/// Regression test for missing register_callsite call (#2743)
+///
+/// This test provokes the race condition which causes the second subscriber to not receive a
+/// call to `register_callsite` before it receives a call to `event`.
+///
+/// Because the test depends on the interaction of multiple dispatchers in different threads,
+/// it needs to be in a test file by itself.
+#[test]
+fn event_before_register() {
+    let subscriber_1_register_sleep_micros = 100;
+    let subscriber_2_register_sleep_micros = 0;
+
+    let jh1 = subscriber_thread(1, subscriber_1_register_sleep_micros);
+
+    // This delay ensures that the event callsite has interest() called first.
+    thread::sleep(Duration::from_micros(50));
+    let jh2 = subscriber_thread(2, subscriber_2_register_sleep_micros);
+
+    jh1.join().expect("failed to join thread");
+    jh2.join().expect("failed to join thread");
+}
diff --git a/crates/unicode-segmentation/.android-checksum.json b/crates/unicode-segmentation/.android-checksum.json
index 4d4b45d..a5c3571 100644
--- a/crates/unicode-segmentation/.android-checksum.json
+++ b/crates/unicode-segmentation/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"0fe72234e492c0b75ccd2ab19298f7b90afcb0bd634d65aa6c43044f61420f8c","Android.bp":"5733221751f2e5c4e997c202774f3b0206004e9b94626ac063dd9de54c91afb5","COPYRIGHT":"ab4c8a47ea97e53eb239f5454701fbf35c618d980af54cfe659793662b2a1ebd","Cargo.toml":"3cb0eee0e905505593a0c0d0d4db8117afe0e58431f18cc7684efcc287fec3e9","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"8ff981830ebf3fe518679fabc276f8aade7e253f47946d0d8df0dd30f83d96f5","METADATA":"3a36139bf11c649ea5dc464a8596a3fcdcb00c6ad053ff6a2917ea7c0d3ecd70","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","README.md":"e4efe793c8ea22fc44a341adddd1739b089979870ab004ee8207a4839d759bd3","TEST_MAPPING":"fdb0ae32e88da59e7ee85b6b39043fb08f31b5abf6887d9f4d812cdd1ad07cfe","benches/graphemes.rs":"3ca7e39026d77baf5dd52ec3e4893dc42c5de722e713cde08db6a23917a3a424","benches/unicode_words.rs":"e32629ad39f17107aedf6a418c00990a36185fbe52fc2efb2820456404658982","benches/word_bounds.rs":"e2db53987eebbef2ef776473f4576afd2d076a6fe38fd1ee600242ef24dc45d1","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","scripts/unicode.py":"ea89ac771ed20a1142cb781aaa43780c46c3929a368183881b91d409b734c1d1","scripts/unicode_gen_breaktests.py":"3a683d13e79cd8a84b61bf7a99fe9a35b7c7116fa17853a93ed7455806973001","src/grapheme.rs":"f531f7a8eee9090e39fdbd32d0b7aeb7704ae98bb52a5e25946c4d44c9d85e0b","src/lib.rs":"a1e3120183b90b9b6f91df3ccc34376271df1d2774616b14a69f3733befa8736","src/sentence.rs":"8a535c48eca0e0877951d681ac05a424236954d913c92e988950cd93fe6c3d2d","src/tables.rs":"1a2ab6cc9eb19166c6149458068693d77f11eaac2aa0ee0a52bb35766f00d4c4","src/test.rs":"1d7d3bd67a1bf8f5ca3f2e3de5542dcfe4e672092e35c72adabb8fabc3b69439","src/testdata.rs":"05a8a20ffdc131e306dd427bb6fcde1813e98cc3c8742f38e0a0302c79a3d79d","src/word.rs":"59e158f2293ecf75952870c70785a34aec0d0c41679da31ce78fd456f90466fd"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"7dfcf3f82eddf538efd0723fc895b0fbd39b7bccc71b4aaa12a7a794bccc62fa","Android.bp":"44abdb1ca2c381d5eec08acb6dee4215bdf4e967c2d79a379ac2679b4834947e","COPYRIGHT":"ab4c8a47ea97e53eb239f5454701fbf35c618d980af54cfe659793662b2a1ebd","Cargo.toml":"abbe7049351be69db4021e094f671d4d9fdfc025b45cfe5ff99edb34257f6896","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"8ff981830ebf3fe518679fabc276f8aade7e253f47946d0d8df0dd30f83d96f5","METADATA":"c5dbdf425dc9ceb4650a131b50e6345b6ab0ed0d97ff053b6651de1d92fb56a9","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","NOTICE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","README.md":"080e43a157bfbee0a2da3c2ecf02928b84e8d7842d67d42a638374379ece96e0","TEST_MAPPING":"fdb0ae32e88da59e7ee85b6b39043fb08f31b5abf6887d9f4d812cdd1ad07cfe","benches/chars.rs":"b7c2a6c13f37d86d910a6d11ded03f045c5b2b0e17624ab1810c413b155dfca8","benches/word_bounds.rs":"cdda5ca225010679e5520d03401558e1a483af95b564f9cae3be019fa9d93bc2","benches/words.rs":"ea9b259b104917bbfb6e1f718e296238febac9d37d093c65003efef8bda0c660","cargo_embargo.json":"aa45a963da01d3f018be316cd5b7646a5b413ce2611c5218f2914d2e8a9efd0e","scripts/unicode.py":"1486cb211334ad54646f422a6a2fa4fbda6067fa2c1c58daaae03a8f03f9b866","scripts/unicode_gen_breaktests.py":"eb368a904697cfcd7e0335b2d81b88035b0ad163722577bd331ef5bba9879e93","src/grapheme.rs":"4814180f4c81cca46319c568168ce653f0a5f375c3eda460667b5bc45735bafc","src/lib.rs":"79f858f3be73aaca87608d006592c1aaf634716d6a0245b008bc936710c1652e","src/sentence.rs":"1c7cec6d2588e530496ff1ae3d63a7cd97cb29e4ce886b9442cef0644066ac6e","src/tables.rs":"bad2434d0ca4357a6269c9ad385ef11ea5cc94bf9a73f2eae7aee06dfda9719f","src/word.rs":"781c15af7273ad91cede7e16bef1b8a6d9039149a0a2261926c1c77fafa2142c","tests/test.rs":"e98d394e478affc3965cc476b83563e0ce3905ce4d5cf9e85ca637580277d208","tests/testdata/mod.rs":"cf25659483aa55fb7940a4cbb941f6a10ac46398164e09ccdac355d2d7c85cb8"}}
\ No newline at end of file
diff --git a/crates/unicode-segmentation/.cargo-checksum.json b/crates/unicode-segmentation/.cargo-checksum.json
index faa4000..9474173 100644
--- a/crates/unicode-segmentation/.cargo-checksum.json
+++ b/crates/unicode-segmentation/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"3de4086a8d886795bd6f4322b3f42ee8b84eb1c9ab6651fb95c0469d1cf508f1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"8d05f9f7aafc8af56853b802e14d0e2e73a56021d8b5481b69e169fd3e2c44cc","benches/graphemes.rs":"88a9f672ea7a03cc15fae36ce544a6e7234e532359402483978858ccda47db3d","benches/unicode_words.rs":"42df2c8e9bfb54baf31c8327e27915683c25b90d55dc04311c28a0c2a9d185e3","benches/word_bounds.rs":"0453e37477134063178e104305b0a5f27ce74aa342234a6208095623c45de0d4","scripts/unicode.py":"e38d564c2f778aeb2cd17ce6c4395e5f5abd85ff8dd5292d76a93c16f4e38eb9","scripts/unicode_gen_breaktests.py":"ee96982d8959bec75c2382233cfca7e239f12a89a1be5fbf942601a215bb9283","src/grapheme.rs":"b5a32bdbb529e9417e8ada8d92656339b6ffb4e9bed8e6d32a0409c13a03050b","src/lib.rs":"572789173717edd0fe037ae656530663406951636c548e6793711b7d5caad910","src/sentence.rs":"aac52f69207e0b68925ab0c6c18cc36ed3da8e918006d96d724f0f19d4d9d643","src/tables.rs":"547636e4d6d685286f98c7f1db5ebde8e254ec811dbec4b7c2edf74c1454740d","src/test.rs":"f039fa285d510244672a067bdbe98ce7ff940e4f2ff82926466e012ac48ad95a","src/testdata.rs":"533c02ecace1bec3d46b65d101c7619bc83a2fb2c187a2c960346533c09a0e3e","src/word.rs":"6eeea9351c12f0a4404606596a487e0e8aa948ba4b134c7cb827ee41557a39fe"},"package":"1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"}
\ No newline at end of file
+{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"483a1ec00d7b705eff7b41dbfc9385c280d15c0631779ed55749f76d921633c6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"64d241ba25087bb059777c8944dd0ec41b31d9a21ba791e5321a5db4090741c1","benches/chars.rs":"b63875d2e0eb4e655ed9f36bfae5f7ae127359aa2b158787bf0a5f9c2798cfae","benches/word_bounds.rs":"ee964db6290c13c60304a9a99a22895d03416cc99a4fab6202c1d92f7af2a285","benches/words.rs":"7b218ef0c71251c03d5377e6876c95cbdb6b4e81b6a7f4705e81cc624a9d02b4","scripts/unicode.py":"31dd92fd09c5c7e73f1423aae38efd49dee51e7859ee1fbfd3374bb90d4cd8ab","scripts/unicode_gen_breaktests.py":"5b3f4caeade8517eb6b9cab6aa0948a7ee7672e845b22e5254254cbfc54d7141","src/grapheme.rs":"bdff7b1459f576e7d02f2547781048a25bae370430be2e2fbe96cf604da1293d","src/lib.rs":"96a6f39aabb302afc217e4be05efb09bc15eec40afb21d5f1c4b428f90268a50","src/sentence.rs":"7fe9496fbd694f335359be8ccd12980680e880cbf40b61141bbfb9f95e8b589d","src/tables.rs":"e229fbbc93599c5df42c174bdf77602ced0789e1e1c73f7b979a725a56c92da1","src/word.rs":"3c83f3d70ae7d9e0d15d7fae953b29d7c1a71394ed72f818c98751ebb194717d","tests/test.rs":"5d21ec5b729a0f0554f247c28cf8636e0929468bbcb8c0540ee0cf96b7bdb3ef","tests/testdata/mod.rs":"55fb33f7a58da36923124ac94d06030e573f9083eae95300c4ab2012ca899298"},"package":"f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"}
\ No newline at end of file
diff --git a/crates/unicode-segmentation/Android.bp b/crates/unicode-segmentation/Android.bp
index 5688b65..0531bad 100644
--- a/crates/unicode-segmentation/Android.bp
+++ b/crates/unicode-segmentation/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "unicode_segmentation",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.10.1",
+    cargo_pkg_version: "1.12.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     apex_available: [
diff --git a/crates/unicode-segmentation/Cargo.toml b/crates/unicode-segmentation/Cargo.toml
index 83dea28..c7e462e 100644
--- a/crates/unicode-segmentation/Cargo.toml
+++ b/crates/unicode-segmentation/Cargo.toml
@@ -12,24 +12,27 @@
 [package]
 edition = "2018"
 name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.12.0"
 authors = [
     "kwantam <[email protected]>",
     "Manish Goregaokar <[email protected]>",
 ]
+build = false
 exclude = [
-    "target/*",
-    "Cargo.lock",
-    "scripts/tmp",
-    "benches/texts/*",
+    "/.github",
+    "/benches/texts",
+    "/scripts/**.rs",
     "*.txt",
 ]
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = """
 This crate provides Grapheme Cluster, Word and Sentence boundaries
 according to Unicode Standard Annex #29 rules.
 """
 homepage = "https://github.com/unicode-rs/unicode-segmentation"
-documentation = "https://unicode-rs.github.io/unicode-segmentation"
 readme = "README.md"
 keywords = [
     "text",
@@ -38,23 +41,34 @@
     "word",
     "boundary",
 ]
-license = "MIT/Apache-2.0"
+license = "MIT OR Apache-2.0"
 repository = "https://github.com/unicode-rs/unicode-segmentation"
 
-[[bench]]
-name = "graphemes"
-harness = false
+[lib]
+name = "unicode_segmentation"
+path = "src/lib.rs"
+
+[[test]]
+name = "test"
+path = "tests/test.rs"
 
 [[bench]]
-name = "unicode_words"
+name = "chars"
+path = "benches/chars.rs"
 harness = false
 
 [[bench]]
 name = "word_bounds"
+path = "benches/word_bounds.rs"
+harness = false
+
+[[bench]]
+name = "words"
+path = "benches/words.rs"
 harness = false
 
 [dev-dependencies.criterion]
-version = "0.3"
+version = "0.5"
 
 [dev-dependencies.quickcheck]
 version = "0.7"
diff --git a/crates/unicode-segmentation/METADATA b/crates/unicode-segmentation/METADATA
index 4f33b37..3b5e645 100644
--- a/crates/unicode-segmentation/METADATA
+++ b/crates/unicode-segmentation/METADATA
@@ -1,17 +1,17 @@
 name: "unicode-segmentation"
 description: "This crate provides Grapheme Cluster, Word and Sentence boundaries according to Unicode Standard Annex #29 rules."
 third_party {
-  version: "1.10.1"
+  version: "1.12.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 2
-    day: 17
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/unicode-segmentation"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/unicode-segmentation/unicode-segmentation-1.10.1.crate"
-    version: "1.10.1"
+    value: "https://static.crates.io/crates/unicode-segmentation/unicode-segmentation-1.12.0.crate"
+    version: "1.12.0"
   }
 }
diff --git a/crates/unicode-segmentation/README.md b/crates/unicode-segmentation/README.md
index ef61ebd..2f47ee9 100644
--- a/crates/unicode-segmentation/README.md
+++ b/crates/unicode-segmentation/README.md
@@ -1,7 +1,7 @@
 Iterators which split strings on Grapheme Cluster or Word boundaries, according
 to the [Unicode Standard Annex #29](http://www.unicode.org/reports/tr29/) rules.
 
-[![Build Status](https://travis-ci.org/unicode-rs/unicode-segmentation.svg)](https://travis-ci.org/unicode-rs/unicode-segmentation)
+[![Build Status](https://github.com/unicode-rs/unicode-segmentation/actions/workflows/rust.yml/badge.svg)](https://github.com/unicode-rs/unicode-segmentation/actions/workflows/rust.yml)
 
 [Documentation](https://unicode-rs.github.io/unicode-segmentation/unicode_segmentation/index.html)
 
@@ -21,7 +21,7 @@
 
     let s = "The quick (\"brown\")  fox";
     let w = s.split_word_bounds().collect::<Vec<&str>>();
-    let b: &[_] = &["The", " ", "quick", " ", "(", "\"", "brown", "\"", ")", " ", " ", "fox"];
+    let b: &[_] = &["The", " ", "quick", " ", "(", "\"", "brown", "\"", ")", "  ", "fox"];
     assert_eq!(w, b);
 }
 ```
@@ -43,6 +43,29 @@
 
 # Change Log
 
+## 1.11.0
+* [#124](https://github.com/unicode-rs/unicode-segmentation/pull/124) Update data to Unicode 15.1
+* [#128](https://github.com/unicode-rs/unicode-segmentation/pull/128) Add `size_hint` to iterators
+
+## 1.10.1
+* [#113](https://github.com/unicode-rs/unicode-segmentation/pull/113) Use criterion.rs for word benchmarks
+* [#112](https://github.com/unicode-rs/unicode-segmentation/pull/112) Improve table search speed through lookups
+
+## 1.10.0
+* [#107](https://github.com/unicode-rs/unicode-segmentation/pull/107) Upgrade to Unicode 15.0.0
+* [#104](https://github.com/unicode-rs/unicode-segmentation/pull/104) Supersedes and fixes [#75](https://github.com/unicode-rs/unicode-segmentation/pull/75)
+
+## 1.9.0
+* [#101](https://github.com/unicode-rs/unicode-segmentation/pull/101) Upgrade to Unicode 14.0.0
+
+## 1.8.0
+* [#100](https://github.com/unicode-rs/unicode-segmentation/pull/100) * [#100](https://github.com/unicode-rs/unicode-segmentation/pull/100) - Increase `#[inline]` opportunities, resulting in 15-40% performance improvement.
+* [#95](https://github.com/unicode-rs/unicode-segmentation/pull/98) Implement debug for Graphemes
+* [#94](https://github.com/unicode-rs/unicode-segmentation/pull/94) Add Initial fuzzer for oss-fuzz integration
+* [#93](https://github.com/unicode-rs/unicode-segmentation/pull/93) Fix  unused imports and deprecated pattern warnings
+* [#91](https://github.com/unicode-rs/unicode-segmentation/pull/92) Made local variable immutable by moving it into loop
+* [#91](https://github.com/unicode-rs/unicode-segmentation/pull/91) Add new iterator [UnicodeWordIndices](https://unicode-rs.github.io/unicode-segmentation/unicode_segmentation/struct.UnicodeWordIndices.html) and [unicode_word_indices](https://unicode-rs.github.io/unicode-segmentation/unicode_segmentation/trait.UnicodeSegmentation.html#tymethod.unicode_word_indices)
+
 ## 1.7.1
 
 * Update docs on version number
diff --git a/crates/unicode-segmentation/benches/chars.rs b/crates/unicode-segmentation/benches/chars.rs
new file mode 100644
index 0000000..bacffa1
--- /dev/null
+++ b/crates/unicode-segmentation/benches/chars.rs
@@ -0,0 +1,59 @@
+//! Compares the performance of `UnicodeSegmentation::graphemes` with stdlib's UTF-8 scalar-based
+//! `std::str::chars`.
+//!
+//! It is expected that `std::str::chars` is faster than `UnicodeSegmentation::graphemes` since it
+//! does not consider the complexity of grapheme clusters. The question in this benchmark
+//! is how much slower full unicode handling is.
+
+use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
+
+use std::fs;
+use unicode_segmentation::UnicodeSegmentation;
+
+const FILES: &[&str] = &[
+    "arabic",
+    "english",
+    "hindi",
+    "japanese",
+    "korean",
+    "mandarin",
+    "russian",
+    "source_code",
+];
+
+#[inline(always)]
+fn grapheme(text: &str) {
+    for c in UnicodeSegmentation::graphemes(black_box(text), true) {
+        black_box(c);
+    }
+}
+
+#[inline(always)]
+fn scalar(text: &str) {
+    for c in black_box(text).chars() {
+        black_box(c);
+    }
+}
+
+fn bench_all(c: &mut Criterion) {
+    let mut group = c.benchmark_group("chars");
+
+    for file in FILES {
+        group.bench_with_input(
+            BenchmarkId::new("grapheme", file),
+            &fs::read_to_string(format!("benches/texts/{}.txt", file)).unwrap(),
+            |b, content| b.iter(|| grapheme(content)),
+        );
+    }
+
+    for file in FILES {
+        group.bench_with_input(
+            BenchmarkId::new("scalar", file),
+            &fs::read_to_string(format!("benches/texts/{}.txt", file)).unwrap(),
+            |b, content| b.iter(|| scalar(content)),
+        );
+    }
+}
+
+criterion_group!(benches, bench_all);
+criterion_main!(benches);
diff --git a/crates/unicode-segmentation/benches/graphemes.rs b/crates/unicode-segmentation/benches/graphemes.rs
deleted file mode 100644
index 3a0b9b7..0000000
--- a/crates/unicode-segmentation/benches/graphemes.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-use criterion::{black_box, criterion_group, criterion_main, Criterion};
-use unicode_segmentation;
-
-use std::fs;
-use unicode_segmentation::UnicodeSegmentation;
-
-fn graphemes(c: &mut Criterion, lang: &str, path: &str) {
-    let text = fs::read_to_string(path).unwrap();
-
-    c.bench_function(&format!("graphemes_{}", lang), |bench| {
-        bench.iter(|| {
-            for g in UnicodeSegmentation::graphemes(black_box(&*text), true) {
-                black_box(g);
-            }
-        })
-    });
-}
-
-fn graphemes_arabic(c: &mut Criterion) {
-    graphemes(c, "arabic", "benches/texts/arabic.txt");
-}
-
-fn graphemes_english(c: &mut Criterion) {
-    graphemes(c, "english", "benches/texts/english.txt");
-}
-
-fn graphemes_hindi(c: &mut Criterion) {
-    graphemes(c, "hindi", "benches/texts/hindi.txt");
-}
-
-fn graphemes_japanese(c: &mut Criterion) {
-    graphemes(c, "japanese", "benches/texts/japanese.txt");
-}
-
-fn graphemes_korean(c: &mut Criterion) {
-    graphemes(c, "korean", "benches/texts/korean.txt");
-}
-
-fn graphemes_mandarin(c: &mut Criterion) {
-    graphemes(c, "mandarin", "benches/texts/mandarin.txt");
-}
-
-fn graphemes_russian(c: &mut Criterion) {
-    graphemes(c, "russian", "benches/texts/russian.txt");
-}
-
-fn graphemes_source_code(c: &mut Criterion) {
-    graphemes(c, "source_code", "benches/texts/source_code.txt");
-}
-
-criterion_group!(
-    benches,
-    graphemes_arabic,
-    graphemes_english,
-    graphemes_hindi,
-    graphemes_japanese,
-    graphemes_korean,
-    graphemes_mandarin,
-    graphemes_russian,
-    graphemes_source_code,
-);
-
-criterion_main!(benches);
diff --git a/crates/unicode-segmentation/benches/unicode_words.rs b/crates/unicode-segmentation/benches/unicode_words.rs
deleted file mode 100644
index a7f8f41..0000000
--- a/crates/unicode-segmentation/benches/unicode_words.rs
+++ /dev/null
@@ -1,61 +0,0 @@
-use criterion::{black_box, criterion_group, criterion_main, Criterion};
-
-use std::fs;
-use unicode_segmentation::UnicodeSegmentation;
-
-fn unicode_words(c: &mut Criterion, lang: &str, path: &str) {
-    let text = fs::read_to_string(path).unwrap();
-    c.bench_function(&format!("unicode_words_{}", lang), |bench| {
-        bench.iter(|| {
-            for w in text.unicode_words() {
-                black_box(w);
-            }
-        })
-    });
-}
-
-fn unicode_words_arabic(c: &mut Criterion) {
-    unicode_words(c, "arabic", "benches/texts/arabic.txt");
-}
-
-fn unicode_words_english(c: &mut Criterion) {
-    unicode_words(c, "english", "benches/texts/english.txt");
-}
-
-fn unicode_words_hindi(c: &mut Criterion) {
-    unicode_words(c, "hindi", "benches/texts/hindi.txt");
-}
-
-fn unicode_words_japanese(c: &mut Criterion) {
-    unicode_words(c, "japanese", "benches/texts/japanese.txt");
-}
-
-fn unicode_words_korean(c: &mut Criterion) {
-    unicode_words(c, "korean", "benches/texts/korean.txt");
-}
-
-fn unicode_words_mandarin(c: &mut Criterion) {
-    unicode_words(c, "mandarin", "benches/texts/mandarin.txt");
-}
-
-fn unicode_words_russian(c: &mut Criterion) {
-    unicode_words(c, "russian", "benches/texts/russian.txt");
-}
-
-fn unicode_words_source_code(c: &mut Criterion) {
-    unicode_words(c, "source_code", "benches/texts/source_code.txt");
-}
-
-criterion_group!(
-    benches,
-    unicode_words_arabic,
-    unicode_words_english,
-    unicode_words_hindi,
-    unicode_words_japanese,
-    unicode_words_korean,
-    unicode_words_mandarin,
-    unicode_words_russian,
-    unicode_words_source_code,
-);
-
-criterion_main!(benches);
diff --git a/crates/unicode-segmentation/benches/word_bounds.rs b/crates/unicode-segmentation/benches/word_bounds.rs
index cae7a88..42d50ff 100644
--- a/crates/unicode-segmentation/benches/word_bounds.rs
+++ b/crates/unicode-segmentation/benches/word_bounds.rs
@@ -1,61 +1,37 @@
-use criterion::{black_box, criterion_group, criterion_main, Criterion};
+use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
 
 use std::fs;
 use unicode_segmentation::UnicodeSegmentation;
 
-fn word_bounds(c: &mut Criterion, lang: &str, path: &str) {
-    let text = fs::read_to_string(path).unwrap();
-    c.bench_function(&format!("word_bounds_{}", lang), |bench| {
-        bench.iter(|| {
-            for w in text.split_word_bounds() {
-                black_box(w);
-            }
-        });
-    });
+const FILES: &[&str] = &[
+    "arabic",
+    "english",
+    "hindi",
+    "japanese",
+    "korean",
+    "mandarin",
+    "russian",
+    "source_code",
+];
+
+#[inline(always)]
+fn grapheme(text: &str) {
+    for w in text.split_word_bounds() {
+        black_box(w);
+    }
 }
 
-fn word_bounds_arabic(c: &mut Criterion) {
-    word_bounds(c, "arabic", "benches/texts/arabic.txt");
+fn bench_all(c: &mut Criterion) {
+    let mut group = c.benchmark_group("word_bounds");
+
+    for file in FILES {
+        group.bench_with_input(
+            BenchmarkId::new("grapheme", file),
+            &fs::read_to_string(format!("benches/texts/{}.txt", file)).unwrap(),
+            |b, content| b.iter(|| grapheme(content)),
+        );
+    }
 }
 
-fn word_bounds_english(c: &mut Criterion) {
-    word_bounds(c, "english", "benches/texts/english.txt");
-}
-
-fn word_bounds_hindi(c: &mut Criterion) {
-    word_bounds(c, "hindi", "benches/texts/hindi.txt");
-}
-
-fn word_bounds_japanese(c: &mut Criterion) {
-    word_bounds(c, "japanese", "benches/texts/japanese.txt");
-}
-
-fn word_bounds_korean(c: &mut Criterion) {
-    word_bounds(c, "korean", "benches/texts/korean.txt");
-}
-
-fn word_bounds_mandarin(c: &mut Criterion) {
-    word_bounds(c, "mandarin", "benches/texts/mandarin.txt");
-}
-
-fn word_bounds_russian(c: &mut Criterion) {
-    word_bounds(c, "russian", "benches/texts/russian.txt");
-}
-
-fn word_bounds_source_code(c: &mut Criterion) {
-    word_bounds(c, "source_code", "benches/texts/source_code.txt");
-}
-
-criterion_group!(
-    benches,
-    word_bounds_arabic,
-    word_bounds_english,
-    word_bounds_hindi,
-    word_bounds_japanese,
-    word_bounds_korean,
-    word_bounds_mandarin,
-    word_bounds_russian,
-    word_bounds_source_code,
-);
-
+criterion_group!(benches, bench_all);
 criterion_main!(benches);
diff --git a/crates/unicode-segmentation/benches/words.rs b/crates/unicode-segmentation/benches/words.rs
new file mode 100644
index 0000000..86785d5
--- /dev/null
+++ b/crates/unicode-segmentation/benches/words.rs
@@ -0,0 +1,59 @@
+//! Compares the performance of `UnicodeSegmentation::unicode_words` with stdlib's UTF-8
+//! scalar-based `std::str::split_whitespace`.
+//!
+//! It is expected that `std::str::split_whitespace` is faster than
+//! `UnicodeSegmentation::unicode_words` since it does not consider the complexity of grapheme
+//! clusters. The question in this benchmark is how much slower full unicode handling is.
+
+use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
+
+use std::fs;
+use unicode_segmentation::UnicodeSegmentation;
+
+const FILES: &[&str] = &[
+    "arabic",
+    "english",
+    "hindi",
+    "japanese",
+    "korean",
+    "mandarin",
+    "russian",
+    "source_code",
+];
+
+#[inline(always)]
+fn grapheme(text: &str) {
+    for w in text.unicode_words() {
+        black_box(w);
+    }
+}
+
+#[inline(always)]
+fn scalar(text: &str) {
+    for w in text.split_whitespace() {
+        black_box(w);
+    }
+}
+
+fn bench_all(c: &mut Criterion) {
+    let mut group = c.benchmark_group("words");
+
+    for file in FILES {
+        group.bench_with_input(
+            BenchmarkId::new("grapheme", file),
+            &fs::read_to_string(format!("benches/texts/{}.txt", file)).unwrap(),
+            |b, content| b.iter(|| grapheme(content)),
+        );
+    }
+
+    for file in FILES {
+        group.bench_with_input(
+            BenchmarkId::new("scalar", file),
+            &fs::read_to_string(format!("benches/texts/{}.txt", file)).unwrap(),
+            |b, content| b.iter(|| scalar(content)),
+        );
+    }
+}
+
+criterion_group!(benches, bench_all);
+criterion_main!(benches);
diff --git a/crates/unicode-segmentation/scripts/unicode.py b/crates/unicode-segmentation/scripts/unicode.py
index 18cea99..a9433d6 100755
--- a/crates/unicode-segmentation/scripts/unicode.py
+++ b/crates/unicode-segmentation/scripts/unicode.py
@@ -54,7 +54,7 @@
 # these are the surrogate codepoints, which are not valid rust characters
 surrogate_codepoints = (0xd800, 0xdfff)
 
-UNICODE_VERSION = (15, 0, 0)
+UNICODE_VERSION = (16, 0, 0)
 
 UNICODE_VERSION_NUMBER = "%s.%s.%s" %UNICODE_VERSION
 
@@ -155,11 +155,11 @@
             line = " "*indent + chunk
     f.write(line)
 
-def load_properties(f, interestingprops):
+def load_properties(f, interestingprops: "list[str | tuple[str, str]] | None" = None):
     fetch(f)
     props = {}
-    re1 = re.compile(r"^ *([0-9A-F]+) *; *(\w+)")
-    re2 = re.compile(r"^ *([0-9A-F]+)\.\.([0-9A-F]+) *; *(\w+)")
+    re1 = re.compile(r"^\s*([0-9A-F]+)\s*;\s*(\w+)(?:\s*;\s*(\w+))?")
+    re2 = re.compile(r"^\s*([0-9A-F]+)\.\.([0-9A-F]+)\s*;\s*(\w+)(?:\s*;\s*(\w+))?")
 
     for line in fileinput.input(os.path.basename(f)):
         prop = None
@@ -168,17 +168,21 @@
         m = re1.match(line)
         if m:
             d_lo = m.group(1)
-            d_hi = m.group(1)
+            d_hi = d_lo
             prop = m.group(2)
+            value = m.group(3)
         else:
             m = re2.match(line)
             if m:
                 d_lo = m.group(1)
                 d_hi = m.group(2)
                 prop = m.group(3)
+                value = m.group(4)
             else:
                 continue
-        if interestingprops and prop not in interestingprops:
+        if value is not None:
+            prop = (prop, value)
+        if interestingprops is not None and prop not in interestingprops:
             continue
         d_lo = int(d_lo, 16)
         d_hi = int(d_hi, 16)
@@ -195,7 +199,7 @@
 def escape_char(c):
     return "'\\u{%x}'" % c
 
-def emit_table(f, name, t_data, t_type = "&'static [(char, char)]", is_pub=True,
+def emit_table(f, name, t_data, t_type = "&[(char, char)]", is_pub=True,
         pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1])), is_const=True):
     pub_string = "const"
     if not is_const:
@@ -217,7 +221,7 @@
     f.write("""
 pub mod util {
     #[inline]
-    pub fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
+    pub fn bsearch_range_table(c: char, r: &[(char,char)]) -> bool {
         use core::cmp::Ordering::{Equal, Less, Greater};
         r.binary_search_by(|&(lo,hi)| {
             if lo <= c && c <= hi { Equal }
@@ -228,19 +232,27 @@
 
     #[inline]
     fn is_alphabetic(c: char) -> bool {
-        match c {
-            'a' ..= 'z' | 'A' ..= 'Z' => true,
-            c if c > '\x7f' => super::derived_property::Alphabetic(c),
-            _ => false,
+        if super::UNICODE_VERSION_U8 == char::UNICODE_VERSION {
+            c.is_alphabetic()
+        } else {
+            match c {
+                'a' ..= 'z' | 'A' ..= 'Z' => true,
+                c if c > '\\x7f' => super::derived_property::Alphabetic(c),
+                _ => false,
+            }
         }
     }
 
     #[inline]
     fn is_numeric(c: char) -> bool {
-        match c {
-            '0' ..= '9' => true,
-            c if c > '\x7f' => super::general_category::N(c),
-            _ => false,
+        if super::UNICODE_VERSION_U8 == char::UNICODE_VERSION {
+            c.is_numeric()
+        } else {
+            match c {
+                '0' ..= '9' => true,
+                c if c > '\\x7f' => super::general_category::N(c),
+                _ => false,
+            }
         }
     }
 
@@ -252,13 +264,22 @@
 
 """)
 
-def emit_property_module(f, mod, tbl, emit):
-    f.write("mod %s {\n" % mod)
-    for cat in sorted(emit):
-        emit_table(f, "%s_table" % cat, tbl[cat], is_pub=False)
+def emit_property_module(f, mod, tbl, emit: "list[str | tuple[str, str]]"):
+    f.write("pub mod %s {\n" % mod)
+
+    cats = []
+    for cat in emit:
+        if type(cat) is tuple:
+            cats.append((f"{cat[0]}_{cat[1]}", cat))
+        else:
+            cats.append((cat, cat))
+    cats.sort(key=lambda x: x[0])
+
+    for cat_str, cat in cats:
+        emit_table(f, "%s_table" % cat_str, tbl[cat], is_pub=False)
         f.write("    #[inline]\n")
-        f.write("    pub fn %s(c: char) -> bool {\n" % cat)
-        f.write("        super::util::bsearch_range_table(c, %s_table)\n" % cat)
+        f.write("    pub fn %s(c: char) -> bool {\n" % cat_str)
+        f.write("        super::util::bsearch_range_table(c, %s_table)\n" % cat_str)
         f.write("    }\n\n")
     f.write("}\n\n")
 
@@ -303,7 +324,7 @@
         f.write(("        %sC_" % Name[0]) + cat + ",\n")
     f.write("""    }
 
-    fn bsearch_range_value_table(c: char, r: &'static [(char, char, %sCat)], default_lower: u32, default_upper: u32) -> (u32, u32, %sCat) {
+    fn bsearch_range_value_table(c: char, r: &[(char, char, %sCat)], default_lower: u32, default_upper: u32) -> (u32, u32, %sCat) {
         use core::cmp::Ordering::{Equal, Less, Greater};
         match r.binary_search_by(|&(lo, hi, _)| {
             if lo <= c && c <= hi { Equal }
@@ -355,11 +376,11 @@
     else:
       lookup_type = "u32"
 
-    emit_table(f, "%s_cat_lookup" % name, lookup_table, "&'static [%s]" % lookup_type,
+    emit_table(f, "%s_cat_lookup" % name, lookup_table, "&[%s]" % lookup_type,
         pfun=lambda x: "%d" % x,
         is_pub=False, is_const=True)
 
-    emit_table(f, "%s_cat_table" % name, break_table, "&'static [(char, char, %sCat)]" % Name,
+    emit_table(f, "%s_cat_table" % name, break_table, "&[(char, char, %sCat)]" % Name,
         pfun=lambda x: "(%s,%s,%sC_%s)" % (escape_char(x[0]), escape_char(x[1]), Name[0], x[2]),
         is_pub=False, is_const=True)
     f.write("}\n")
@@ -377,19 +398,32 @@
 pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s);
 """ % UNICODE_VERSION)
 
+        rf.write("""
+const UNICODE_VERSION_U8: (u8, u8, u8) = (%s, %s, %s);
+""" % UNICODE_VERSION)
+
         # download and parse all the data
         gencats = load_gencats("UnicodeData.txt")
-        derived = load_properties("DerivedCoreProperties.txt", ["Alphabetic"])
+        derived = load_properties("DerivedCoreProperties.txt", ["Alphabetic", ("InCB", "Consonant"), ("InCB", "Extend"), ("InCB", "Linker")])
 
         emit_util_mod(rf)
         for (name, cat, pfuns) in ("general_category", gencats, ["N"]), \
-                                  ("derived_property", derived, ["Alphabetic"]):
+                                  ("derived_property", derived, ["Alphabetic", ("InCB", "Extend")]):
             emit_property_module(rf, name, cat, pfuns)
 
+        rf.write("""pub fn is_incb_linker(c: char) -> bool {
+    matches!(c,""")
+
+        for (lo, hi) in derived[("InCB", "Linker")]:
+            rf.write(f" | '\\u{{{lo:X}}}'")
+            if lo != hi:
+                rf.write(f"..'\\u{{{lo:X}}}'")
+        
+        rf.write(")\n}\n\n")
+
         ### grapheme cluster module
         # from http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Break_Property_Values
-        grapheme_cats = load_properties("auxiliary/GraphemeBreakProperty.txt", [])
-
+        grapheme_cats = load_properties("auxiliary/GraphemeBreakProperty.txt")
         # Control
         #  Note:
         # This category also includes Cs (surrogate codepoints), but Rust's `char`s are
@@ -398,22 +432,22 @@
         grapheme_cats["Control"] = group_cat(list(
             set(ungroup_cat(grapheme_cats["Control"]))
             - set(ungroup_cat([surrogate_codepoints]))))
-
+        grapheme_cats["InCB_Consonant"] = derived[("InCB", "Consonant")]
+        emoji_props = load_properties("emoji-data.txt", ["Extended_Pictographic"])
+        grapheme_cats["Extended_Pictographic"] = emoji_props["Extended_Pictographic"]
         grapheme_table = []
         for cat in grapheme_cats:
             grapheme_table.extend([(x, y, cat) for (x, y) in grapheme_cats[cat]])
-        emoji_props = load_properties("emoji-data.txt", ["Extended_Pictographic"])
-        grapheme_table.extend([(x, y, "Extended_Pictographic") for (x, y) in emoji_props["Extended_Pictographic"]])
         grapheme_table.sort(key=lambda w: w[0])
         last = -1
         for chars in grapheme_table:
             if chars[0] <= last:
                 raise "Grapheme tables and Extended_Pictographic values overlap; need to store these separately!"
             last = chars[1]
-        emit_break_module(rf, grapheme_table, list(grapheme_cats.keys()) + ["Extended_Pictographic"], "grapheme")
+        emit_break_module(rf, grapheme_table, list(grapheme_cats.keys()), "grapheme")
         rf.write("\n")
 
-        word_cats = load_properties("auxiliary/WordBreakProperty.txt", [])
+        word_cats = load_properties("auxiliary/WordBreakProperty.txt")
         word_table = []
         for cat in word_cats:
             word_table.extend([(x, y, cat) for (x, y) in word_cats[cat]])
@@ -425,7 +459,7 @@
         emoji_table = [(x, y, "Extended_Pictographic") for (x, y) in emoji_props["Extended_Pictographic"]]
         emit_break_module(rf, emoji_table, ["Extended_Pictographic"], "emoji")
 
-        sentence_cats = load_properties("auxiliary/SentenceBreakProperty.txt", [])
+        sentence_cats = load_properties("auxiliary/SentenceBreakProperty.txt")
         sentence_table = []
         for cat in sentence_cats:
             sentence_table.extend([(x, y, cat) for (x, y) in sentence_cats[cat]])
diff --git a/crates/unicode-segmentation/scripts/unicode_gen_breaktests.py b/crates/unicode-segmentation/scripts/unicode_gen_breaktests.py
index 113afa9..8dbc42e 100755
--- a/crates/unicode-segmentation/scripts/unicode_gen_breaktests.py
+++ b/crates/unicode-segmentation/scripts/unicode_gen_breaktests.py
@@ -140,8 +140,8 @@
     return outstr
 
 def create_grapheme_data(f):
-    # rules 9.1 and 9.2 are for extended graphemes only
-    optsplits = ['9.1','9.2']
+    # rules 9.1, 9.2, and 9.3 are for extended graphemes only
+    optsplits = ['9.1', '9.2', '9.3']
     d = load_test_data("auxiliary/GraphemeBreakTest.txt", optsplits)
 
     test_same = []
@@ -169,8 +169,8 @@
         else:
             test_diff.append((allchars, extgraphs, c))
 
-    stype = "&'static [(&'static str, &'static [&'static str])]"
-    dtype = "&'static [(&'static str, &'static [&'static str], &'static [&'static str])]"
+    stype = "&[(&str, &[&str])]"
+    dtype = "&[(&str, &[&str], &[&str])]"
     f.write("    // official Unicode test data\n")
     f.write("    // http://www.unicode.org/Public/%s/ucd/auxiliary/GraphemeBreakTest.txt\n" % unicode.UNICODE_VERSION_NUMBER)
     unicode.emit_table(f, "TEST_SAME", test_same, stype, True, showfun, True)
@@ -185,7 +185,7 @@
         allchars = [cn for s in c for cn in s]
         test.append((allchars, c))
 
-    wtype = "&'static [(&'static str, &'static [&'static str])]"
+    wtype = "&[(&str, &[&str])]"
     f.write("    // official Unicode test data\n")
     f.write("    // http://www.unicode.org/Public/%s/ucd/auxiliary/WordBreakTest.txt\n" % unicode.UNICODE_VERSION_NUMBER)
     unicode.emit_table(f, "TEST_WORD", test, wtype, True, showfun, True)
@@ -199,7 +199,7 @@
         allchars = [cn for s in c for cn in s]
         test.append((allchars, c))
 
-    wtype = "&'static [(&'static str, &'static [&'static str])]"
+    wtype = "&[(&str, &[&str])]"
     f.write("    // official Unicode test data\n")
     f.write("    // http://www.unicode.org/Public/%s/ucd/auxiliary/SentenceBreakTest.txt\n" % unicode.UNICODE_VERSION_NUMBER)
     unicode.emit_table(f, "TEST_SENTENCE", test, wtype, True, showfun, True)
diff --git a/crates/unicode-segmentation/src/grapheme.rs b/crates/unicode-segmentation/src/grapheme.rs
index eb554c9..b09efed 100644
--- a/crates/unicode-segmentation/src/grapheme.rs
+++ b/crates/unicode-segmentation/src/grapheme.rs
@@ -19,7 +19,7 @@
 ///
 /// [`grapheme_indices`]: trait.UnicodeSegmentation.html#tymethod.grapheme_indices
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
-#[derive(Clone)]
+#[derive(Debug, Clone)]
 pub struct GraphemeIndices<'a> {
     start_offset: usize,
     iter: Graphemes<'a>,
@@ -140,7 +140,7 @@
 }
 
 #[inline]
-pub fn new_graphemes<'b>(s: &'b str, is_extended: bool) -> Graphemes<'b> {
+pub fn new_graphemes(s: &str, is_extended: bool) -> Graphemes<'_> {
     let len = s.len();
     Graphemes {
         string: s,
@@ -150,28 +150,33 @@
 }
 
 #[inline]
-pub fn new_grapheme_indices<'b>(s: &'b str, is_extended: bool) -> GraphemeIndices<'b> {
+pub fn new_grapheme_indices(s: &str, is_extended: bool) -> GraphemeIndices<'_> {
     GraphemeIndices {
         start_offset: s.as_ptr() as usize,
         iter: new_graphemes(s, is_extended),
     }
 }
 
-// maybe unify with PairResult?
-// An enum describing information about a potential boundary.
+/// maybe unify with PairResult?
+/// An enum describing information about a potential boundary.
 #[derive(PartialEq, Eq, Clone, Debug)]
 enum GraphemeState {
-    // No information is known.
+    /// No information is known.
     Unknown,
-    // It is known to not be a boundary.
+    /// It is known to not be a boundary.
     NotBreak,
-    // It is known to be a boundary.
+    /// It is known to be a boundary.
     Break,
-    // The codepoint after is a Regional Indicator Symbol, so a boundary iff
-    // it is preceded by an even number of RIS codepoints. (GB12, GB13)
+    /// The codepoint after it has Indic_Conjunct_Break=Consonant,
+    /// so there is a break before so a boundary if it is preceded by another
+    /// InCB=Consonant follwoed by a sequence consisting of one or more InCB=Linker
+    /// and zero or more InCB = Extend (in any order).
+    InCbConsonant,
+    /// The codepoint after is a Regional Indicator Symbol, so a boundary iff
+    /// it is preceded by an even number of RIS codepoints. (GB12, GB13)
     Regional,
-    // The codepoint after is Extended_Pictographic,
-    // so whether it's a boundary depends on pre-context according to GB11.
+    /// The codepoint after is Extended_Pictographic,
+    /// so whether it's a boundary depends on pre-context according to GB11.
     Emoji,
 }
 
@@ -181,30 +186,33 @@
 /// fully known at initialization time.
 #[derive(Clone, Debug)]
 pub struct GraphemeCursor {
-    // Current cursor position.
+    /// Current cursor position.
     offset: usize,
-    // Total length of the string.
+    /// Total length of the string.
     len: usize,
-    // A config flag indicating whether this cursor computes legacy or extended
-    // grapheme cluster boundaries (enables GB9a and GB9b if set).
+    /// A config flag indicating whether this cursor computes legacy or extended
+    /// grapheme cluster boundaries (enables GB9a and GB9b if set).
     is_extended: bool,
-    // Information about the potential boundary at `offset`
+    /// Information about the potential boundary at `offset`
     state: GraphemeState,
-    // Category of codepoint immediately preceding cursor, if known.
+    /// Category of codepoint immediately preceding cursor, if known.
     cat_before: Option<GraphemeCat>,
-    // Category of codepoint immediately after cursor, if known.
+    /// Category of codepoint immediately after cursor, if known.
     cat_after: Option<GraphemeCat>,
-    // If set, at least one more codepoint immediately preceding this offset
-    // is needed to resolve whether there's a boundary at `offset`.
+    /// If set, at least one more codepoint immediately preceding this offset
+    /// is needed to resolve whether there's a boundary at `offset`.
     pre_context_offset: Option<usize>,
-    // The number of RIS codepoints preceding `offset`. If `pre_context_offset`
-    // is set, then counts the number of RIS between that and `offset`, otherwise
-    // is an accurate count relative to the string.
+    /// The number of `InCB=Linker` codepoints preceding `offset`
+    /// (potentially intermingled with `InCB=Extend`).
+    incb_linker_count: Option<usize>,
+    /// The number of RIS codepoints preceding `offset`. If `pre_context_offset`
+    /// is set, then counts the number of RIS between that and `offset`, otherwise
+    /// is an accurate count relative to the string.
     ris_count: Option<usize>,
-    // Set if a call to `prev_boundary` or `next_boundary` was suspended due
-    // to needing more input.
+    /// Set if a call to `prev_boundary` or `next_boundary` was suspended due
+    /// to needing more input.
     resuming: bool,
-    // Cached grapheme category and associated scalar value range.
+    /// Cached grapheme category and associated scalar value range.
     grapheme_cat_cache: (u32, u32, GraphemeCat),
 }
 
@@ -235,11 +243,21 @@
 // An enum describing the result from lookup of a pair of categories.
 #[derive(PartialEq, Eq)]
 enum PairResult {
-    NotBreak, // definitely not a break
-    Break,    // definitely a break
-    Extended, // a break iff not in extended mode
-    Regional, // a break if preceded by an even number of RIS
-    Emoji,    // a break if preceded by emoji base and (Extend)*
+    /// definitely not a break
+    NotBreak,
+    /// definitely a break
+    Break,
+    /// a break iff not in extended mode
+    Extended,
+    /// a break unless in extended mode and preceded by
+    /// a sequence of 0 or more InCB=Extend and one or more
+    /// InCB = Linker (in any order),
+    /// preceded by another InCB=Consonant
+    InCbConsonant,
+    /// a break if preceded by an even number of RIS
+    Regional,
+    /// a break if preceded by emoji base and (Extend)*
+    Emoji,
 }
 
 #[inline]
@@ -248,26 +266,15 @@
     use crate::tables::grapheme::GraphemeCat::*;
     match (before, after) {
         (GC_CR, GC_LF) => NotBreak,                                 // GB3
-        (GC_Control, _) => Break,                                   // GB4
-        (GC_CR, _) => Break,                                        // GB4
-        (GC_LF, _) => Break,                                        // GB4
-        (_, GC_Control) => Break,                                   // GB5
-        (_, GC_CR) => Break,                                        // GB5
-        (_, GC_LF) => Break,                                        // GB5
-        (GC_L, GC_L) => NotBreak,                                   // GB6
-        (GC_L, GC_V) => NotBreak,                                   // GB6
-        (GC_L, GC_LV) => NotBreak,                                  // GB6
-        (GC_L, GC_LVT) => NotBreak,                                 // GB6
-        (GC_LV, GC_V) => NotBreak,                                  // GB7
-        (GC_LV, GC_T) => NotBreak,                                  // GB7
-        (GC_V, GC_V) => NotBreak,                                   // GB7
-        (GC_V, GC_T) => NotBreak,                                   // GB7
-        (GC_LVT, GC_T) => NotBreak,                                 // GB8
-        (GC_T, GC_T) => NotBreak,                                   // GB8
-        (_, GC_Extend) => NotBreak,                                 // GB9
-        (_, GC_ZWJ) => NotBreak,                                    // GB9
+        (GC_Control | GC_CR | GC_LF, _) => Break,                   // GB4
+        (_, GC_Control | GC_CR | GC_LF) => Break,                   // GB5
+        (GC_L, GC_L | GC_V | GC_LV | GC_LVT) => NotBreak,           // GB6
+        (GC_LV | GC_V, GC_V | GC_T) => NotBreak,                    // GB7
+        (GC_LVT | GC_T, GC_T) => NotBreak,                          // GB8
+        (_, GC_Extend | GC_ZWJ) => NotBreak,                        // GB9
         (_, GC_SpacingMark) => Extended,                            // GB9a
         (GC_Prepend, _) => Extended,                                // GB9b
+        (_, GC_InCB_Consonant) => InCbConsonant,                    // GB9c
         (GC_ZWJ, GC_Extended_Pictographic) => Emoji,                // GB11
         (GC_Regional_Indicator, GC_Regional_Indicator) => Regional, // GB12, GB13
         (_, _) => Break,                                            // GB999
@@ -296,13 +303,14 @@
             GraphemeState::Unknown
         };
         GraphemeCursor {
-            offset: offset,
-            len: len,
-            state: state,
-            is_extended: is_extended,
+            offset,
+            len,
+            state,
+            is_extended,
             cat_before: None,
             cat_after: None,
             pre_context_offset: None,
+            incb_linker_count: None,
             ris_count: None,
             resuming: false,
             grapheme_cat_cache: (0, 0, GraphemeCat::GC_Control),
@@ -360,6 +368,7 @@
             // reset state derived from text around cursor
             self.cat_before = None;
             self.cat_after = None;
+            self.incb_linker_count = None;
             self.ris_count = None;
         }
     }
@@ -403,21 +412,22 @@
     /// ```
     pub fn provide_context(&mut self, chunk: &str, chunk_start: usize) {
         use crate::tables::grapheme as gr;
-        assert!(chunk_start + chunk.len() == self.pre_context_offset.unwrap());
+        assert!(chunk_start.saturating_add(chunk.len()) == self.pre_context_offset.unwrap());
         self.pre_context_offset = None;
         if self.is_extended && chunk_start + chunk.len() == self.offset {
-            let ch = chunk.chars().rev().next().unwrap();
+            let ch = chunk.chars().next_back().unwrap();
             if self.grapheme_category(ch) == gr::GC_Prepend {
                 self.decide(false); // GB9b
                 return;
             }
         }
         match self.state {
+            GraphemeState::InCbConsonant => self.handle_incb_consonant(chunk, chunk_start),
             GraphemeState::Regional => self.handle_regional(chunk, chunk_start),
             GraphemeState::Emoji => self.handle_emoji(chunk, chunk_start),
             _ => {
                 if self.cat_before.is_none() && self.offset == chunk.len() + chunk_start {
-                    let ch = chunk.chars().rev().next().unwrap();
+                    let ch = chunk.chars().next_back().unwrap();
                     self.cat_before = Some(self.grapheme_category(ch));
                 }
             }
@@ -452,6 +462,54 @@
         }
     }
 
+    /// For handling rule GB9c:
+    ///
+    /// There's an `InCB=Consonant` after this, and we need to look back
+    /// to verify whether there should be a break.
+    ///
+    /// Seek backward to find an `InCB=Linker` preceded by an `InCB=Consonsnt`
+    /// (potentially separated by some number of `InCB=Linker` or `InCB=Extend`).
+    /// If we find the consonant in question, then there's no break; if we find a consonant
+    /// with no linker, or a non-linker non-extend non-consonant, or the start of text, there's a break;
+    /// otherwise we need more context
+    #[inline]
+    fn handle_incb_consonant(&mut self, chunk: &str, chunk_start: usize) {
+        use crate::tables::{self, grapheme as gr};
+
+        // GB9c only applies to extended grapheme clusters
+        if !self.is_extended {
+            self.decide(true);
+            return;
+        }
+
+        let mut incb_linker_count = self.incb_linker_count.unwrap_or(0);
+
+        for ch in chunk.chars().rev() {
+            if tables::is_incb_linker(ch) {
+                // We found an InCB linker
+                incb_linker_count += 1;
+                self.incb_linker_count = Some(incb_linker_count);
+            } else if tables::derived_property::InCB_Extend(ch) {
+                // We ignore InCB extends, continue
+            } else {
+                // Prev character is neither linker nor extend, break suppressed iff it's InCB=Consonant
+                let result = !(self.incb_linker_count.unwrap_or(0) > 0
+                    && self.grapheme_category(ch) == gr::GC_InCB_Consonant);
+                self.decide(result);
+                return;
+            }
+        }
+
+        if chunk_start == 0 {
+            // Start of text and we still haven't found a consonant, so break
+            self.decide(true);
+        } else {
+            // We need more context
+            self.pre_context_offset = Some(chunk_start);
+            self.state = GraphemeState::InCbConsonant;
+        }
+    }
+
     #[inline]
     fn handle_regional(&mut self, chunk: &str, chunk_start: usize) {
         use crate::tables::grapheme as gr;
@@ -467,10 +525,10 @@
         self.ris_count = Some(ris_count);
         if chunk_start == 0 {
             self.decide((ris_count % 2) == 0);
-            return;
+        } else {
+            self.pre_context_offset = Some(chunk_start);
+            self.state = GraphemeState::Regional;
         }
-        self.pre_context_offset = Some(chunk_start);
-        self.state = GraphemeState::Regional;
     }
 
     #[inline]
@@ -498,10 +556,10 @@
         }
         if chunk_start == 0 {
             self.decide(true);
-            return;
+        } else {
+            self.pre_context_offset = Some(chunk_start);
+            self.state = GraphemeState::Emoji;
         }
-        self.pre_context_offset = Some(chunk_start);
-        self.state = GraphemeState::Emoji;
     }
 
     #[inline]
@@ -540,15 +598,15 @@
         if self.state == GraphemeState::NotBreak {
             return Ok(false);
         }
-        if self.offset < chunk_start || self.offset >= chunk_start + chunk.len() {
-            if self.offset > chunk_start + chunk.len() || self.cat_after.is_none() {
-                return Err(GraphemeIncomplete::InvalidOffset);
-            }
+        if (self.offset < chunk_start || self.offset >= chunk_start.saturating_add(chunk.len()))
+            && (self.offset > chunk_start.saturating_add(chunk.len()) || self.cat_after.is_none())
+        {
+            return Err(GraphemeIncomplete::InvalidOffset);
         }
         if let Some(pre_context_offset) = self.pre_context_offset {
             return Err(GraphemeIncomplete::PreContext(pre_context_offset));
         }
-        let offset_in_chunk = self.offset - chunk_start;
+        let offset_in_chunk = self.offset.saturating_sub(chunk_start);
         if self.cat_after.is_none() {
             let ch = chunk[offset_in_chunk..].chars().next().unwrap();
             self.cat_after = Some(self.grapheme_category(ch));
@@ -556,6 +614,7 @@
         if self.offset == chunk_start {
             let mut need_pre_context = true;
             match self.cat_after.unwrap() {
+                gr::GC_InCB_Consonant => self.state = GraphemeState::InCbConsonant,
                 gr::GC_Regional_Indicator => self.state = GraphemeState::Regional,
                 gr::GC_Extended_Pictographic => self.state = GraphemeState::Emoji,
                 _ => need_pre_context = self.cat_before.is_none(),
@@ -566,15 +625,19 @@
             }
         }
         if self.cat_before.is_none() {
-            let ch = chunk[..offset_in_chunk].chars().rev().next().unwrap();
+            let ch = chunk[..offset_in_chunk].chars().next_back().unwrap();
             self.cat_before = Some(self.grapheme_category(ch));
         }
         match check_pair(self.cat_before.unwrap(), self.cat_after.unwrap()) {
-            PairResult::NotBreak => return self.decision(false),
-            PairResult::Break => return self.decision(true),
+            PairResult::NotBreak => self.decision(false),
+            PairResult::Break => self.decision(true),
             PairResult::Extended => {
                 let is_extended = self.is_extended;
-                return self.decision(!is_extended);
+                self.decision(!is_extended)
+            }
+            PairResult::InCbConsonant => {
+                self.handle_incb_consonant(&chunk[..offset_in_chunk], chunk_start);
+                self.is_boundary_result()
             }
             PairResult::Regional => {
                 if let Some(ris_count) = self.ris_count {
@@ -631,20 +694,28 @@
         if self.offset == self.len {
             return Ok(None);
         }
-        let mut iter = chunk[self.offset - chunk_start..].chars();
-        let mut ch = iter.next().unwrap();
+        let mut iter = chunk[self.offset.saturating_sub(chunk_start)..].chars();
+        let mut ch = match iter.next() {
+            Some(ch) => ch,
+            None => return Err(GraphemeIncomplete::NextChunk),
+        };
         loop {
             if self.resuming {
                 if self.cat_after.is_none() {
                     self.cat_after = Some(self.grapheme_category(ch));
                 }
             } else {
-                self.offset += ch.len_utf8();
+                self.offset = self.offset.saturating_add(ch.len_utf8());
                 self.state = GraphemeState::Unknown;
                 self.cat_before = self.cat_after.take();
                 if self.cat_before.is_none() {
                     self.cat_before = Some(self.grapheme_category(ch));
                 }
+                if crate::tables::is_incb_linker(ch) {
+                    self.incb_linker_count = Some(self.incb_linker_count.map_or(1, |c| c + 1));
+                } else if !crate::tables::derived_property::InCB_Extend(ch) {
+                    self.incb_linker_count = Some(0);
+                }
                 if self.cat_before.unwrap() == GraphemeCat::GC_Regional_Indicator {
                     self.ris_count = self.ris_count.map(|c| c + 1);
                 } else {
@@ -713,7 +784,9 @@
         if self.offset == chunk_start {
             return Err(GraphemeIncomplete::PrevChunk);
         }
-        let mut iter = chunk[..self.offset - chunk_start].chars().rev();
+        let mut iter = chunk[..self.offset.saturating_sub(chunk_start)]
+            .chars()
+            .rev();
         let mut ch = iter.next().unwrap();
         loop {
             if self.offset == chunk_start {
@@ -726,6 +799,15 @@
                 self.offset -= ch.len_utf8();
                 self.cat_after = self.cat_before.take();
                 self.state = GraphemeState::Unknown;
+                if let Some(incb_linker_count) = self.incb_linker_count {
+                    self.ris_count = if incb_linker_count > 0 && crate::tables::is_incb_linker(ch) {
+                        Some(incb_linker_count - 1)
+                    } else if crate::tables::derived_property::InCB_Extend(ch) {
+                        Some(incb_linker_count)
+                    } else {
+                        None
+                    };
+                }
                 if let Some(ris_count) = self.ris_count {
                     self.ris_count = if ris_count > 0 {
                         Some(ris_count - 1)
diff --git a/crates/unicode-segmentation/src/lib.rs b/crates/unicode-segmentation/src/lib.rs
index 809c5dc..c8ec5b5 100644
--- a/crates/unicode-segmentation/src/lib.rs
+++ b/crates/unicode-segmentation/src/lib.rs
@@ -56,14 +56,6 @@
 )]
 #![no_std]
 
-#[cfg(test)]
-#[macro_use]
-extern crate std;
-
-#[cfg(test)]
-#[macro_use]
-extern crate quickcheck;
-
 pub use grapheme::{GraphemeCursor, GraphemeIncomplete};
 pub use grapheme::{GraphemeIndices, Graphemes};
 pub use sentence::{USentenceBoundIndices, USentenceBounds, UnicodeSentences};
@@ -71,16 +63,11 @@
 pub use word::{UWordBoundIndices, UWordBounds, UnicodeWordIndices, UnicodeWords};
 
 mod grapheme;
+mod sentence;
 #[rustfmt::skip]
 mod tables;
-mod sentence;
 mod word;
 
-#[cfg(test)]
-mod test;
-#[cfg(test)]
-mod testdata;
-
 /// Methods for segmenting strings according to
 /// [Unicode Standard Annex #29](http://www.unicode.org/reports/tr29/).
 pub trait UnicodeSegmentation {
@@ -109,7 +96,7 @@
     ///
     /// assert_eq!(&gr2[..], b);
     /// ```
-    fn graphemes<'a>(&'a self, is_extended: bool) -> Graphemes<'a>;
+    fn graphemes(&self, is_extended: bool) -> Graphemes<'_>;
 
     /// Returns an iterator over the grapheme clusters of `self` and their
     /// byte offsets. See `graphemes()` for more information.
@@ -124,7 +111,7 @@
     ///
     /// assert_eq!(&gr_inds[..], b);
     /// ```
-    fn grapheme_indices<'a>(&'a self, is_extended: bool) -> GraphemeIndices<'a>;
+    fn grapheme_indices(&self, is_extended: bool) -> GraphemeIndices<'_>;
 
     /// Returns an iterator over the words of `self`, separated on
     /// [UAX#29 word boundaries](http://www.unicode.org/reports/tr29/#Word_Boundaries).
@@ -146,7 +133,7 @@
     ///
     /// assert_eq!(&uw1[..], b);
     /// ```
-    fn unicode_words<'a>(&'a self) -> UnicodeWords<'a>;
+    fn unicode_words(&self) -> UnicodeWords<'_>;
 
     /// Returns an iterator over the words of `self`, separated on
     /// [UAX#29 word boundaries](http://www.unicode.org/reports/tr29/#Word_Boundaries), and their
@@ -170,7 +157,7 @@
     ///
     /// assert_eq!(&uwi1[..], b);
     /// ```
-    fn unicode_word_indices<'a>(&'a self) -> UnicodeWordIndices<'a>;
+    fn unicode_word_indices(&self) -> UnicodeWordIndices<'_>;
 
     /// Returns an iterator over substrings of `self` separated on
     /// [UAX#29 word boundaries](http://www.unicode.org/reports/tr29/#Word_Boundaries).
@@ -186,7 +173,7 @@
     ///
     /// assert_eq!(&swu1[..], b);
     /// ```
-    fn split_word_bounds<'a>(&'a self) -> UWordBounds<'a>;
+    fn split_word_bounds(&self) -> UWordBounds<'_>;
 
     /// Returns an iterator over substrings of `self`, split on UAX#29 word boundaries,
     /// and their offsets. See `split_word_bounds()` for more information.
@@ -201,7 +188,7 @@
     ///
     /// assert_eq!(&swi1[..], b);
     /// ```
-    fn split_word_bound_indices<'a>(&'a self) -> UWordBoundIndices<'a>;
+    fn split_word_bound_indices(&self) -> UWordBoundIndices<'_>;
 
     /// Returns an iterator over substrings of `self` separated on
     /// [UAX#29 sentence boundaries](http://www.unicode.org/reports/tr29/#Sentence_Boundaries).
@@ -223,7 +210,7 @@
     ///
     /// assert_eq!(&us1[..], b);
     /// ```
-    fn unicode_sentences<'a>(&'a self) -> UnicodeSentences<'a>;
+    fn unicode_sentences(&self) -> UnicodeSentences<'_>;
 
     /// Returns an iterator over substrings of `self` separated on
     /// [UAX#29 sentence boundaries](http://www.unicode.org/reports/tr29/#Sentence_Boundaries).
@@ -240,7 +227,7 @@
     ///
     /// assert_eq!(&ssb1[..], b);
     /// ```
-    fn split_sentence_bounds<'a>(&'a self) -> USentenceBounds<'a>;
+    fn split_sentence_bounds(&self) -> USentenceBounds<'_>;
 
     /// Returns an iterator over substrings of `self`, split on UAX#29 sentence boundaries,
     /// and their offsets. See `split_sentence_bounds()` for more information.
@@ -256,7 +243,7 @@
     ///
     /// assert_eq!(&ssi1[..], b);
     /// ```
-    fn split_sentence_bound_indices<'a>(&'a self) -> USentenceBoundIndices<'a>;
+    fn split_sentence_bound_indices(&self) -> USentenceBoundIndices<'_>;
 }
 
 impl UnicodeSegmentation for str {
diff --git a/crates/unicode-segmentation/src/sentence.rs b/crates/unicode-segmentation/src/sentence.rs
index 78d87b4..551d858 100644
--- a/crates/unicode-segmentation/src/sentence.rs
+++ b/crates/unicode-segmentation/src/sentence.rs
@@ -18,7 +18,7 @@
 
     // Describe a parsed part of source string as described in this table:
     // https://unicode.org/reports/tr29/#Default_Sentence_Boundaries
-    #[derive(Clone, Copy, PartialEq, Eq)]
+    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
     enum StatePart {
         Sot,
         Eot,
@@ -33,7 +33,7 @@
         STerm,
     }
 
-    #[derive(Clone, PartialEq, Eq)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
     struct SentenceBreaksState(pub [StatePart; 4]);
 
     const INITIAL_STATE: SentenceBreaksState = SentenceBreaksState([
@@ -43,7 +43,7 @@
         StatePart::Sot,
     ]);
 
-    #[derive(Clone)]
+    #[derive(Debug, Clone)]
     pub struct SentenceBreaks<'a> {
         pub string: &'a str,
         pos: usize,
@@ -264,9 +264,7 @@
             }
 
             // SB2 https://unicode.org/reports/tr29/#SB2
-            if self.state.match1(StatePart::Sot) {
-                None
-            } else if self.state.match1(StatePart::Eot) {
+            if self.state.match1(StatePart::Sot) || self.state.match1(StatePart::Eot) {
                 None
             } else {
                 self.state = self.state.end();
@@ -275,7 +273,7 @@
         }
     }
 
-    pub fn new_sentence_breaks<'a>(source: &'a str) -> SentenceBreaks<'a> {
+    pub fn new_sentence_breaks(source: &str) -> SentenceBreaks<'_> {
         SentenceBreaks {
             string: source,
             pos: 0,
@@ -296,7 +294,7 @@
 ///
 /// [`unicode_sentences`]: trait.UnicodeSegmentation.html#tymethod.unicode_sentences
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
-#[derive(Clone)]
+#[derive(Debug, Clone)]
 pub struct UnicodeSentences<'a> {
     inner: Filter<USentenceBounds<'a>, fn(&&str) -> bool>,
 }
@@ -309,7 +307,7 @@
 ///
 /// [`split_sentence_bounds`]: trait.UnicodeSegmentation.html#tymethod.split_sentence_bounds
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
-#[derive(Clone)]
+#[derive(Debug, Clone)]
 pub struct USentenceBounds<'a> {
     iter: fwd::SentenceBreaks<'a>,
     sentence_start: Option<usize>,
@@ -322,14 +320,14 @@
 ///
 /// [`split_sentence_bound_indices`]: trait.UnicodeSegmentation.html#tymethod.split_sentence_bound_indices
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
-#[derive(Clone)]
+#[derive(Debug, Clone)]
 pub struct USentenceBoundIndices<'a> {
     start_offset: usize,
     iter: USentenceBounds<'a>,
 }
 
 #[inline]
-pub fn new_sentence_bounds<'a>(source: &'a str) -> USentenceBounds<'a> {
+pub fn new_sentence_bounds(source: &str) -> USentenceBounds<'_> {
     USentenceBounds {
         iter: fwd::new_sentence_breaks(source),
         sentence_start: None,
@@ -337,7 +335,7 @@
 }
 
 #[inline]
-pub fn new_sentence_bound_indices<'a>(source: &'a str) -> USentenceBoundIndices<'a> {
+pub fn new_sentence_bound_indices(source: &str) -> USentenceBoundIndices<'_> {
     USentenceBoundIndices {
         start_offset: source.as_ptr() as usize,
         iter: new_sentence_bounds(source),
@@ -345,12 +343,12 @@
 }
 
 #[inline]
-pub fn new_unicode_sentences<'b>(s: &'b str) -> UnicodeSentences<'b> {
+pub fn new_unicode_sentences(s: &str) -> UnicodeSentences<'_> {
     use super::UnicodeSegmentation;
     use crate::tables::util::is_alphanumeric;
 
     fn has_alphanumeric(s: &&str) -> bool {
-        s.chars().any(|c| is_alphanumeric(c))
+        s.chars().any(is_alphanumeric)
     }
     let has_alphanumeric: fn(&&str) -> bool = has_alphanumeric; // coerce to fn pointer
 
@@ -366,6 +364,11 @@
     fn next(&mut self) -> Option<&'a str> {
         self.inner.next()
     }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.inner.size_hint()
+    }
 }
 
 impl<'a> Iterator for USentenceBounds<'a> {
@@ -379,7 +382,7 @@
 
     #[inline]
     fn next(&mut self) -> Option<&'a str> {
-        if self.sentence_start == None {
+        if self.sentence_start.is_none() {
             if let Some(start_pos) = self.iter.next() {
                 self.sentence_start = Some(start_pos)
             } else {
diff --git a/crates/unicode-segmentation/src/tables.rs b/crates/unicode-segmentation/src/tables.rs
index ca83b50..b39c24c 100644
--- a/crates/unicode-segmentation/src/tables.rs
+++ b/crates/unicode-segmentation/src/tables.rs
@@ -14,11 +14,13 @@
 
 /// The version of [Unicode](http://www.unicode.org/)
 /// that this version of unicode-segmentation is based on.
-pub const UNICODE_VERSION: (u64, u64, u64) = (15, 0, 0);
+pub const UNICODE_VERSION: (u64, u64, u64) = (16, 0, 0);
+
+const UNICODE_VERSION_U8: (u8, u8, u8) = (16, 0, 0);
 
 pub mod util {
     #[inline]
-    pub fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
+    pub fn bsearch_range_table(c: char, r: &[(char,char)]) -> bool {
         use core::cmp::Ordering::{Equal, Less, Greater};
         r.binary_search_by(|&(lo,hi)| {
             if lo <= c && c <= hi { Equal }
@@ -29,19 +31,27 @@
 
     #[inline]
     fn is_alphabetic(c: char) -> bool {
-        match c {
-            'a' ..= 'z' | 'A' ..= 'Z' => true,
-            c if c > '' => super::derived_property::Alphabetic(c),
-            _ => false,
+        if super::UNICODE_VERSION_U8 == char::UNICODE_VERSION {
+            c.is_alphabetic()
+        } else {
+            match c {
+                'a' ..= 'z' | 'A' ..= 'Z' => true,
+                c if c > '\x7f' => super::derived_property::Alphabetic(c),
+                _ => false,
+            }
         }
     }
 
     #[inline]
     fn is_numeric(c: char) -> bool {
-        match c {
-            '0' ..= '9' => true,
-            c if c > '' => super::general_category::N(c),
-            _ => false,
+        if super::UNICODE_VERSION_U8 == char::UNICODE_VERSION {
+            c.is_numeric()
+        } else {
+            match c {
+                '0' ..= '9' => true,
+                c if c > '\x7f' => super::general_category::N(c),
+                _ => false,
+            }
         }
     }
 
@@ -51,8 +61,8 @@
     }
 }
 
-mod general_category {
-    const N_table: &'static [(char, char)] = &[
+pub mod general_category {
+    const N_table: &[(char, char)] = &[
         ('\u{30}', '\u{39}'), ('\u{b2}', '\u{b3}'), ('\u{b9}', '\u{b9}'), ('\u{bc}', '\u{be}'),
         ('\u{660}', '\u{669}'), ('\u{6f0}', '\u{6f9}'), ('\u{7c0}', '\u{7c9}'), ('\u{966}',
         '\u{96f}'), ('\u{9e6}', '\u{9ef}'), ('\u{9f4}', '\u{9f9}'), ('\u{a66}', '\u{a6f}'),
@@ -80,22 +90,24 @@
         ('\u{109c0}', '\u{109cf}'), ('\u{109d2}', '\u{109ff}'), ('\u{10a40}', '\u{10a48}'),
         ('\u{10a7d}', '\u{10a7e}'), ('\u{10a9d}', '\u{10a9f}'), ('\u{10aeb}', '\u{10aef}'),
         ('\u{10b58}', '\u{10b5f}'), ('\u{10b78}', '\u{10b7f}'), ('\u{10ba9}', '\u{10baf}'),
-        ('\u{10cfa}', '\u{10cff}'), ('\u{10d30}', '\u{10d39}'), ('\u{10e60}', '\u{10e7e}'),
-        ('\u{10f1d}', '\u{10f26}'), ('\u{10f51}', '\u{10f54}'), ('\u{10fc5}', '\u{10fcb}'),
-        ('\u{11052}', '\u{1106f}'), ('\u{110f0}', '\u{110f9}'), ('\u{11136}', '\u{1113f}'),
-        ('\u{111d0}', '\u{111d9}'), ('\u{111e1}', '\u{111f4}'), ('\u{112f0}', '\u{112f9}'),
-        ('\u{11450}', '\u{11459}'), ('\u{114d0}', '\u{114d9}'), ('\u{11650}', '\u{11659}'),
-        ('\u{116c0}', '\u{116c9}'), ('\u{11730}', '\u{1173b}'), ('\u{118e0}', '\u{118f2}'),
-        ('\u{11950}', '\u{11959}'), ('\u{11c50}', '\u{11c6c}'), ('\u{11d50}', '\u{11d59}'),
+        ('\u{10cfa}', '\u{10cff}'), ('\u{10d30}', '\u{10d39}'), ('\u{10d40}', '\u{10d49}'),
+        ('\u{10e60}', '\u{10e7e}'), ('\u{10f1d}', '\u{10f26}'), ('\u{10f51}', '\u{10f54}'),
+        ('\u{10fc5}', '\u{10fcb}'), ('\u{11052}', '\u{1106f}'), ('\u{110f0}', '\u{110f9}'),
+        ('\u{11136}', '\u{1113f}'), ('\u{111d0}', '\u{111d9}'), ('\u{111e1}', '\u{111f4}'),
+        ('\u{112f0}', '\u{112f9}'), ('\u{11450}', '\u{11459}'), ('\u{114d0}', '\u{114d9}'),
+        ('\u{11650}', '\u{11659}'), ('\u{116c0}', '\u{116c9}'), ('\u{116d0}', '\u{116e3}'),
+        ('\u{11730}', '\u{1173b}'), ('\u{118e0}', '\u{118f2}'), ('\u{11950}', '\u{11959}'),
+        ('\u{11bf0}', '\u{11bf9}'), ('\u{11c50}', '\u{11c6c}'), ('\u{11d50}', '\u{11d59}'),
         ('\u{11da0}', '\u{11da9}'), ('\u{11f50}', '\u{11f59}'), ('\u{11fc0}', '\u{11fd4}'),
-        ('\u{12400}', '\u{1246e}'), ('\u{16a60}', '\u{16a69}'), ('\u{16ac0}', '\u{16ac9}'),
-        ('\u{16b50}', '\u{16b59}'), ('\u{16b5b}', '\u{16b61}'), ('\u{16e80}', '\u{16e96}'),
+        ('\u{12400}', '\u{1246e}'), ('\u{16130}', '\u{16139}'), ('\u{16a60}', '\u{16a69}'),
+        ('\u{16ac0}', '\u{16ac9}'), ('\u{16b50}', '\u{16b59}'), ('\u{16b5b}', '\u{16b61}'),
+        ('\u{16d70}', '\u{16d79}'), ('\u{16e80}', '\u{16e96}'), ('\u{1ccf0}', '\u{1ccf9}'),
         ('\u{1d2c0}', '\u{1d2d3}'), ('\u{1d2e0}', '\u{1d2f3}'), ('\u{1d360}', '\u{1d378}'),
         ('\u{1d7ce}', '\u{1d7ff}'), ('\u{1e140}', '\u{1e149}'), ('\u{1e2f0}', '\u{1e2f9}'),
-        ('\u{1e4f0}', '\u{1e4f9}'), ('\u{1e8c7}', '\u{1e8cf}'), ('\u{1e950}', '\u{1e959}'),
-        ('\u{1ec71}', '\u{1ecab}'), ('\u{1ecad}', '\u{1ecaf}'), ('\u{1ecb1}', '\u{1ecb4}'),
-        ('\u{1ed01}', '\u{1ed2d}'), ('\u{1ed2f}', '\u{1ed3d}'), ('\u{1f100}', '\u{1f10c}'),
-        ('\u{1fbf0}', '\u{1fbf9}')
+        ('\u{1e4f0}', '\u{1e4f9}'), ('\u{1e5f1}', '\u{1e5fa}'), ('\u{1e8c7}', '\u{1e8cf}'),
+        ('\u{1e950}', '\u{1e959}'), ('\u{1ec71}', '\u{1ecab}'), ('\u{1ecad}', '\u{1ecaf}'),
+        ('\u{1ecb1}', '\u{1ecb4}'), ('\u{1ed01}', '\u{1ed2d}'), ('\u{1ed2f}', '\u{1ed3d}'),
+        ('\u{1f100}', '\u{1f10c}'), ('\u{1fbf0}', '\u{1fbf9}')
     ];
 
     #[inline]
@@ -105,12 +117,12 @@
 
 }
 
-mod derived_property {
-    const Alphabetic_table: &'static [(char, char)] = &[
+pub mod derived_property {
+    const Alphabetic_table: &[(char, char)] = &[
         ('\u{41}', '\u{5a}'), ('\u{61}', '\u{7a}'), ('\u{aa}', '\u{aa}'), ('\u{b5}', '\u{b5}'),
         ('\u{ba}', '\u{ba}'), ('\u{c0}', '\u{d6}'), ('\u{d8}', '\u{f6}'), ('\u{f8}', '\u{2c1}'),
         ('\u{2c6}', '\u{2d1}'), ('\u{2e0}', '\u{2e4}'), ('\u{2ec}', '\u{2ec}'), ('\u{2ee}',
-        '\u{2ee}'), ('\u{345}', '\u{345}'), ('\u{370}', '\u{374}'), ('\u{376}', '\u{377}'),
+        '\u{2ee}'), ('\u{345}', '\u{345}'), ('\u{363}', '\u{374}'), ('\u{376}', '\u{377}'),
         ('\u{37a}', '\u{37d}'), ('\u{37f}', '\u{37f}'), ('\u{386}', '\u{386}'), ('\u{388}',
         '\u{38a}'), ('\u{38c}', '\u{38c}'), ('\u{38e}', '\u{3a1}'), ('\u{3a3}', '\u{3f5}'),
         ('\u{3f7}', '\u{481}'), ('\u{48a}', '\u{52f}'), ('\u{531}', '\u{556}'), ('\u{559}',
@@ -122,215 +134,223 @@
         ('\u{710}', '\u{73f}'), ('\u{74d}', '\u{7b1}'), ('\u{7ca}', '\u{7ea}'), ('\u{7f4}',
         '\u{7f5}'), ('\u{7fa}', '\u{7fa}'), ('\u{800}', '\u{817}'), ('\u{81a}', '\u{82c}'),
         ('\u{840}', '\u{858}'), ('\u{860}', '\u{86a}'), ('\u{870}', '\u{887}'), ('\u{889}',
-        '\u{88e}'), ('\u{8a0}', '\u{8c9}'), ('\u{8d4}', '\u{8df}'), ('\u{8e3}', '\u{8e9}'),
-        ('\u{8f0}', '\u{93b}'), ('\u{93d}', '\u{94c}'), ('\u{94e}', '\u{950}'), ('\u{955}',
-        '\u{963}'), ('\u{971}', '\u{983}'), ('\u{985}', '\u{98c}'), ('\u{98f}', '\u{990}'),
-        ('\u{993}', '\u{9a8}'), ('\u{9aa}', '\u{9b0}'), ('\u{9b2}', '\u{9b2}'), ('\u{9b6}',
-        '\u{9b9}'), ('\u{9bd}', '\u{9c4}'), ('\u{9c7}', '\u{9c8}'), ('\u{9cb}', '\u{9cc}'),
-        ('\u{9ce}', '\u{9ce}'), ('\u{9d7}', '\u{9d7}'), ('\u{9dc}', '\u{9dd}'), ('\u{9df}',
-        '\u{9e3}'), ('\u{9f0}', '\u{9f1}'), ('\u{9fc}', '\u{9fc}'), ('\u{a01}', '\u{a03}'),
-        ('\u{a05}', '\u{a0a}'), ('\u{a0f}', '\u{a10}'), ('\u{a13}', '\u{a28}'), ('\u{a2a}',
-        '\u{a30}'), ('\u{a32}', '\u{a33}'), ('\u{a35}', '\u{a36}'), ('\u{a38}', '\u{a39}'),
-        ('\u{a3e}', '\u{a42}'), ('\u{a47}', '\u{a48}'), ('\u{a4b}', '\u{a4c}'), ('\u{a51}',
-        '\u{a51}'), ('\u{a59}', '\u{a5c}'), ('\u{a5e}', '\u{a5e}'), ('\u{a70}', '\u{a75}'),
-        ('\u{a81}', '\u{a83}'), ('\u{a85}', '\u{a8d}'), ('\u{a8f}', '\u{a91}'), ('\u{a93}',
-        '\u{aa8}'), ('\u{aaa}', '\u{ab0}'), ('\u{ab2}', '\u{ab3}'), ('\u{ab5}', '\u{ab9}'),
-        ('\u{abd}', '\u{ac5}'), ('\u{ac7}', '\u{ac9}'), ('\u{acb}', '\u{acc}'), ('\u{ad0}',
-        '\u{ad0}'), ('\u{ae0}', '\u{ae3}'), ('\u{af9}', '\u{afc}'), ('\u{b01}', '\u{b03}'),
-        ('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}', '\u{b28}'), ('\u{b2a}',
-        '\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b39}'), ('\u{b3d}', '\u{b44}'),
-        ('\u{b47}', '\u{b48}'), ('\u{b4b}', '\u{b4c}'), ('\u{b56}', '\u{b57}'), ('\u{b5c}',
-        '\u{b5d}'), ('\u{b5f}', '\u{b63}'), ('\u{b71}', '\u{b71}'), ('\u{b82}', '\u{b83}'),
-        ('\u{b85}', '\u{b8a}'), ('\u{b8e}', '\u{b90}'), ('\u{b92}', '\u{b95}'), ('\u{b99}',
-        '\u{b9a}'), ('\u{b9c}', '\u{b9c}'), ('\u{b9e}', '\u{b9f}'), ('\u{ba3}', '\u{ba4}'),
-        ('\u{ba8}', '\u{baa}'), ('\u{bae}', '\u{bb9}'), ('\u{bbe}', '\u{bc2}'), ('\u{bc6}',
-        '\u{bc8}'), ('\u{bca}', '\u{bcc}'), ('\u{bd0}', '\u{bd0}'), ('\u{bd7}', '\u{bd7}'),
-        ('\u{c00}', '\u{c0c}'), ('\u{c0e}', '\u{c10}'), ('\u{c12}', '\u{c28}'), ('\u{c2a}',
-        '\u{c39}'), ('\u{c3d}', '\u{c44}'), ('\u{c46}', '\u{c48}'), ('\u{c4a}', '\u{c4c}'),
-        ('\u{c55}', '\u{c56}'), ('\u{c58}', '\u{c5a}'), ('\u{c5d}', '\u{c5d}'), ('\u{c60}',
-        '\u{c63}'), ('\u{c80}', '\u{c83}'), ('\u{c85}', '\u{c8c}'), ('\u{c8e}', '\u{c90}'),
-        ('\u{c92}', '\u{ca8}'), ('\u{caa}', '\u{cb3}'), ('\u{cb5}', '\u{cb9}'), ('\u{cbd}',
-        '\u{cc4}'), ('\u{cc6}', '\u{cc8}'), ('\u{cca}', '\u{ccc}'), ('\u{cd5}', '\u{cd6}'),
-        ('\u{cdd}', '\u{cde}'), ('\u{ce0}', '\u{ce3}'), ('\u{cf1}', '\u{cf3}'), ('\u{d00}',
-        '\u{d0c}'), ('\u{d0e}', '\u{d10}'), ('\u{d12}', '\u{d3a}'), ('\u{d3d}', '\u{d44}'),
-        ('\u{d46}', '\u{d48}'), ('\u{d4a}', '\u{d4c}'), ('\u{d4e}', '\u{d4e}'), ('\u{d54}',
-        '\u{d57}'), ('\u{d5f}', '\u{d63}'), ('\u{d7a}', '\u{d7f}'), ('\u{d81}', '\u{d83}'),
-        ('\u{d85}', '\u{d96}'), ('\u{d9a}', '\u{db1}'), ('\u{db3}', '\u{dbb}'), ('\u{dbd}',
-        '\u{dbd}'), ('\u{dc0}', '\u{dc6}'), ('\u{dcf}', '\u{dd4}'), ('\u{dd6}', '\u{dd6}'),
-        ('\u{dd8}', '\u{ddf}'), ('\u{df2}', '\u{df3}'), ('\u{e01}', '\u{e3a}'), ('\u{e40}',
-        '\u{e46}'), ('\u{e4d}', '\u{e4d}'), ('\u{e81}', '\u{e82}'), ('\u{e84}', '\u{e84}'),
-        ('\u{e86}', '\u{e8a}'), ('\u{e8c}', '\u{ea3}'), ('\u{ea5}', '\u{ea5}'), ('\u{ea7}',
-        '\u{eb9}'), ('\u{ebb}', '\u{ebd}'), ('\u{ec0}', '\u{ec4}'), ('\u{ec6}', '\u{ec6}'),
-        ('\u{ecd}', '\u{ecd}'), ('\u{edc}', '\u{edf}'), ('\u{f00}', '\u{f00}'), ('\u{f40}',
-        '\u{f47}'), ('\u{f49}', '\u{f6c}'), ('\u{f71}', '\u{f83}'), ('\u{f88}', '\u{f97}'),
-        ('\u{f99}', '\u{fbc}'), ('\u{1000}', '\u{1036}'), ('\u{1038}', '\u{1038}'), ('\u{103b}',
-        '\u{103f}'), ('\u{1050}', '\u{108f}'), ('\u{109a}', '\u{109d}'), ('\u{10a0}', '\u{10c5}'),
-        ('\u{10c7}', '\u{10c7}'), ('\u{10cd}', '\u{10cd}'), ('\u{10d0}', '\u{10fa}'), ('\u{10fc}',
-        '\u{1248}'), ('\u{124a}', '\u{124d}'), ('\u{1250}', '\u{1256}'), ('\u{1258}', '\u{1258}'),
-        ('\u{125a}', '\u{125d}'), ('\u{1260}', '\u{1288}'), ('\u{128a}', '\u{128d}'), ('\u{1290}',
-        '\u{12b0}'), ('\u{12b2}', '\u{12b5}'), ('\u{12b8}', '\u{12be}'), ('\u{12c0}', '\u{12c0}'),
-        ('\u{12c2}', '\u{12c5}'), ('\u{12c8}', '\u{12d6}'), ('\u{12d8}', '\u{1310}'), ('\u{1312}',
-        '\u{1315}'), ('\u{1318}', '\u{135a}'), ('\u{1380}', '\u{138f}'), ('\u{13a0}', '\u{13f5}'),
-        ('\u{13f8}', '\u{13fd}'), ('\u{1401}', '\u{166c}'), ('\u{166f}', '\u{167f}'), ('\u{1681}',
-        '\u{169a}'), ('\u{16a0}', '\u{16ea}'), ('\u{16ee}', '\u{16f8}'), ('\u{1700}', '\u{1713}'),
-        ('\u{171f}', '\u{1733}'), ('\u{1740}', '\u{1753}'), ('\u{1760}', '\u{176c}'), ('\u{176e}',
-        '\u{1770}'), ('\u{1772}', '\u{1773}'), ('\u{1780}', '\u{17b3}'), ('\u{17b6}', '\u{17c8}'),
-        ('\u{17d7}', '\u{17d7}'), ('\u{17dc}', '\u{17dc}'), ('\u{1820}', '\u{1878}'), ('\u{1880}',
-        '\u{18aa}'), ('\u{18b0}', '\u{18f5}'), ('\u{1900}', '\u{191e}'), ('\u{1920}', '\u{192b}'),
-        ('\u{1930}', '\u{1938}'), ('\u{1950}', '\u{196d}'), ('\u{1970}', '\u{1974}'), ('\u{1980}',
-        '\u{19ab}'), ('\u{19b0}', '\u{19c9}'), ('\u{1a00}', '\u{1a1b}'), ('\u{1a20}', '\u{1a5e}'),
-        ('\u{1a61}', '\u{1a74}'), ('\u{1aa7}', '\u{1aa7}'), ('\u{1abf}', '\u{1ac0}'), ('\u{1acc}',
-        '\u{1ace}'), ('\u{1b00}', '\u{1b33}'), ('\u{1b35}', '\u{1b43}'), ('\u{1b45}', '\u{1b4c}'),
-        ('\u{1b80}', '\u{1ba9}'), ('\u{1bac}', '\u{1baf}'), ('\u{1bba}', '\u{1be5}'), ('\u{1be7}',
-        '\u{1bf1}'), ('\u{1c00}', '\u{1c36}'), ('\u{1c4d}', '\u{1c4f}'), ('\u{1c5a}', '\u{1c7d}'),
-        ('\u{1c80}', '\u{1c88}'), ('\u{1c90}', '\u{1cba}'), ('\u{1cbd}', '\u{1cbf}'), ('\u{1ce9}',
-        '\u{1cec}'), ('\u{1cee}', '\u{1cf3}'), ('\u{1cf5}', '\u{1cf6}'), ('\u{1cfa}', '\u{1cfa}'),
-        ('\u{1d00}', '\u{1dbf}'), ('\u{1de7}', '\u{1df4}'), ('\u{1e00}', '\u{1f15}'), ('\u{1f18}',
-        '\u{1f1d}'), ('\u{1f20}', '\u{1f45}'), ('\u{1f48}', '\u{1f4d}'), ('\u{1f50}', '\u{1f57}'),
-        ('\u{1f59}', '\u{1f59}'), ('\u{1f5b}', '\u{1f5b}'), ('\u{1f5d}', '\u{1f5d}'), ('\u{1f5f}',
-        '\u{1f7d}'), ('\u{1f80}', '\u{1fb4}'), ('\u{1fb6}', '\u{1fbc}'), ('\u{1fbe}', '\u{1fbe}'),
-        ('\u{1fc2}', '\u{1fc4}'), ('\u{1fc6}', '\u{1fcc}'), ('\u{1fd0}', '\u{1fd3}'), ('\u{1fd6}',
-        '\u{1fdb}'), ('\u{1fe0}', '\u{1fec}'), ('\u{1ff2}', '\u{1ff4}'), ('\u{1ff6}', '\u{1ffc}'),
-        ('\u{2071}', '\u{2071}'), ('\u{207f}', '\u{207f}'), ('\u{2090}', '\u{209c}'), ('\u{2102}',
-        '\u{2102}'), ('\u{2107}', '\u{2107}'), ('\u{210a}', '\u{2113}'), ('\u{2115}', '\u{2115}'),
-        ('\u{2119}', '\u{211d}'), ('\u{2124}', '\u{2124}'), ('\u{2126}', '\u{2126}'), ('\u{2128}',
-        '\u{2128}'), ('\u{212a}', '\u{212d}'), ('\u{212f}', '\u{2139}'), ('\u{213c}', '\u{213f}'),
-        ('\u{2145}', '\u{2149}'), ('\u{214e}', '\u{214e}'), ('\u{2160}', '\u{2188}'), ('\u{24b6}',
-        '\u{24e9}'), ('\u{2c00}', '\u{2ce4}'), ('\u{2ceb}', '\u{2cee}'), ('\u{2cf2}', '\u{2cf3}'),
-        ('\u{2d00}', '\u{2d25}'), ('\u{2d27}', '\u{2d27}'), ('\u{2d2d}', '\u{2d2d}'), ('\u{2d30}',
-        '\u{2d67}'), ('\u{2d6f}', '\u{2d6f}'), ('\u{2d80}', '\u{2d96}'), ('\u{2da0}', '\u{2da6}'),
-        ('\u{2da8}', '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), ('\u{2db8}', '\u{2dbe}'), ('\u{2dc0}',
-        '\u{2dc6}'), ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', '\u{2dd6}'), ('\u{2dd8}', '\u{2dde}'),
-        ('\u{2de0}', '\u{2dff}'), ('\u{2e2f}', '\u{2e2f}'), ('\u{3005}', '\u{3007}'), ('\u{3021}',
-        '\u{3029}'), ('\u{3031}', '\u{3035}'), ('\u{3038}', '\u{303c}'), ('\u{3041}', '\u{3096}'),
-        ('\u{309d}', '\u{309f}'), ('\u{30a1}', '\u{30fa}'), ('\u{30fc}', '\u{30ff}'), ('\u{3105}',
-        '\u{312f}'), ('\u{3131}', '\u{318e}'), ('\u{31a0}', '\u{31bf}'), ('\u{31f0}', '\u{31ff}'),
-        ('\u{3400}', '\u{4dbf}'), ('\u{4e00}', '\u{a48c}'), ('\u{a4d0}', '\u{a4fd}'), ('\u{a500}',
-        '\u{a60c}'), ('\u{a610}', '\u{a61f}'), ('\u{a62a}', '\u{a62b}'), ('\u{a640}', '\u{a66e}'),
-        ('\u{a674}', '\u{a67b}'), ('\u{a67f}', '\u{a6ef}'), ('\u{a717}', '\u{a71f}'), ('\u{a722}',
-        '\u{a788}'), ('\u{a78b}', '\u{a7ca}'), ('\u{a7d0}', '\u{a7d1}'), ('\u{a7d3}', '\u{a7d3}'),
-        ('\u{a7d5}', '\u{a7d9}'), ('\u{a7f2}', '\u{a805}'), ('\u{a807}', '\u{a827}'), ('\u{a840}',
-        '\u{a873}'), ('\u{a880}', '\u{a8c3}'), ('\u{a8c5}', '\u{a8c5}'), ('\u{a8f2}', '\u{a8f7}'),
-        ('\u{a8fb}', '\u{a8fb}'), ('\u{a8fd}', '\u{a8ff}'), ('\u{a90a}', '\u{a92a}'), ('\u{a930}',
-        '\u{a952}'), ('\u{a960}', '\u{a97c}'), ('\u{a980}', '\u{a9b2}'), ('\u{a9b4}', '\u{a9bf}'),
-        ('\u{a9cf}', '\u{a9cf}'), ('\u{a9e0}', '\u{a9ef}'), ('\u{a9fa}', '\u{a9fe}'), ('\u{aa00}',
-        '\u{aa36}'), ('\u{aa40}', '\u{aa4d}'), ('\u{aa60}', '\u{aa76}'), ('\u{aa7a}', '\u{aabe}'),
-        ('\u{aac0}', '\u{aac0}'), ('\u{aac2}', '\u{aac2}'), ('\u{aadb}', '\u{aadd}'), ('\u{aae0}',
-        '\u{aaef}'), ('\u{aaf2}', '\u{aaf5}'), ('\u{ab01}', '\u{ab06}'), ('\u{ab09}', '\u{ab0e}'),
-        ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', '\u{ab26}'), ('\u{ab28}', '\u{ab2e}'), ('\u{ab30}',
-        '\u{ab5a}'), ('\u{ab5c}', '\u{ab69}'), ('\u{ab70}', '\u{abea}'), ('\u{ac00}', '\u{d7a3}'),
-        ('\u{d7b0}', '\u{d7c6}'), ('\u{d7cb}', '\u{d7fb}'), ('\u{f900}', '\u{fa6d}'), ('\u{fa70}',
-        '\u{fad9}'), ('\u{fb00}', '\u{fb06}'), ('\u{fb13}', '\u{fb17}'), ('\u{fb1d}', '\u{fb28}'),
-        ('\u{fb2a}', '\u{fb36}'), ('\u{fb38}', '\u{fb3c}'), ('\u{fb3e}', '\u{fb3e}'), ('\u{fb40}',
-        '\u{fb41}'), ('\u{fb43}', '\u{fb44}'), ('\u{fb46}', '\u{fbb1}'), ('\u{fbd3}', '\u{fd3d}'),
-        ('\u{fd50}', '\u{fd8f}'), ('\u{fd92}', '\u{fdc7}'), ('\u{fdf0}', '\u{fdfb}'), ('\u{fe70}',
-        '\u{fe74}'), ('\u{fe76}', '\u{fefc}'), ('\u{ff21}', '\u{ff3a}'), ('\u{ff41}', '\u{ff5a}'),
-        ('\u{ff66}', '\u{ffbe}'), ('\u{ffc2}', '\u{ffc7}'), ('\u{ffca}', '\u{ffcf}'), ('\u{ffd2}',
-        '\u{ffd7}'), ('\u{ffda}', '\u{ffdc}'), ('\u{10000}', '\u{1000b}'), ('\u{1000d}',
-        '\u{10026}'), ('\u{10028}', '\u{1003a}'), ('\u{1003c}', '\u{1003d}'), ('\u{1003f}',
-        '\u{1004d}'), ('\u{10050}', '\u{1005d}'), ('\u{10080}', '\u{100fa}'), ('\u{10140}',
-        '\u{10174}'), ('\u{10280}', '\u{1029c}'), ('\u{102a0}', '\u{102d0}'), ('\u{10300}',
-        '\u{1031f}'), ('\u{1032d}', '\u{1034a}'), ('\u{10350}', '\u{1037a}'), ('\u{10380}',
-        '\u{1039d}'), ('\u{103a0}', '\u{103c3}'), ('\u{103c8}', '\u{103cf}'), ('\u{103d1}',
-        '\u{103d5}'), ('\u{10400}', '\u{1049d}'), ('\u{104b0}', '\u{104d3}'), ('\u{104d8}',
-        '\u{104fb}'), ('\u{10500}', '\u{10527}'), ('\u{10530}', '\u{10563}'), ('\u{10570}',
-        '\u{1057a}'), ('\u{1057c}', '\u{1058a}'), ('\u{1058c}', '\u{10592}'), ('\u{10594}',
-        '\u{10595}'), ('\u{10597}', '\u{105a1}'), ('\u{105a3}', '\u{105b1}'), ('\u{105b3}',
-        '\u{105b9}'), ('\u{105bb}', '\u{105bc}'), ('\u{10600}', '\u{10736}'), ('\u{10740}',
-        '\u{10755}'), ('\u{10760}', '\u{10767}'), ('\u{10780}', '\u{10785}'), ('\u{10787}',
-        '\u{107b0}'), ('\u{107b2}', '\u{107ba}'), ('\u{10800}', '\u{10805}'), ('\u{10808}',
-        '\u{10808}'), ('\u{1080a}', '\u{10835}'), ('\u{10837}', '\u{10838}'), ('\u{1083c}',
-        '\u{1083c}'), ('\u{1083f}', '\u{10855}'), ('\u{10860}', '\u{10876}'), ('\u{10880}',
-        '\u{1089e}'), ('\u{108e0}', '\u{108f2}'), ('\u{108f4}', '\u{108f5}'), ('\u{10900}',
-        '\u{10915}'), ('\u{10920}', '\u{10939}'), ('\u{10980}', '\u{109b7}'), ('\u{109be}',
-        '\u{109bf}'), ('\u{10a00}', '\u{10a03}'), ('\u{10a05}', '\u{10a06}'), ('\u{10a0c}',
-        '\u{10a13}'), ('\u{10a15}', '\u{10a17}'), ('\u{10a19}', '\u{10a35}'), ('\u{10a60}',
-        '\u{10a7c}'), ('\u{10a80}', '\u{10a9c}'), ('\u{10ac0}', '\u{10ac7}'), ('\u{10ac9}',
-        '\u{10ae4}'), ('\u{10b00}', '\u{10b35}'), ('\u{10b40}', '\u{10b55}'), ('\u{10b60}',
-        '\u{10b72}'), ('\u{10b80}', '\u{10b91}'), ('\u{10c00}', '\u{10c48}'), ('\u{10c80}',
-        '\u{10cb2}'), ('\u{10cc0}', '\u{10cf2}'), ('\u{10d00}', '\u{10d27}'), ('\u{10e80}',
-        '\u{10ea9}'), ('\u{10eab}', '\u{10eac}'), ('\u{10eb0}', '\u{10eb1}'), ('\u{10f00}',
-        '\u{10f1c}'), ('\u{10f27}', '\u{10f27}'), ('\u{10f30}', '\u{10f45}'), ('\u{10f70}',
-        '\u{10f81}'), ('\u{10fb0}', '\u{10fc4}'), ('\u{10fe0}', '\u{10ff6}'), ('\u{11000}',
-        '\u{11045}'), ('\u{11071}', '\u{11075}'), ('\u{11080}', '\u{110b8}'), ('\u{110c2}',
-        '\u{110c2}'), ('\u{110d0}', '\u{110e8}'), ('\u{11100}', '\u{11132}'), ('\u{11144}',
-        '\u{11147}'), ('\u{11150}', '\u{11172}'), ('\u{11176}', '\u{11176}'), ('\u{11180}',
-        '\u{111bf}'), ('\u{111c1}', '\u{111c4}'), ('\u{111ce}', '\u{111cf}'), ('\u{111da}',
-        '\u{111da}'), ('\u{111dc}', '\u{111dc}'), ('\u{11200}', '\u{11211}'), ('\u{11213}',
-        '\u{11234}'), ('\u{11237}', '\u{11237}'), ('\u{1123e}', '\u{11241}'), ('\u{11280}',
-        '\u{11286}'), ('\u{11288}', '\u{11288}'), ('\u{1128a}', '\u{1128d}'), ('\u{1128f}',
-        '\u{1129d}'), ('\u{1129f}', '\u{112a8}'), ('\u{112b0}', '\u{112e8}'), ('\u{11300}',
-        '\u{11303}'), ('\u{11305}', '\u{1130c}'), ('\u{1130f}', '\u{11310}'), ('\u{11313}',
-        '\u{11328}'), ('\u{1132a}', '\u{11330}'), ('\u{11332}', '\u{11333}'), ('\u{11335}',
-        '\u{11339}'), ('\u{1133d}', '\u{11344}'), ('\u{11347}', '\u{11348}'), ('\u{1134b}',
-        '\u{1134c}'), ('\u{11350}', '\u{11350}'), ('\u{11357}', '\u{11357}'), ('\u{1135d}',
-        '\u{11363}'), ('\u{11400}', '\u{11441}'), ('\u{11443}', '\u{11445}'), ('\u{11447}',
-        '\u{1144a}'), ('\u{1145f}', '\u{11461}'), ('\u{11480}', '\u{114c1}'), ('\u{114c4}',
-        '\u{114c5}'), ('\u{114c7}', '\u{114c7}'), ('\u{11580}', '\u{115b5}'), ('\u{115b8}',
-        '\u{115be}'), ('\u{115d8}', '\u{115dd}'), ('\u{11600}', '\u{1163e}'), ('\u{11640}',
-        '\u{11640}'), ('\u{11644}', '\u{11644}'), ('\u{11680}', '\u{116b5}'), ('\u{116b8}',
-        '\u{116b8}'), ('\u{11700}', '\u{1171a}'), ('\u{1171d}', '\u{1172a}'), ('\u{11740}',
-        '\u{11746}'), ('\u{11800}', '\u{11838}'), ('\u{118a0}', '\u{118df}'), ('\u{118ff}',
-        '\u{11906}'), ('\u{11909}', '\u{11909}'), ('\u{1190c}', '\u{11913}'), ('\u{11915}',
-        '\u{11916}'), ('\u{11918}', '\u{11935}'), ('\u{11937}', '\u{11938}'), ('\u{1193b}',
-        '\u{1193c}'), ('\u{1193f}', '\u{11942}'), ('\u{119a0}', '\u{119a7}'), ('\u{119aa}',
-        '\u{119d7}'), ('\u{119da}', '\u{119df}'), ('\u{119e1}', '\u{119e1}'), ('\u{119e3}',
-        '\u{119e4}'), ('\u{11a00}', '\u{11a32}'), ('\u{11a35}', '\u{11a3e}'), ('\u{11a50}',
-        '\u{11a97}'), ('\u{11a9d}', '\u{11a9d}'), ('\u{11ab0}', '\u{11af8}'), ('\u{11c00}',
-        '\u{11c08}'), ('\u{11c0a}', '\u{11c36}'), ('\u{11c38}', '\u{11c3e}'), ('\u{11c40}',
-        '\u{11c40}'), ('\u{11c72}', '\u{11c8f}'), ('\u{11c92}', '\u{11ca7}'), ('\u{11ca9}',
-        '\u{11cb6}'), ('\u{11d00}', '\u{11d06}'), ('\u{11d08}', '\u{11d09}'), ('\u{11d0b}',
-        '\u{11d36}'), ('\u{11d3a}', '\u{11d3a}'), ('\u{11d3c}', '\u{11d3d}'), ('\u{11d3f}',
-        '\u{11d41}'), ('\u{11d43}', '\u{11d43}'), ('\u{11d46}', '\u{11d47}'), ('\u{11d60}',
-        '\u{11d65}'), ('\u{11d67}', '\u{11d68}'), ('\u{11d6a}', '\u{11d8e}'), ('\u{11d90}',
-        '\u{11d91}'), ('\u{11d93}', '\u{11d96}'), ('\u{11d98}', '\u{11d98}'), ('\u{11ee0}',
-        '\u{11ef6}'), ('\u{11f00}', '\u{11f10}'), ('\u{11f12}', '\u{11f3a}'), ('\u{11f3e}',
-        '\u{11f40}'), ('\u{11fb0}', '\u{11fb0}'), ('\u{12000}', '\u{12399}'), ('\u{12400}',
-        '\u{1246e}'), ('\u{12480}', '\u{12543}'), ('\u{12f90}', '\u{12ff0}'), ('\u{13000}',
-        '\u{1342f}'), ('\u{13441}', '\u{13446}'), ('\u{14400}', '\u{14646}'), ('\u{16800}',
-        '\u{16a38}'), ('\u{16a40}', '\u{16a5e}'), ('\u{16a70}', '\u{16abe}'), ('\u{16ad0}',
-        '\u{16aed}'), ('\u{16b00}', '\u{16b2f}'), ('\u{16b40}', '\u{16b43}'), ('\u{16b63}',
-        '\u{16b77}'), ('\u{16b7d}', '\u{16b8f}'), ('\u{16e40}', '\u{16e7f}'), ('\u{16f00}',
-        '\u{16f4a}'), ('\u{16f4f}', '\u{16f87}'), ('\u{16f8f}', '\u{16f9f}'), ('\u{16fe0}',
-        '\u{16fe1}'), ('\u{16fe3}', '\u{16fe3}'), ('\u{16ff0}', '\u{16ff1}'), ('\u{17000}',
-        '\u{187f7}'), ('\u{18800}', '\u{18cd5}'), ('\u{18d00}', '\u{18d08}'), ('\u{1aff0}',
-        '\u{1aff3}'), ('\u{1aff5}', '\u{1affb}'), ('\u{1affd}', '\u{1affe}'), ('\u{1b000}',
-        '\u{1b122}'), ('\u{1b132}', '\u{1b132}'), ('\u{1b150}', '\u{1b152}'), ('\u{1b155}',
-        '\u{1b155}'), ('\u{1b164}', '\u{1b167}'), ('\u{1b170}', '\u{1b2fb}'), ('\u{1bc00}',
-        '\u{1bc6a}'), ('\u{1bc70}', '\u{1bc7c}'), ('\u{1bc80}', '\u{1bc88}'), ('\u{1bc90}',
-        '\u{1bc99}'), ('\u{1bc9e}', '\u{1bc9e}'), ('\u{1d400}', '\u{1d454}'), ('\u{1d456}',
-        '\u{1d49c}'), ('\u{1d49e}', '\u{1d49f}'), ('\u{1d4a2}', '\u{1d4a2}'), ('\u{1d4a5}',
-        '\u{1d4a6}'), ('\u{1d4a9}', '\u{1d4ac}'), ('\u{1d4ae}', '\u{1d4b9}'), ('\u{1d4bb}',
-        '\u{1d4bb}'), ('\u{1d4bd}', '\u{1d4c3}'), ('\u{1d4c5}', '\u{1d505}'), ('\u{1d507}',
-        '\u{1d50a}'), ('\u{1d50d}', '\u{1d514}'), ('\u{1d516}', '\u{1d51c}'), ('\u{1d51e}',
-        '\u{1d539}'), ('\u{1d53b}', '\u{1d53e}'), ('\u{1d540}', '\u{1d544}'), ('\u{1d546}',
-        '\u{1d546}'), ('\u{1d54a}', '\u{1d550}'), ('\u{1d552}', '\u{1d6a5}'), ('\u{1d6a8}',
-        '\u{1d6c0}'), ('\u{1d6c2}', '\u{1d6da}'), ('\u{1d6dc}', '\u{1d6fa}'), ('\u{1d6fc}',
-        '\u{1d714}'), ('\u{1d716}', '\u{1d734}'), ('\u{1d736}', '\u{1d74e}'), ('\u{1d750}',
-        '\u{1d76e}'), ('\u{1d770}', '\u{1d788}'), ('\u{1d78a}', '\u{1d7a8}'), ('\u{1d7aa}',
-        '\u{1d7c2}'), ('\u{1d7c4}', '\u{1d7cb}'), ('\u{1df00}', '\u{1df1e}'), ('\u{1df25}',
-        '\u{1df2a}'), ('\u{1e000}', '\u{1e006}'), ('\u{1e008}', '\u{1e018}'), ('\u{1e01b}',
-        '\u{1e021}'), ('\u{1e023}', '\u{1e024}'), ('\u{1e026}', '\u{1e02a}'), ('\u{1e030}',
-        '\u{1e06d}'), ('\u{1e08f}', '\u{1e08f}'), ('\u{1e100}', '\u{1e12c}'), ('\u{1e137}',
-        '\u{1e13d}'), ('\u{1e14e}', '\u{1e14e}'), ('\u{1e290}', '\u{1e2ad}'), ('\u{1e2c0}',
-        '\u{1e2eb}'), ('\u{1e4d0}', '\u{1e4eb}'), ('\u{1e7e0}', '\u{1e7e6}'), ('\u{1e7e8}',
-        '\u{1e7eb}'), ('\u{1e7ed}', '\u{1e7ee}'), ('\u{1e7f0}', '\u{1e7fe}'), ('\u{1e800}',
-        '\u{1e8c4}'), ('\u{1e900}', '\u{1e943}'), ('\u{1e947}', '\u{1e947}'), ('\u{1e94b}',
-        '\u{1e94b}'), ('\u{1ee00}', '\u{1ee03}'), ('\u{1ee05}', '\u{1ee1f}'), ('\u{1ee21}',
-        '\u{1ee22}'), ('\u{1ee24}', '\u{1ee24}'), ('\u{1ee27}', '\u{1ee27}'), ('\u{1ee29}',
-        '\u{1ee32}'), ('\u{1ee34}', '\u{1ee37}'), ('\u{1ee39}', '\u{1ee39}'), ('\u{1ee3b}',
-        '\u{1ee3b}'), ('\u{1ee42}', '\u{1ee42}'), ('\u{1ee47}', '\u{1ee47}'), ('\u{1ee49}',
-        '\u{1ee49}'), ('\u{1ee4b}', '\u{1ee4b}'), ('\u{1ee4d}', '\u{1ee4f}'), ('\u{1ee51}',
-        '\u{1ee52}'), ('\u{1ee54}', '\u{1ee54}'), ('\u{1ee57}', '\u{1ee57}'), ('\u{1ee59}',
-        '\u{1ee59}'), ('\u{1ee5b}', '\u{1ee5b}'), ('\u{1ee5d}', '\u{1ee5d}'), ('\u{1ee5f}',
-        '\u{1ee5f}'), ('\u{1ee61}', '\u{1ee62}'), ('\u{1ee64}', '\u{1ee64}'), ('\u{1ee67}',
-        '\u{1ee6a}'), ('\u{1ee6c}', '\u{1ee72}'), ('\u{1ee74}', '\u{1ee77}'), ('\u{1ee79}',
-        '\u{1ee7c}'), ('\u{1ee7e}', '\u{1ee7e}'), ('\u{1ee80}', '\u{1ee89}'), ('\u{1ee8b}',
-        '\u{1ee9b}'), ('\u{1eea1}', '\u{1eea3}'), ('\u{1eea5}', '\u{1eea9}'), ('\u{1eeab}',
-        '\u{1eebb}'), ('\u{1f130}', '\u{1f149}'), ('\u{1f150}', '\u{1f169}'), ('\u{1f170}',
-        '\u{1f189}'), ('\u{20000}', '\u{2a6df}'), ('\u{2a700}', '\u{2b739}'), ('\u{2b740}',
-        '\u{2b81d}'), ('\u{2b820}', '\u{2cea1}'), ('\u{2ceb0}', '\u{2ebe0}'), ('\u{2f800}',
-        '\u{2fa1d}'), ('\u{30000}', '\u{3134a}'), ('\u{31350}', '\u{323af}')
+        '\u{88e}'), ('\u{897}', '\u{897}'), ('\u{8a0}', '\u{8c9}'), ('\u{8d4}', '\u{8df}'),
+        ('\u{8e3}', '\u{8e9}'), ('\u{8f0}', '\u{93b}'), ('\u{93d}', '\u{94c}'), ('\u{94e}',
+        '\u{950}'), ('\u{955}', '\u{963}'), ('\u{971}', '\u{983}'), ('\u{985}', '\u{98c}'),
+        ('\u{98f}', '\u{990}'), ('\u{993}', '\u{9a8}'), ('\u{9aa}', '\u{9b0}'), ('\u{9b2}',
+        '\u{9b2}'), ('\u{9b6}', '\u{9b9}'), ('\u{9bd}', '\u{9c4}'), ('\u{9c7}', '\u{9c8}'),
+        ('\u{9cb}', '\u{9cc}'), ('\u{9ce}', '\u{9ce}'), ('\u{9d7}', '\u{9d7}'), ('\u{9dc}',
+        '\u{9dd}'), ('\u{9df}', '\u{9e3}'), ('\u{9f0}', '\u{9f1}'), ('\u{9fc}', '\u{9fc}'),
+        ('\u{a01}', '\u{a03}'), ('\u{a05}', '\u{a0a}'), ('\u{a0f}', '\u{a10}'), ('\u{a13}',
+        '\u{a28}'), ('\u{a2a}', '\u{a30}'), ('\u{a32}', '\u{a33}'), ('\u{a35}', '\u{a36}'),
+        ('\u{a38}', '\u{a39}'), ('\u{a3e}', '\u{a42}'), ('\u{a47}', '\u{a48}'), ('\u{a4b}',
+        '\u{a4c}'), ('\u{a51}', '\u{a51}'), ('\u{a59}', '\u{a5c}'), ('\u{a5e}', '\u{a5e}'),
+        ('\u{a70}', '\u{a75}'), ('\u{a81}', '\u{a83}'), ('\u{a85}', '\u{a8d}'), ('\u{a8f}',
+        '\u{a91}'), ('\u{a93}', '\u{aa8}'), ('\u{aaa}', '\u{ab0}'), ('\u{ab2}', '\u{ab3}'),
+        ('\u{ab5}', '\u{ab9}'), ('\u{abd}', '\u{ac5}'), ('\u{ac7}', '\u{ac9}'), ('\u{acb}',
+        '\u{acc}'), ('\u{ad0}', '\u{ad0}'), ('\u{ae0}', '\u{ae3}'), ('\u{af9}', '\u{afc}'),
+        ('\u{b01}', '\u{b03}'), ('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}',
+        '\u{b28}'), ('\u{b2a}', '\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b39}'),
+        ('\u{b3d}', '\u{b44}'), ('\u{b47}', '\u{b48}'), ('\u{b4b}', '\u{b4c}'), ('\u{b56}',
+        '\u{b57}'), ('\u{b5c}', '\u{b5d}'), ('\u{b5f}', '\u{b63}'), ('\u{b71}', '\u{b71}'),
+        ('\u{b82}', '\u{b83}'), ('\u{b85}', '\u{b8a}'), ('\u{b8e}', '\u{b90}'), ('\u{b92}',
+        '\u{b95}'), ('\u{b99}', '\u{b9a}'), ('\u{b9c}', '\u{b9c}'), ('\u{b9e}', '\u{b9f}'),
+        ('\u{ba3}', '\u{ba4}'), ('\u{ba8}', '\u{baa}'), ('\u{bae}', '\u{bb9}'), ('\u{bbe}',
+        '\u{bc2}'), ('\u{bc6}', '\u{bc8}'), ('\u{bca}', '\u{bcc}'), ('\u{bd0}', '\u{bd0}'),
+        ('\u{bd7}', '\u{bd7}'), ('\u{c00}', '\u{c0c}'), ('\u{c0e}', '\u{c10}'), ('\u{c12}',
+        '\u{c28}'), ('\u{c2a}', '\u{c39}'), ('\u{c3d}', '\u{c44}'), ('\u{c46}', '\u{c48}'),
+        ('\u{c4a}', '\u{c4c}'), ('\u{c55}', '\u{c56}'), ('\u{c58}', '\u{c5a}'), ('\u{c5d}',
+        '\u{c5d}'), ('\u{c60}', '\u{c63}'), ('\u{c80}', '\u{c83}'), ('\u{c85}', '\u{c8c}'),
+        ('\u{c8e}', '\u{c90}'), ('\u{c92}', '\u{ca8}'), ('\u{caa}', '\u{cb3}'), ('\u{cb5}',
+        '\u{cb9}'), ('\u{cbd}', '\u{cc4}'), ('\u{cc6}', '\u{cc8}'), ('\u{cca}', '\u{ccc}'),
+        ('\u{cd5}', '\u{cd6}'), ('\u{cdd}', '\u{cde}'), ('\u{ce0}', '\u{ce3}'), ('\u{cf1}',
+        '\u{cf3}'), ('\u{d00}', '\u{d0c}'), ('\u{d0e}', '\u{d10}'), ('\u{d12}', '\u{d3a}'),
+        ('\u{d3d}', '\u{d44}'), ('\u{d46}', '\u{d48}'), ('\u{d4a}', '\u{d4c}'), ('\u{d4e}',
+        '\u{d4e}'), ('\u{d54}', '\u{d57}'), ('\u{d5f}', '\u{d63}'), ('\u{d7a}', '\u{d7f}'),
+        ('\u{d81}', '\u{d83}'), ('\u{d85}', '\u{d96}'), ('\u{d9a}', '\u{db1}'), ('\u{db3}',
+        '\u{dbb}'), ('\u{dbd}', '\u{dbd}'), ('\u{dc0}', '\u{dc6}'), ('\u{dcf}', '\u{dd4}'),
+        ('\u{dd6}', '\u{dd6}'), ('\u{dd8}', '\u{ddf}'), ('\u{df2}', '\u{df3}'), ('\u{e01}',
+        '\u{e3a}'), ('\u{e40}', '\u{e46}'), ('\u{e4d}', '\u{e4d}'), ('\u{e81}', '\u{e82}'),
+        ('\u{e84}', '\u{e84}'), ('\u{e86}', '\u{e8a}'), ('\u{e8c}', '\u{ea3}'), ('\u{ea5}',
+        '\u{ea5}'), ('\u{ea7}', '\u{eb9}'), ('\u{ebb}', '\u{ebd}'), ('\u{ec0}', '\u{ec4}'),
+        ('\u{ec6}', '\u{ec6}'), ('\u{ecd}', '\u{ecd}'), ('\u{edc}', '\u{edf}'), ('\u{f00}',
+        '\u{f00}'), ('\u{f40}', '\u{f47}'), ('\u{f49}', '\u{f6c}'), ('\u{f71}', '\u{f83}'),
+        ('\u{f88}', '\u{f97}'), ('\u{f99}', '\u{fbc}'), ('\u{1000}', '\u{1036}'), ('\u{1038}',
+        '\u{1038}'), ('\u{103b}', '\u{103f}'), ('\u{1050}', '\u{108f}'), ('\u{109a}', '\u{109d}'),
+        ('\u{10a0}', '\u{10c5}'), ('\u{10c7}', '\u{10c7}'), ('\u{10cd}', '\u{10cd}'), ('\u{10d0}',
+        '\u{10fa}'), ('\u{10fc}', '\u{1248}'), ('\u{124a}', '\u{124d}'), ('\u{1250}', '\u{1256}'),
+        ('\u{1258}', '\u{1258}'), ('\u{125a}', '\u{125d}'), ('\u{1260}', '\u{1288}'), ('\u{128a}',
+        '\u{128d}'), ('\u{1290}', '\u{12b0}'), ('\u{12b2}', '\u{12b5}'), ('\u{12b8}', '\u{12be}'),
+        ('\u{12c0}', '\u{12c0}'), ('\u{12c2}', '\u{12c5}'), ('\u{12c8}', '\u{12d6}'), ('\u{12d8}',
+        '\u{1310}'), ('\u{1312}', '\u{1315}'), ('\u{1318}', '\u{135a}'), ('\u{1380}', '\u{138f}'),
+        ('\u{13a0}', '\u{13f5}'), ('\u{13f8}', '\u{13fd}'), ('\u{1401}', '\u{166c}'), ('\u{166f}',
+        '\u{167f}'), ('\u{1681}', '\u{169a}'), ('\u{16a0}', '\u{16ea}'), ('\u{16ee}', '\u{16f8}'),
+        ('\u{1700}', '\u{1713}'), ('\u{171f}', '\u{1733}'), ('\u{1740}', '\u{1753}'), ('\u{1760}',
+        '\u{176c}'), ('\u{176e}', '\u{1770}'), ('\u{1772}', '\u{1773}'), ('\u{1780}', '\u{17b3}'),
+        ('\u{17b6}', '\u{17c8}'), ('\u{17d7}', '\u{17d7}'), ('\u{17dc}', '\u{17dc}'), ('\u{1820}',
+        '\u{1878}'), ('\u{1880}', '\u{18aa}'), ('\u{18b0}', '\u{18f5}'), ('\u{1900}', '\u{191e}'),
+        ('\u{1920}', '\u{192b}'), ('\u{1930}', '\u{1938}'), ('\u{1950}', '\u{196d}'), ('\u{1970}',
+        '\u{1974}'), ('\u{1980}', '\u{19ab}'), ('\u{19b0}', '\u{19c9}'), ('\u{1a00}', '\u{1a1b}'),
+        ('\u{1a20}', '\u{1a5e}'), ('\u{1a61}', '\u{1a74}'), ('\u{1aa7}', '\u{1aa7}'), ('\u{1abf}',
+        '\u{1ac0}'), ('\u{1acc}', '\u{1ace}'), ('\u{1b00}', '\u{1b33}'), ('\u{1b35}', '\u{1b43}'),
+        ('\u{1b45}', '\u{1b4c}'), ('\u{1b80}', '\u{1ba9}'), ('\u{1bac}', '\u{1baf}'), ('\u{1bba}',
+        '\u{1be5}'), ('\u{1be7}', '\u{1bf1}'), ('\u{1c00}', '\u{1c36}'), ('\u{1c4d}', '\u{1c4f}'),
+        ('\u{1c5a}', '\u{1c7d}'), ('\u{1c80}', '\u{1c8a}'), ('\u{1c90}', '\u{1cba}'), ('\u{1cbd}',
+        '\u{1cbf}'), ('\u{1ce9}', '\u{1cec}'), ('\u{1cee}', '\u{1cf3}'), ('\u{1cf5}', '\u{1cf6}'),
+        ('\u{1cfa}', '\u{1cfa}'), ('\u{1d00}', '\u{1dbf}'), ('\u{1dd3}', '\u{1df4}'), ('\u{1e00}',
+        '\u{1f15}'), ('\u{1f18}', '\u{1f1d}'), ('\u{1f20}', '\u{1f45}'), ('\u{1f48}', '\u{1f4d}'),
+        ('\u{1f50}', '\u{1f57}'), ('\u{1f59}', '\u{1f59}'), ('\u{1f5b}', '\u{1f5b}'), ('\u{1f5d}',
+        '\u{1f5d}'), ('\u{1f5f}', '\u{1f7d}'), ('\u{1f80}', '\u{1fb4}'), ('\u{1fb6}', '\u{1fbc}'),
+        ('\u{1fbe}', '\u{1fbe}'), ('\u{1fc2}', '\u{1fc4}'), ('\u{1fc6}', '\u{1fcc}'), ('\u{1fd0}',
+        '\u{1fd3}'), ('\u{1fd6}', '\u{1fdb}'), ('\u{1fe0}', '\u{1fec}'), ('\u{1ff2}', '\u{1ff4}'),
+        ('\u{1ff6}', '\u{1ffc}'), ('\u{2071}', '\u{2071}'), ('\u{207f}', '\u{207f}'), ('\u{2090}',
+        '\u{209c}'), ('\u{2102}', '\u{2102}'), ('\u{2107}', '\u{2107}'), ('\u{210a}', '\u{2113}'),
+        ('\u{2115}', '\u{2115}'), ('\u{2119}', '\u{211d}'), ('\u{2124}', '\u{2124}'), ('\u{2126}',
+        '\u{2126}'), ('\u{2128}', '\u{2128}'), ('\u{212a}', '\u{212d}'), ('\u{212f}', '\u{2139}'),
+        ('\u{213c}', '\u{213f}'), ('\u{2145}', '\u{2149}'), ('\u{214e}', '\u{214e}'), ('\u{2160}',
+        '\u{2188}'), ('\u{24b6}', '\u{24e9}'), ('\u{2c00}', '\u{2ce4}'), ('\u{2ceb}', '\u{2cee}'),
+        ('\u{2cf2}', '\u{2cf3}'), ('\u{2d00}', '\u{2d25}'), ('\u{2d27}', '\u{2d27}'), ('\u{2d2d}',
+        '\u{2d2d}'), ('\u{2d30}', '\u{2d67}'), ('\u{2d6f}', '\u{2d6f}'), ('\u{2d80}', '\u{2d96}'),
+        ('\u{2da0}', '\u{2da6}'), ('\u{2da8}', '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), ('\u{2db8}',
+        '\u{2dbe}'), ('\u{2dc0}', '\u{2dc6}'), ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', '\u{2dd6}'),
+        ('\u{2dd8}', '\u{2dde}'), ('\u{2de0}', '\u{2dff}'), ('\u{2e2f}', '\u{2e2f}'), ('\u{3005}',
+        '\u{3007}'), ('\u{3021}', '\u{3029}'), ('\u{3031}', '\u{3035}'), ('\u{3038}', '\u{303c}'),
+        ('\u{3041}', '\u{3096}'), ('\u{309d}', '\u{309f}'), ('\u{30a1}', '\u{30fa}'), ('\u{30fc}',
+        '\u{30ff}'), ('\u{3105}', '\u{312f}'), ('\u{3131}', '\u{318e}'), ('\u{31a0}', '\u{31bf}'),
+        ('\u{31f0}', '\u{31ff}'), ('\u{3400}', '\u{4dbf}'), ('\u{4e00}', '\u{a48c}'), ('\u{a4d0}',
+        '\u{a4fd}'), ('\u{a500}', '\u{a60c}'), ('\u{a610}', '\u{a61f}'), ('\u{a62a}', '\u{a62b}'),
+        ('\u{a640}', '\u{a66e}'), ('\u{a674}', '\u{a67b}'), ('\u{a67f}', '\u{a6ef}'), ('\u{a717}',
+        '\u{a71f}'), ('\u{a722}', '\u{a788}'), ('\u{a78b}', '\u{a7cd}'), ('\u{a7d0}', '\u{a7d1}'),
+        ('\u{a7d3}', '\u{a7d3}'), ('\u{a7d5}', '\u{a7dc}'), ('\u{a7f2}', '\u{a805}'), ('\u{a807}',
+        '\u{a827}'), ('\u{a840}', '\u{a873}'), ('\u{a880}', '\u{a8c3}'), ('\u{a8c5}', '\u{a8c5}'),
+        ('\u{a8f2}', '\u{a8f7}'), ('\u{a8fb}', '\u{a8fb}'), ('\u{a8fd}', '\u{a8ff}'), ('\u{a90a}',
+        '\u{a92a}'), ('\u{a930}', '\u{a952}'), ('\u{a960}', '\u{a97c}'), ('\u{a980}', '\u{a9b2}'),
+        ('\u{a9b4}', '\u{a9bf}'), ('\u{a9cf}', '\u{a9cf}'), ('\u{a9e0}', '\u{a9ef}'), ('\u{a9fa}',
+        '\u{a9fe}'), ('\u{aa00}', '\u{aa36}'), ('\u{aa40}', '\u{aa4d}'), ('\u{aa60}', '\u{aa76}'),
+        ('\u{aa7a}', '\u{aabe}'), ('\u{aac0}', '\u{aac0}'), ('\u{aac2}', '\u{aac2}'), ('\u{aadb}',
+        '\u{aadd}'), ('\u{aae0}', '\u{aaef}'), ('\u{aaf2}', '\u{aaf5}'), ('\u{ab01}', '\u{ab06}'),
+        ('\u{ab09}', '\u{ab0e}'), ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', '\u{ab26}'), ('\u{ab28}',
+        '\u{ab2e}'), ('\u{ab30}', '\u{ab5a}'), ('\u{ab5c}', '\u{ab69}'), ('\u{ab70}', '\u{abea}'),
+        ('\u{ac00}', '\u{d7a3}'), ('\u{d7b0}', '\u{d7c6}'), ('\u{d7cb}', '\u{d7fb}'), ('\u{f900}',
+        '\u{fa6d}'), ('\u{fa70}', '\u{fad9}'), ('\u{fb00}', '\u{fb06}'), ('\u{fb13}', '\u{fb17}'),
+        ('\u{fb1d}', '\u{fb28}'), ('\u{fb2a}', '\u{fb36}'), ('\u{fb38}', '\u{fb3c}'), ('\u{fb3e}',
+        '\u{fb3e}'), ('\u{fb40}', '\u{fb41}'), ('\u{fb43}', '\u{fb44}'), ('\u{fb46}', '\u{fbb1}'),
+        ('\u{fbd3}', '\u{fd3d}'), ('\u{fd50}', '\u{fd8f}'), ('\u{fd92}', '\u{fdc7}'), ('\u{fdf0}',
+        '\u{fdfb}'), ('\u{fe70}', '\u{fe74}'), ('\u{fe76}', '\u{fefc}'), ('\u{ff21}', '\u{ff3a}'),
+        ('\u{ff41}', '\u{ff5a}'), ('\u{ff66}', '\u{ffbe}'), ('\u{ffc2}', '\u{ffc7}'), ('\u{ffca}',
+        '\u{ffcf}'), ('\u{ffd2}', '\u{ffd7}'), ('\u{ffda}', '\u{ffdc}'), ('\u{10000}', '\u{1000b}'),
+        ('\u{1000d}', '\u{10026}'), ('\u{10028}', '\u{1003a}'), ('\u{1003c}', '\u{1003d}'),
+        ('\u{1003f}', '\u{1004d}'), ('\u{10050}', '\u{1005d}'), ('\u{10080}', '\u{100fa}'),
+        ('\u{10140}', '\u{10174}'), ('\u{10280}', '\u{1029c}'), ('\u{102a0}', '\u{102d0}'),
+        ('\u{10300}', '\u{1031f}'), ('\u{1032d}', '\u{1034a}'), ('\u{10350}', '\u{1037a}'),
+        ('\u{10380}', '\u{1039d}'), ('\u{103a0}', '\u{103c3}'), ('\u{103c8}', '\u{103cf}'),
+        ('\u{103d1}', '\u{103d5}'), ('\u{10400}', '\u{1049d}'), ('\u{104b0}', '\u{104d3}'),
+        ('\u{104d8}', '\u{104fb}'), ('\u{10500}', '\u{10527}'), ('\u{10530}', '\u{10563}'),
+        ('\u{10570}', '\u{1057a}'), ('\u{1057c}', '\u{1058a}'), ('\u{1058c}', '\u{10592}'),
+        ('\u{10594}', '\u{10595}'), ('\u{10597}', '\u{105a1}'), ('\u{105a3}', '\u{105b1}'),
+        ('\u{105b3}', '\u{105b9}'), ('\u{105bb}', '\u{105bc}'), ('\u{105c0}', '\u{105f3}'),
+        ('\u{10600}', '\u{10736}'), ('\u{10740}', '\u{10755}'), ('\u{10760}', '\u{10767}'),
+        ('\u{10780}', '\u{10785}'), ('\u{10787}', '\u{107b0}'), ('\u{107b2}', '\u{107ba}'),
+        ('\u{10800}', '\u{10805}'), ('\u{10808}', '\u{10808}'), ('\u{1080a}', '\u{10835}'),
+        ('\u{10837}', '\u{10838}'), ('\u{1083c}', '\u{1083c}'), ('\u{1083f}', '\u{10855}'),
+        ('\u{10860}', '\u{10876}'), ('\u{10880}', '\u{1089e}'), ('\u{108e0}', '\u{108f2}'),
+        ('\u{108f4}', '\u{108f5}'), ('\u{10900}', '\u{10915}'), ('\u{10920}', '\u{10939}'),
+        ('\u{10980}', '\u{109b7}'), ('\u{109be}', '\u{109bf}'), ('\u{10a00}', '\u{10a03}'),
+        ('\u{10a05}', '\u{10a06}'), ('\u{10a0c}', '\u{10a13}'), ('\u{10a15}', '\u{10a17}'),
+        ('\u{10a19}', '\u{10a35}'), ('\u{10a60}', '\u{10a7c}'), ('\u{10a80}', '\u{10a9c}'),
+        ('\u{10ac0}', '\u{10ac7}'), ('\u{10ac9}', '\u{10ae4}'), ('\u{10b00}', '\u{10b35}'),
+        ('\u{10b40}', '\u{10b55}'), ('\u{10b60}', '\u{10b72}'), ('\u{10b80}', '\u{10b91}'),
+        ('\u{10c00}', '\u{10c48}'), ('\u{10c80}', '\u{10cb2}'), ('\u{10cc0}', '\u{10cf2}'),
+        ('\u{10d00}', '\u{10d27}'), ('\u{10d4a}', '\u{10d65}'), ('\u{10d69}', '\u{10d69}'),
+        ('\u{10d6f}', '\u{10d85}'), ('\u{10e80}', '\u{10ea9}'), ('\u{10eab}', '\u{10eac}'),
+        ('\u{10eb0}', '\u{10eb1}'), ('\u{10ec2}', '\u{10ec4}'), ('\u{10efc}', '\u{10efc}'),
+        ('\u{10f00}', '\u{10f1c}'), ('\u{10f27}', '\u{10f27}'), ('\u{10f30}', '\u{10f45}'),
+        ('\u{10f70}', '\u{10f81}'), ('\u{10fb0}', '\u{10fc4}'), ('\u{10fe0}', '\u{10ff6}'),
+        ('\u{11000}', '\u{11045}'), ('\u{11071}', '\u{11075}'), ('\u{11080}', '\u{110b8}'),
+        ('\u{110c2}', '\u{110c2}'), ('\u{110d0}', '\u{110e8}'), ('\u{11100}', '\u{11132}'),
+        ('\u{11144}', '\u{11147}'), ('\u{11150}', '\u{11172}'), ('\u{11176}', '\u{11176}'),
+        ('\u{11180}', '\u{111bf}'), ('\u{111c1}', '\u{111c4}'), ('\u{111ce}', '\u{111cf}'),
+        ('\u{111da}', '\u{111da}'), ('\u{111dc}', '\u{111dc}'), ('\u{11200}', '\u{11211}'),
+        ('\u{11213}', '\u{11234}'), ('\u{11237}', '\u{11237}'), ('\u{1123e}', '\u{11241}'),
+        ('\u{11280}', '\u{11286}'), ('\u{11288}', '\u{11288}'), ('\u{1128a}', '\u{1128d}'),
+        ('\u{1128f}', '\u{1129d}'), ('\u{1129f}', '\u{112a8}'), ('\u{112b0}', '\u{112e8}'),
+        ('\u{11300}', '\u{11303}'), ('\u{11305}', '\u{1130c}'), ('\u{1130f}', '\u{11310}'),
+        ('\u{11313}', '\u{11328}'), ('\u{1132a}', '\u{11330}'), ('\u{11332}', '\u{11333}'),
+        ('\u{11335}', '\u{11339}'), ('\u{1133d}', '\u{11344}'), ('\u{11347}', '\u{11348}'),
+        ('\u{1134b}', '\u{1134c}'), ('\u{11350}', '\u{11350}'), ('\u{11357}', '\u{11357}'),
+        ('\u{1135d}', '\u{11363}'), ('\u{11380}', '\u{11389}'), ('\u{1138b}', '\u{1138b}'),
+        ('\u{1138e}', '\u{1138e}'), ('\u{11390}', '\u{113b5}'), ('\u{113b7}', '\u{113c0}'),
+        ('\u{113c2}', '\u{113c2}'), ('\u{113c5}', '\u{113c5}'), ('\u{113c7}', '\u{113ca}'),
+        ('\u{113cc}', '\u{113cd}'), ('\u{113d1}', '\u{113d1}'), ('\u{113d3}', '\u{113d3}'),
+        ('\u{11400}', '\u{11441}'), ('\u{11443}', '\u{11445}'), ('\u{11447}', '\u{1144a}'),
+        ('\u{1145f}', '\u{11461}'), ('\u{11480}', '\u{114c1}'), ('\u{114c4}', '\u{114c5}'),
+        ('\u{114c7}', '\u{114c7}'), ('\u{11580}', '\u{115b5}'), ('\u{115b8}', '\u{115be}'),
+        ('\u{115d8}', '\u{115dd}'), ('\u{11600}', '\u{1163e}'), ('\u{11640}', '\u{11640}'),
+        ('\u{11644}', '\u{11644}'), ('\u{11680}', '\u{116b5}'), ('\u{116b8}', '\u{116b8}'),
+        ('\u{11700}', '\u{1171a}'), ('\u{1171d}', '\u{1172a}'), ('\u{11740}', '\u{11746}'),
+        ('\u{11800}', '\u{11838}'), ('\u{118a0}', '\u{118df}'), ('\u{118ff}', '\u{11906}'),
+        ('\u{11909}', '\u{11909}'), ('\u{1190c}', '\u{11913}'), ('\u{11915}', '\u{11916}'),
+        ('\u{11918}', '\u{11935}'), ('\u{11937}', '\u{11938}'), ('\u{1193b}', '\u{1193c}'),
+        ('\u{1193f}', '\u{11942}'), ('\u{119a0}', '\u{119a7}'), ('\u{119aa}', '\u{119d7}'),
+        ('\u{119da}', '\u{119df}'), ('\u{119e1}', '\u{119e1}'), ('\u{119e3}', '\u{119e4}'),
+        ('\u{11a00}', '\u{11a32}'), ('\u{11a35}', '\u{11a3e}'), ('\u{11a50}', '\u{11a97}'),
+        ('\u{11a9d}', '\u{11a9d}'), ('\u{11ab0}', '\u{11af8}'), ('\u{11bc0}', '\u{11be0}'),
+        ('\u{11c00}', '\u{11c08}'), ('\u{11c0a}', '\u{11c36}'), ('\u{11c38}', '\u{11c3e}'),
+        ('\u{11c40}', '\u{11c40}'), ('\u{11c72}', '\u{11c8f}'), ('\u{11c92}', '\u{11ca7}'),
+        ('\u{11ca9}', '\u{11cb6}'), ('\u{11d00}', '\u{11d06}'), ('\u{11d08}', '\u{11d09}'),
+        ('\u{11d0b}', '\u{11d36}'), ('\u{11d3a}', '\u{11d3a}'), ('\u{11d3c}', '\u{11d3d}'),
+        ('\u{11d3f}', '\u{11d41}'), ('\u{11d43}', '\u{11d43}'), ('\u{11d46}', '\u{11d47}'),
+        ('\u{11d60}', '\u{11d65}'), ('\u{11d67}', '\u{11d68}'), ('\u{11d6a}', '\u{11d8e}'),
+        ('\u{11d90}', '\u{11d91}'), ('\u{11d93}', '\u{11d96}'), ('\u{11d98}', '\u{11d98}'),
+        ('\u{11ee0}', '\u{11ef6}'), ('\u{11f00}', '\u{11f10}'), ('\u{11f12}', '\u{11f3a}'),
+        ('\u{11f3e}', '\u{11f40}'), ('\u{11fb0}', '\u{11fb0}'), ('\u{12000}', '\u{12399}'),
+        ('\u{12400}', '\u{1246e}'), ('\u{12480}', '\u{12543}'), ('\u{12f90}', '\u{12ff0}'),
+        ('\u{13000}', '\u{1342f}'), ('\u{13441}', '\u{13446}'), ('\u{13460}', '\u{143fa}'),
+        ('\u{14400}', '\u{14646}'), ('\u{16100}', '\u{1612e}'), ('\u{16800}', '\u{16a38}'),
+        ('\u{16a40}', '\u{16a5e}'), ('\u{16a70}', '\u{16abe}'), ('\u{16ad0}', '\u{16aed}'),
+        ('\u{16b00}', '\u{16b2f}'), ('\u{16b40}', '\u{16b43}'), ('\u{16b63}', '\u{16b77}'),
+        ('\u{16b7d}', '\u{16b8f}'), ('\u{16d40}', '\u{16d6c}'), ('\u{16e40}', '\u{16e7f}'),
+        ('\u{16f00}', '\u{16f4a}'), ('\u{16f4f}', '\u{16f87}'), ('\u{16f8f}', '\u{16f9f}'),
+        ('\u{16fe0}', '\u{16fe1}'), ('\u{16fe3}', '\u{16fe3}'), ('\u{16ff0}', '\u{16ff1}'),
+        ('\u{17000}', '\u{187f7}'), ('\u{18800}', '\u{18cd5}'), ('\u{18cff}', '\u{18d08}'),
+        ('\u{1aff0}', '\u{1aff3}'), ('\u{1aff5}', '\u{1affb}'), ('\u{1affd}', '\u{1affe}'),
+        ('\u{1b000}', '\u{1b122}'), ('\u{1b132}', '\u{1b132}'), ('\u{1b150}', '\u{1b152}'),
+        ('\u{1b155}', '\u{1b155}'), ('\u{1b164}', '\u{1b167}'), ('\u{1b170}', '\u{1b2fb}'),
+        ('\u{1bc00}', '\u{1bc6a}'), ('\u{1bc70}', '\u{1bc7c}'), ('\u{1bc80}', '\u{1bc88}'),
+        ('\u{1bc90}', '\u{1bc99}'), ('\u{1bc9e}', '\u{1bc9e}'), ('\u{1d400}', '\u{1d454}'),
+        ('\u{1d456}', '\u{1d49c}'), ('\u{1d49e}', '\u{1d49f}'), ('\u{1d4a2}', '\u{1d4a2}'),
+        ('\u{1d4a5}', '\u{1d4a6}'), ('\u{1d4a9}', '\u{1d4ac}'), ('\u{1d4ae}', '\u{1d4b9}'),
+        ('\u{1d4bb}', '\u{1d4bb}'), ('\u{1d4bd}', '\u{1d4c3}'), ('\u{1d4c5}', '\u{1d505}'),
+        ('\u{1d507}', '\u{1d50a}'), ('\u{1d50d}', '\u{1d514}'), ('\u{1d516}', '\u{1d51c}'),
+        ('\u{1d51e}', '\u{1d539}'), ('\u{1d53b}', '\u{1d53e}'), ('\u{1d540}', '\u{1d544}'),
+        ('\u{1d546}', '\u{1d546}'), ('\u{1d54a}', '\u{1d550}'), ('\u{1d552}', '\u{1d6a5}'),
+        ('\u{1d6a8}', '\u{1d6c0}'), ('\u{1d6c2}', '\u{1d6da}'), ('\u{1d6dc}', '\u{1d6fa}'),
+        ('\u{1d6fc}', '\u{1d714}'), ('\u{1d716}', '\u{1d734}'), ('\u{1d736}', '\u{1d74e}'),
+        ('\u{1d750}', '\u{1d76e}'), ('\u{1d770}', '\u{1d788}'), ('\u{1d78a}', '\u{1d7a8}'),
+        ('\u{1d7aa}', '\u{1d7c2}'), ('\u{1d7c4}', '\u{1d7cb}'), ('\u{1df00}', '\u{1df1e}'),
+        ('\u{1df25}', '\u{1df2a}'), ('\u{1e000}', '\u{1e006}'), ('\u{1e008}', '\u{1e018}'),
+        ('\u{1e01b}', '\u{1e021}'), ('\u{1e023}', '\u{1e024}'), ('\u{1e026}', '\u{1e02a}'),
+        ('\u{1e030}', '\u{1e06d}'), ('\u{1e08f}', '\u{1e08f}'), ('\u{1e100}', '\u{1e12c}'),
+        ('\u{1e137}', '\u{1e13d}'), ('\u{1e14e}', '\u{1e14e}'), ('\u{1e290}', '\u{1e2ad}'),
+        ('\u{1e2c0}', '\u{1e2eb}'), ('\u{1e4d0}', '\u{1e4eb}'), ('\u{1e5d0}', '\u{1e5ed}'),
+        ('\u{1e5f0}', '\u{1e5f0}'), ('\u{1e7e0}', '\u{1e7e6}'), ('\u{1e7e8}', '\u{1e7eb}'),
+        ('\u{1e7ed}', '\u{1e7ee}'), ('\u{1e7f0}', '\u{1e7fe}'), ('\u{1e800}', '\u{1e8c4}'),
+        ('\u{1e900}', '\u{1e943}'), ('\u{1e947}', '\u{1e947}'), ('\u{1e94b}', '\u{1e94b}'),
+        ('\u{1ee00}', '\u{1ee03}'), ('\u{1ee05}', '\u{1ee1f}'), ('\u{1ee21}', '\u{1ee22}'),
+        ('\u{1ee24}', '\u{1ee24}'), ('\u{1ee27}', '\u{1ee27}'), ('\u{1ee29}', '\u{1ee32}'),
+        ('\u{1ee34}', '\u{1ee37}'), ('\u{1ee39}', '\u{1ee39}'), ('\u{1ee3b}', '\u{1ee3b}'),
+        ('\u{1ee42}', '\u{1ee42}'), ('\u{1ee47}', '\u{1ee47}'), ('\u{1ee49}', '\u{1ee49}'),
+        ('\u{1ee4b}', '\u{1ee4b}'), ('\u{1ee4d}', '\u{1ee4f}'), ('\u{1ee51}', '\u{1ee52}'),
+        ('\u{1ee54}', '\u{1ee54}'), ('\u{1ee57}', '\u{1ee57}'), ('\u{1ee59}', '\u{1ee59}'),
+        ('\u{1ee5b}', '\u{1ee5b}'), ('\u{1ee5d}', '\u{1ee5d}'), ('\u{1ee5f}', '\u{1ee5f}'),
+        ('\u{1ee61}', '\u{1ee62}'), ('\u{1ee64}', '\u{1ee64}'), ('\u{1ee67}', '\u{1ee6a}'),
+        ('\u{1ee6c}', '\u{1ee72}'), ('\u{1ee74}', '\u{1ee77}'), ('\u{1ee79}', '\u{1ee7c}'),
+        ('\u{1ee7e}', '\u{1ee7e}'), ('\u{1ee80}', '\u{1ee89}'), ('\u{1ee8b}', '\u{1ee9b}'),
+        ('\u{1eea1}', '\u{1eea3}'), ('\u{1eea5}', '\u{1eea9}'), ('\u{1eeab}', '\u{1eebb}'),
+        ('\u{1f130}', '\u{1f149}'), ('\u{1f150}', '\u{1f169}'), ('\u{1f170}', '\u{1f189}'),
+        ('\u{20000}', '\u{2a6df}'), ('\u{2a700}', '\u{2b739}'), ('\u{2b740}', '\u{2b81d}'),
+        ('\u{2b820}', '\u{2cea1}'), ('\u{2ceb0}', '\u{2ebe0}'), ('\u{2ebf0}', '\u{2ee5d}'),
+        ('\u{2f800}', '\u{2fa1d}'), ('\u{30000}', '\u{3134a}'), ('\u{31350}', '\u{323af}')
     ];
 
     #[inline]
@@ -338,6 +358,132 @@
         super::util::bsearch_range_table(c, Alphabetic_table)
     }
 
+    const InCB_Extend_table: &[(char, char)] = &[
+        ('\u{300}', '\u{36f}'), ('\u{483}', '\u{489}'), ('\u{591}', '\u{5bd}'), ('\u{5bf}',
+        '\u{5bf}'), ('\u{5c1}', '\u{5c2}'), ('\u{5c4}', '\u{5c5}'), ('\u{5c7}', '\u{5c7}'),
+        ('\u{610}', '\u{61a}'), ('\u{64b}', '\u{65f}'), ('\u{670}', '\u{670}'), ('\u{6d6}',
+        '\u{6dc}'), ('\u{6df}', '\u{6e4}'), ('\u{6e7}', '\u{6e8}'), ('\u{6ea}', '\u{6ed}'),
+        ('\u{711}', '\u{711}'), ('\u{730}', '\u{74a}'), ('\u{7a6}', '\u{7b0}'), ('\u{7eb}',
+        '\u{7f3}'), ('\u{7fd}', '\u{7fd}'), ('\u{816}', '\u{819}'), ('\u{81b}', '\u{823}'),
+        ('\u{825}', '\u{827}'), ('\u{829}', '\u{82d}'), ('\u{859}', '\u{85b}'), ('\u{897}',
+        '\u{89f}'), ('\u{8ca}', '\u{8e1}'), ('\u{8e3}', '\u{902}'), ('\u{93a}', '\u{93a}'),
+        ('\u{93c}', '\u{93c}'), ('\u{941}', '\u{948}'), ('\u{951}', '\u{957}'), ('\u{962}',
+        '\u{963}'), ('\u{981}', '\u{981}'), ('\u{9bc}', '\u{9bc}'), ('\u{9be}', '\u{9be}'),
+        ('\u{9c1}', '\u{9c4}'), ('\u{9d7}', '\u{9d7}'), ('\u{9e2}', '\u{9e3}'), ('\u{9fe}',
+        '\u{9fe}'), ('\u{a01}', '\u{a02}'), ('\u{a3c}', '\u{a3c}'), ('\u{a41}', '\u{a42}'),
+        ('\u{a47}', '\u{a48}'), ('\u{a4b}', '\u{a4d}'), ('\u{a51}', '\u{a51}'), ('\u{a70}',
+        '\u{a71}'), ('\u{a75}', '\u{a75}'), ('\u{a81}', '\u{a82}'), ('\u{abc}', '\u{abc}'),
+        ('\u{ac1}', '\u{ac5}'), ('\u{ac7}', '\u{ac8}'), ('\u{ae2}', '\u{ae3}'), ('\u{afa}',
+        '\u{aff}'), ('\u{b01}', '\u{b01}'), ('\u{b3c}', '\u{b3c}'), ('\u{b3e}', '\u{b3f}'),
+        ('\u{b41}', '\u{b44}'), ('\u{b55}', '\u{b57}'), ('\u{b62}', '\u{b63}'), ('\u{b82}',
+        '\u{b82}'), ('\u{bbe}', '\u{bbe}'), ('\u{bc0}', '\u{bc0}'), ('\u{bcd}', '\u{bcd}'),
+        ('\u{bd7}', '\u{bd7}'), ('\u{c00}', '\u{c00}'), ('\u{c04}', '\u{c04}'), ('\u{c3c}',
+        '\u{c3c}'), ('\u{c3e}', '\u{c40}'), ('\u{c46}', '\u{c48}'), ('\u{c4a}', '\u{c4c}'),
+        ('\u{c55}', '\u{c56}'), ('\u{c62}', '\u{c63}'), ('\u{c81}', '\u{c81}'), ('\u{cbc}',
+        '\u{cbc}'), ('\u{cbf}', '\u{cc0}'), ('\u{cc2}', '\u{cc2}'), ('\u{cc6}', '\u{cc8}'),
+        ('\u{cca}', '\u{ccd}'), ('\u{cd5}', '\u{cd6}'), ('\u{ce2}', '\u{ce3}'), ('\u{d00}',
+        '\u{d01}'), ('\u{d3b}', '\u{d3c}'), ('\u{d3e}', '\u{d3e}'), ('\u{d41}', '\u{d44}'),
+        ('\u{d57}', '\u{d57}'), ('\u{d62}', '\u{d63}'), ('\u{d81}', '\u{d81}'), ('\u{dca}',
+        '\u{dca}'), ('\u{dcf}', '\u{dcf}'), ('\u{dd2}', '\u{dd4}'), ('\u{dd6}', '\u{dd6}'),
+        ('\u{ddf}', '\u{ddf}'), ('\u{e31}', '\u{e31}'), ('\u{e34}', '\u{e3a}'), ('\u{e47}',
+        '\u{e4e}'), ('\u{eb1}', '\u{eb1}'), ('\u{eb4}', '\u{ebc}'), ('\u{ec8}', '\u{ece}'),
+        ('\u{f18}', '\u{f19}'), ('\u{f35}', '\u{f35}'), ('\u{f37}', '\u{f37}'), ('\u{f39}',
+        '\u{f39}'), ('\u{f71}', '\u{f7e}'), ('\u{f80}', '\u{f84}'), ('\u{f86}', '\u{f87}'),
+        ('\u{f8d}', '\u{f97}'), ('\u{f99}', '\u{fbc}'), ('\u{fc6}', '\u{fc6}'), ('\u{102d}',
+        '\u{1030}'), ('\u{1032}', '\u{1037}'), ('\u{1039}', '\u{103a}'), ('\u{103d}', '\u{103e}'),
+        ('\u{1058}', '\u{1059}'), ('\u{105e}', '\u{1060}'), ('\u{1071}', '\u{1074}'), ('\u{1082}',
+        '\u{1082}'), ('\u{1085}', '\u{1086}'), ('\u{108d}', '\u{108d}'), ('\u{109d}', '\u{109d}'),
+        ('\u{135d}', '\u{135f}'), ('\u{1712}', '\u{1715}'), ('\u{1732}', '\u{1734}'), ('\u{1752}',
+        '\u{1753}'), ('\u{1772}', '\u{1773}'), ('\u{17b4}', '\u{17b5}'), ('\u{17b7}', '\u{17bd}'),
+        ('\u{17c6}', '\u{17c6}'), ('\u{17c9}', '\u{17d3}'), ('\u{17dd}', '\u{17dd}'), ('\u{180b}',
+        '\u{180d}'), ('\u{180f}', '\u{180f}'), ('\u{1885}', '\u{1886}'), ('\u{18a9}', '\u{18a9}'),
+        ('\u{1920}', '\u{1922}'), ('\u{1927}', '\u{1928}'), ('\u{1932}', '\u{1932}'), ('\u{1939}',
+        '\u{193b}'), ('\u{1a17}', '\u{1a18}'), ('\u{1a1b}', '\u{1a1b}'), ('\u{1a56}', '\u{1a56}'),
+        ('\u{1a58}', '\u{1a5e}'), ('\u{1a60}', '\u{1a60}'), ('\u{1a62}', '\u{1a62}'), ('\u{1a65}',
+        '\u{1a6c}'), ('\u{1a73}', '\u{1a7c}'), ('\u{1a7f}', '\u{1a7f}'), ('\u{1ab0}', '\u{1ace}'),
+        ('\u{1b00}', '\u{1b03}'), ('\u{1b34}', '\u{1b3d}'), ('\u{1b42}', '\u{1b44}'), ('\u{1b6b}',
+        '\u{1b73}'), ('\u{1b80}', '\u{1b81}'), ('\u{1ba2}', '\u{1ba5}'), ('\u{1ba8}', '\u{1bad}'),
+        ('\u{1be6}', '\u{1be6}'), ('\u{1be8}', '\u{1be9}'), ('\u{1bed}', '\u{1bed}'), ('\u{1bef}',
+        '\u{1bf3}'), ('\u{1c2c}', '\u{1c33}'), ('\u{1c36}', '\u{1c37}'), ('\u{1cd0}', '\u{1cd2}'),
+        ('\u{1cd4}', '\u{1ce0}'), ('\u{1ce2}', '\u{1ce8}'), ('\u{1ced}', '\u{1ced}'), ('\u{1cf4}',
+        '\u{1cf4}'), ('\u{1cf8}', '\u{1cf9}'), ('\u{1dc0}', '\u{1dff}'), ('\u{200d}', '\u{200d}'),
+        ('\u{20d0}', '\u{20f0}'), ('\u{2cef}', '\u{2cf1}'), ('\u{2d7f}', '\u{2d7f}'), ('\u{2de0}',
+        '\u{2dff}'), ('\u{302a}', '\u{302f}'), ('\u{3099}', '\u{309a}'), ('\u{a66f}', '\u{a672}'),
+        ('\u{a674}', '\u{a67d}'), ('\u{a69e}', '\u{a69f}'), ('\u{a6f0}', '\u{a6f1}'), ('\u{a802}',
+        '\u{a802}'), ('\u{a806}', '\u{a806}'), ('\u{a80b}', '\u{a80b}'), ('\u{a825}', '\u{a826}'),
+        ('\u{a82c}', '\u{a82c}'), ('\u{a8c4}', '\u{a8c5}'), ('\u{a8e0}', '\u{a8f1}'), ('\u{a8ff}',
+        '\u{a8ff}'), ('\u{a926}', '\u{a92d}'), ('\u{a947}', '\u{a951}'), ('\u{a953}', '\u{a953}'),
+        ('\u{a980}', '\u{a982}'), ('\u{a9b3}', '\u{a9b3}'), ('\u{a9b6}', '\u{a9b9}'), ('\u{a9bc}',
+        '\u{a9bd}'), ('\u{a9c0}', '\u{a9c0}'), ('\u{a9e5}', '\u{a9e5}'), ('\u{aa29}', '\u{aa2e}'),
+        ('\u{aa31}', '\u{aa32}'), ('\u{aa35}', '\u{aa36}'), ('\u{aa43}', '\u{aa43}'), ('\u{aa4c}',
+        '\u{aa4c}'), ('\u{aa7c}', '\u{aa7c}'), ('\u{aab0}', '\u{aab0}'), ('\u{aab2}', '\u{aab4}'),
+        ('\u{aab7}', '\u{aab8}'), ('\u{aabe}', '\u{aabf}'), ('\u{aac1}', '\u{aac1}'), ('\u{aaec}',
+        '\u{aaed}'), ('\u{aaf6}', '\u{aaf6}'), ('\u{abe5}', '\u{abe5}'), ('\u{abe8}', '\u{abe8}'),
+        ('\u{abed}', '\u{abed}'), ('\u{fb1e}', '\u{fb1e}'), ('\u{fe00}', '\u{fe0f}'), ('\u{fe20}',
+        '\u{fe2f}'), ('\u{ff9e}', '\u{ff9f}'), ('\u{101fd}', '\u{101fd}'), ('\u{102e0}',
+        '\u{102e0}'), ('\u{10376}', '\u{1037a}'), ('\u{10a01}', '\u{10a03}'), ('\u{10a05}',
+        '\u{10a06}'), ('\u{10a0c}', '\u{10a0f}'), ('\u{10a38}', '\u{10a3a}'), ('\u{10a3f}',
+        '\u{10a3f}'), ('\u{10ae5}', '\u{10ae6}'), ('\u{10d24}', '\u{10d27}'), ('\u{10d69}',
+        '\u{10d6d}'), ('\u{10eab}', '\u{10eac}'), ('\u{10efc}', '\u{10eff}'), ('\u{10f46}',
+        '\u{10f50}'), ('\u{10f82}', '\u{10f85}'), ('\u{11001}', '\u{11001}'), ('\u{11038}',
+        '\u{11046}'), ('\u{11070}', '\u{11070}'), ('\u{11073}', '\u{11074}'), ('\u{1107f}',
+        '\u{11081}'), ('\u{110b3}', '\u{110b6}'), ('\u{110b9}', '\u{110ba}'), ('\u{110c2}',
+        '\u{110c2}'), ('\u{11100}', '\u{11102}'), ('\u{11127}', '\u{1112b}'), ('\u{1112d}',
+        '\u{11134}'), ('\u{11173}', '\u{11173}'), ('\u{11180}', '\u{11181}'), ('\u{111b6}',
+        '\u{111be}'), ('\u{111c0}', '\u{111c0}'), ('\u{111c9}', '\u{111cc}'), ('\u{111cf}',
+        '\u{111cf}'), ('\u{1122f}', '\u{11231}'), ('\u{11234}', '\u{11237}'), ('\u{1123e}',
+        '\u{1123e}'), ('\u{11241}', '\u{11241}'), ('\u{112df}', '\u{112df}'), ('\u{112e3}',
+        '\u{112ea}'), ('\u{11300}', '\u{11301}'), ('\u{1133b}', '\u{1133c}'), ('\u{1133e}',
+        '\u{1133e}'), ('\u{11340}', '\u{11340}'), ('\u{1134d}', '\u{1134d}'), ('\u{11357}',
+        '\u{11357}'), ('\u{11366}', '\u{1136c}'), ('\u{11370}', '\u{11374}'), ('\u{113b8}',
+        '\u{113b8}'), ('\u{113bb}', '\u{113c0}'), ('\u{113c2}', '\u{113c2}'), ('\u{113c5}',
+        '\u{113c5}'), ('\u{113c7}', '\u{113c9}'), ('\u{113ce}', '\u{113d0}'), ('\u{113d2}',
+        '\u{113d2}'), ('\u{113e1}', '\u{113e2}'), ('\u{11438}', '\u{1143f}'), ('\u{11442}',
+        '\u{11444}'), ('\u{11446}', '\u{11446}'), ('\u{1145e}', '\u{1145e}'), ('\u{114b0}',
+        '\u{114b0}'), ('\u{114b3}', '\u{114b8}'), ('\u{114ba}', '\u{114ba}'), ('\u{114bd}',
+        '\u{114bd}'), ('\u{114bf}', '\u{114c0}'), ('\u{114c2}', '\u{114c3}'), ('\u{115af}',
+        '\u{115af}'), ('\u{115b2}', '\u{115b5}'), ('\u{115bc}', '\u{115bd}'), ('\u{115bf}',
+        '\u{115c0}'), ('\u{115dc}', '\u{115dd}'), ('\u{11633}', '\u{1163a}'), ('\u{1163d}',
+        '\u{1163d}'), ('\u{1163f}', '\u{11640}'), ('\u{116ab}', '\u{116ab}'), ('\u{116ad}',
+        '\u{116ad}'), ('\u{116b0}', '\u{116b7}'), ('\u{1171d}', '\u{1171d}'), ('\u{1171f}',
+        '\u{1171f}'), ('\u{11722}', '\u{11725}'), ('\u{11727}', '\u{1172b}'), ('\u{1182f}',
+        '\u{11837}'), ('\u{11839}', '\u{1183a}'), ('\u{11930}', '\u{11930}'), ('\u{1193b}',
+        '\u{1193e}'), ('\u{11943}', '\u{11943}'), ('\u{119d4}', '\u{119d7}'), ('\u{119da}',
+        '\u{119db}'), ('\u{119e0}', '\u{119e0}'), ('\u{11a01}', '\u{11a0a}'), ('\u{11a33}',
+        '\u{11a38}'), ('\u{11a3b}', '\u{11a3e}'), ('\u{11a47}', '\u{11a47}'), ('\u{11a51}',
+        '\u{11a56}'), ('\u{11a59}', '\u{11a5b}'), ('\u{11a8a}', '\u{11a96}'), ('\u{11a98}',
+        '\u{11a99}'), ('\u{11c30}', '\u{11c36}'), ('\u{11c38}', '\u{11c3d}'), ('\u{11c3f}',
+        '\u{11c3f}'), ('\u{11c92}', '\u{11ca7}'), ('\u{11caa}', '\u{11cb0}'), ('\u{11cb2}',
+        '\u{11cb3}'), ('\u{11cb5}', '\u{11cb6}'), ('\u{11d31}', '\u{11d36}'), ('\u{11d3a}',
+        '\u{11d3a}'), ('\u{11d3c}', '\u{11d3d}'), ('\u{11d3f}', '\u{11d45}'), ('\u{11d47}',
+        '\u{11d47}'), ('\u{11d90}', '\u{11d91}'), ('\u{11d95}', '\u{11d95}'), ('\u{11d97}',
+        '\u{11d97}'), ('\u{11ef3}', '\u{11ef4}'), ('\u{11f00}', '\u{11f01}'), ('\u{11f36}',
+        '\u{11f3a}'), ('\u{11f40}', '\u{11f42}'), ('\u{11f5a}', '\u{11f5a}'), ('\u{13440}',
+        '\u{13440}'), ('\u{13447}', '\u{13455}'), ('\u{1611e}', '\u{16129}'), ('\u{1612d}',
+        '\u{1612f}'), ('\u{16af0}', '\u{16af4}'), ('\u{16b30}', '\u{16b36}'), ('\u{16f4f}',
+        '\u{16f4f}'), ('\u{16f8f}', '\u{16f92}'), ('\u{16fe4}', '\u{16fe4}'), ('\u{16ff0}',
+        '\u{16ff1}'), ('\u{1bc9d}', '\u{1bc9e}'), ('\u{1cf00}', '\u{1cf2d}'), ('\u{1cf30}',
+        '\u{1cf46}'), ('\u{1d165}', '\u{1d169}'), ('\u{1d16d}', '\u{1d172}'), ('\u{1d17b}',
+        '\u{1d182}'), ('\u{1d185}', '\u{1d18b}'), ('\u{1d1aa}', '\u{1d1ad}'), ('\u{1d242}',
+        '\u{1d244}'), ('\u{1da00}', '\u{1da36}'), ('\u{1da3b}', '\u{1da6c}'), ('\u{1da75}',
+        '\u{1da75}'), ('\u{1da84}', '\u{1da84}'), ('\u{1da9b}', '\u{1da9f}'), ('\u{1daa1}',
+        '\u{1daaf}'), ('\u{1e000}', '\u{1e006}'), ('\u{1e008}', '\u{1e018}'), ('\u{1e01b}',
+        '\u{1e021}'), ('\u{1e023}', '\u{1e024}'), ('\u{1e026}', '\u{1e02a}'), ('\u{1e08f}',
+        '\u{1e08f}'), ('\u{1e130}', '\u{1e136}'), ('\u{1e2ae}', '\u{1e2ae}'), ('\u{1e2ec}',
+        '\u{1e2ef}'), ('\u{1e4ec}', '\u{1e4ef}'), ('\u{1e5ee}', '\u{1e5ef}'), ('\u{1e8d0}',
+        '\u{1e8d6}'), ('\u{1e944}', '\u{1e94a}'), ('\u{1f3fb}', '\u{1f3ff}'), ('\u{e0020}',
+        '\u{e007f}'), ('\u{e0100}', '\u{e01ef}')
+    ];
+
+    #[inline]
+    pub fn InCB_Extend(c: char) -> bool {
+        super::util::bsearch_range_table(c, InCB_Extend_table)
+    }
+
+}
+
+pub fn is_incb_linker(c: char) -> bool {
+    matches!(c, | '\u{94D}' | '\u{9CD}' | '\u{ACD}' | '\u{B4D}' | '\u{C4D}' | '\u{D4D}')
 }
 
 pub mod grapheme {
@@ -353,6 +499,7 @@
         GC_Control,
         GC_Extend,
         GC_Extended_Pictographic,
+        GC_InCB_Consonant,
         GC_L,
         GC_LF,
         GC_LV,
@@ -365,7 +512,7 @@
         GC_ZWJ,
     }
 
-    fn bsearch_range_value_table(c: char, r: &'static [(char, char, GraphemeCat)], default_lower: u32, default_upper: u32) -> (u32, u32, GraphemeCat) {
+    fn bsearch_range_value_table(c: char, r: &[(char, char, GraphemeCat)], default_lower: u32, default_upper: u32) -> (u32, u32, GraphemeCat) {
         use core::cmp::Ordering::{Equal, Less, Greater};
         match r.binary_search_by(|&(lo, hi, _)| {
             if lo <= c && c <= hi { Equal }
@@ -395,7 +542,7 @@
           // If the `idx` is outside of the precomputed table - use the slice
           // starting from the last covered index in the precomputed table and
           // ending with the length of the range table.
-          1443..1449,
+          1474..1480,
           |r| (r[0] as usize)..((r[1] + 1) as usize)
         );
 
@@ -407,74 +554,74 @@
         bsearch_range_value_table(c, &grapheme_cat_table[range], lower, upper)
     }
 
-    const grapheme_cat_lookup: &'static [u16] = &[
-        0, 5, 9, 9, 9, 9, 9, 10, 10, 10, 11, 11, 16, 21, 26, 29, 32, 37, 41, 53, 65, 75, 86, 97,
-        106, 116, 131, 143, 153, 157, 161, 168, 173, 183, 188, 189, 191, 191, 191, 192, 192, 192,
-        192, 192, 192, 192, 192, 198, 206, 209, 211, 219, 219, 232, 233, 242, 258, 262, 270, 270,
-        271, 271, 271, 271, 271, 279, 280, 282, 284, 284, 284, 286, 290, 290, 291, 291, 295, 297,
-        298, 313, 317, 317, 317, 318, 318, 318, 318, 322, 322, 322, 323, 324, 325, 325, 325, 325,
-        325, 328, 329, 329, 329, 329, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
-        331, 331, 331, 333, 335, 335, 335, 342, 347, 351, 360, 369, 379, 379, 386, 395, 405, 413,
-        423, 431, 441, 450, 459, 469, 477, 487, 495, 505, 514, 523, 533, 541, 551, 559, 569, 578,
-        587, 597, 605, 615, 623, 633, 642, 651, 661, 669, 679, 687, 697, 706, 715, 725, 733, 743,
-        751, 761, 770, 779, 789, 797, 807, 815, 825, 834, 843, 853, 861, 871, 879, 889, 898, 907,
-        917, 925, 935, 943, 953, 962, 971, 981, 989, 999, 1007, 1017, 1026, 1035, 1045, 1053, 1063,
-        1071, 1081, 1090, 1099, 1109, 1117, 1127, 1135, 1145, 1154, 1163, 1173, 1181, 1186, 1186,
-        1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
-        1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
-        1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
-        1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
-        1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1187, 1187, 1187, 1187, 1187, 1187,
-        1189, 1190, 1190, 1192, 1192, 1192, 1192, 1193, 1193, 1194, 1195, 1195, 1195, 1195, 1195,
-        1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1200, 1201, 1201, 1201, 1201, 1201,
-        1202, 1202, 1202, 1204, 1205, 1206, 1212, 1221, 1227, 1236, 1244, 1247, 1260, 1260, 1267,
-        1278, 1278, 1286, 1292, 1299, 1303, 1303, 1307, 1307, 1318, 1324, 1333, 1337, 1337, 1337,
-        1342, 1349, 1355, 1361, 1361, 1363, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-        1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-        1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-        1372, 1372, 1372, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
-        1375, 1375, 1375, 1375, 1375, 1375, 1375, 1376, 1377, 1377, 1377, 1377, 1377, 1377, 1377,
-        1377, 1378, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-        1382, 1382, 1382, 1382, 1382, 1382, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
-        1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
-        1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1386, 1386,
-        1386, 1386, 1392, 1395, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396,
-        1396, 1396, 1396, 1396, 1396, 1399, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402,
-        1402, 1402, 1407, 1408, 1409, 1409, 1409, 1411, 1411, 1411, 1411, 1412, 1412, 1412, 1412,
-        1412, 1412, 1412, 1412, 1413, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414,
-        1414, 1414, 1414, 1414, 1414, 1415, 1419, 1423, 1428, 1428, 1428, 1430, 1430, 1430, 1431,
-        1431, 1432, 1433, 1434, 1435, 1438, 1440, 1442, 1442, 1442, 1443, 1443, 1443, 1443, 1443,
-        1443, 1443, 1443, 1443, 1443
+    const grapheme_cat_lookup: &[u16] = &[
+        0, 5, 9, 9, 9, 9, 9, 10, 10, 10, 11, 11, 16, 21, 26, 29, 32, 37, 41, 56, 75, 85, 101, 119,
+        128, 141, 154, 167, 177, 181, 185, 192, 197, 207, 212, 213, 215, 215, 215, 216, 216, 216,
+        216, 216, 216, 216, 216, 220, 228, 231, 233, 241, 241, 254, 255, 261, 274, 278, 286, 286,
+        287, 287, 287, 287, 287, 295, 296, 298, 300, 300, 300, 302, 306, 306, 307, 307, 311, 313,
+        314, 329, 333, 333, 333, 334, 334, 334, 334, 338, 338, 338, 339, 340, 341, 341, 341, 341,
+        341, 344, 345, 345, 345, 345, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+        347, 347, 347, 349, 351, 351, 351, 358, 363, 368, 378, 387, 397, 397, 404, 413, 423, 431,
+        441, 449, 459, 468, 477, 487, 495, 505, 513, 523, 532, 541, 551, 559, 569, 577, 587, 596,
+        605, 615, 623, 633, 641, 651, 660, 669, 679, 687, 697, 705, 715, 724, 733, 743, 751, 761,
+        769, 779, 788, 797, 807, 815, 825, 833, 843, 852, 861, 871, 879, 889, 897, 907, 916, 925,
+        935, 943, 953, 961, 971, 980, 989, 999, 1007, 1017, 1025, 1035, 1044, 1053, 1063, 1071,
+        1081, 1089, 1099, 1108, 1117, 1127, 1135, 1145, 1153, 1163, 1172, 1181, 1191, 1199, 1204,
+        1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+        1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+        1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+        1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+        1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1205, 1205, 1205, 1205, 1205,
+        1205, 1207, 1208, 1208, 1210, 1210, 1210, 1210, 1211, 1211, 1212, 1213, 1213, 1213, 1213,
+        1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1218, 1219, 1219, 1219, 1219,
+        1219, 1221, 1221, 1221, 1223, 1224, 1225, 1231, 1240, 1246, 1256, 1262, 1265, 1279, 1291,
+        1298, 1309, 1309, 1317, 1323, 1328, 1334, 1334, 1338, 1338, 1347, 1353, 1362, 1366, 1366,
+        1366, 1371, 1378, 1384, 1390, 1390, 1392, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+        1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+        1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+        1400, 1400, 1400, 1400, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
+        1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
+        1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
+        1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
+        1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
+        1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403,
+        1403, 1403, 1403, 1403, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406,
+        1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1407, 1408, 1408, 1408, 1408, 1410, 1410,
+        1410, 1410, 1411, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+        1415, 1415, 1415, 1415, 1415, 1415, 1415, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+        1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+        1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1419,
+        1419, 1419, 1419, 1422, 1425, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+        1426, 1426, 1426, 1426, 1426, 1426, 1429, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432,
+        1432, 1432, 1432, 1437, 1438, 1439, 1439, 1439, 1441, 1441, 1441, 1441, 1442, 1442, 1443,
+        1443, 1443, 1443, 1443, 1443, 1444, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445,
+        1445, 1445, 1445, 1445, 1445, 1445, 1446, 1450, 1454, 1459, 1459, 1459, 1461, 1461, 1461,
+        1462, 1462, 1463, 1464, 1465, 1466, 1469, 1471, 1473, 1473, 1473, 1474, 1474, 1474, 1474,
+        1474, 1474, 1474, 1474, 1474, 1474
     ];
 
-    const grapheme_cat_table: &'static [(char, char, GraphemeCat)] = &[
+    const grapheme_cat_table: &[(char, char, GraphemeCat)] = &[
         ('\u{0}', '\u{9}', GC_Control), ('\u{a}', '\u{a}', GC_LF), ('\u{b}', '\u{c}', GC_Control),
         ('\u{d}', '\u{d}', GC_CR), ('\u{e}', '\u{1f}', GC_Control), ('\u{7f}', '\u{9f}',
         GC_Control), ('\u{a9}', '\u{a9}', GC_Extended_Pictographic), ('\u{ad}', '\u{ad}',
@@ -490,47 +637,59 @@
         ('\u{7a6}', '\u{7b0}', GC_Extend), ('\u{7eb}', '\u{7f3}', GC_Extend), ('\u{7fd}', '\u{7fd}',
         GC_Extend), ('\u{816}', '\u{819}', GC_Extend), ('\u{81b}', '\u{823}', GC_Extend),
         ('\u{825}', '\u{827}', GC_Extend), ('\u{829}', '\u{82d}', GC_Extend), ('\u{859}', '\u{85b}',
-        GC_Extend), ('\u{890}', '\u{891}', GC_Prepend), ('\u{898}', '\u{89f}', GC_Extend),
+        GC_Extend), ('\u{890}', '\u{891}', GC_Prepend), ('\u{897}', '\u{89f}', GC_Extend),
         ('\u{8ca}', '\u{8e1}', GC_Extend), ('\u{8e2}', '\u{8e2}', GC_Prepend), ('\u{8e3}',
-        '\u{902}', GC_Extend), ('\u{903}', '\u{903}', GC_SpacingMark), ('\u{93a}', '\u{93a}',
-        GC_Extend), ('\u{93b}', '\u{93b}', GC_SpacingMark), ('\u{93c}', '\u{93c}', GC_Extend),
-        ('\u{93e}', '\u{940}', GC_SpacingMark), ('\u{941}', '\u{948}', GC_Extend), ('\u{949}',
-        '\u{94c}', GC_SpacingMark), ('\u{94d}', '\u{94d}', GC_Extend), ('\u{94e}', '\u{94f}',
-        GC_SpacingMark), ('\u{951}', '\u{957}', GC_Extend), ('\u{962}', '\u{963}', GC_Extend),
-        ('\u{981}', '\u{981}', GC_Extend), ('\u{982}', '\u{983}', GC_SpacingMark), ('\u{9bc}',
-        '\u{9bc}', GC_Extend), ('\u{9be}', '\u{9be}', GC_Extend), ('\u{9bf}', '\u{9c0}',
-        GC_SpacingMark), ('\u{9c1}', '\u{9c4}', GC_Extend), ('\u{9c7}', '\u{9c8}', GC_SpacingMark),
-        ('\u{9cb}', '\u{9cc}', GC_SpacingMark), ('\u{9cd}', '\u{9cd}', GC_Extend), ('\u{9d7}',
-        '\u{9d7}', GC_Extend), ('\u{9e2}', '\u{9e3}', GC_Extend), ('\u{9fe}', '\u{9fe}', GC_Extend),
+        '\u{902}', GC_Extend), ('\u{903}', '\u{903}', GC_SpacingMark), ('\u{915}', '\u{939}',
+        GC_InCB_Consonant), ('\u{93a}', '\u{93a}', GC_Extend), ('\u{93b}', '\u{93b}',
+        GC_SpacingMark), ('\u{93c}', '\u{93c}', GC_Extend), ('\u{93e}', '\u{940}', GC_SpacingMark),
+        ('\u{941}', '\u{948}', GC_Extend), ('\u{949}', '\u{94c}', GC_SpacingMark), ('\u{94d}',
+        '\u{94d}', GC_Extend), ('\u{94e}', '\u{94f}', GC_SpacingMark), ('\u{951}', '\u{957}',
+        GC_Extend), ('\u{958}', '\u{95f}', GC_InCB_Consonant), ('\u{962}', '\u{963}', GC_Extend),
+        ('\u{978}', '\u{97f}', GC_InCB_Consonant), ('\u{981}', '\u{981}', GC_Extend), ('\u{982}',
+        '\u{983}', GC_SpacingMark), ('\u{995}', '\u{9a8}', GC_InCB_Consonant), ('\u{9aa}',
+        '\u{9b0}', GC_InCB_Consonant), ('\u{9b2}', '\u{9b2}', GC_InCB_Consonant), ('\u{9b6}',
+        '\u{9b9}', GC_InCB_Consonant), ('\u{9bc}', '\u{9bc}', GC_Extend), ('\u{9be}', '\u{9be}',
+        GC_Extend), ('\u{9bf}', '\u{9c0}', GC_SpacingMark), ('\u{9c1}', '\u{9c4}', GC_Extend),
+        ('\u{9c7}', '\u{9c8}', GC_SpacingMark), ('\u{9cb}', '\u{9cc}', GC_SpacingMark), ('\u{9cd}',
+        '\u{9cd}', GC_Extend), ('\u{9d7}', '\u{9d7}', GC_Extend), ('\u{9dc}', '\u{9dd}',
+        GC_InCB_Consonant), ('\u{9df}', '\u{9df}', GC_InCB_Consonant), ('\u{9e2}', '\u{9e3}',
+        GC_Extend), ('\u{9f0}', '\u{9f1}', GC_InCB_Consonant), ('\u{9fe}', '\u{9fe}', GC_Extend),
         ('\u{a01}', '\u{a02}', GC_Extend), ('\u{a03}', '\u{a03}', GC_SpacingMark), ('\u{a3c}',
         '\u{a3c}', GC_Extend), ('\u{a3e}', '\u{a40}', GC_SpacingMark), ('\u{a41}', '\u{a42}',
         GC_Extend), ('\u{a47}', '\u{a48}', GC_Extend), ('\u{a4b}', '\u{a4d}', GC_Extend),
         ('\u{a51}', '\u{a51}', GC_Extend), ('\u{a70}', '\u{a71}', GC_Extend), ('\u{a75}', '\u{a75}',
         GC_Extend), ('\u{a81}', '\u{a82}', GC_Extend), ('\u{a83}', '\u{a83}', GC_SpacingMark),
+        ('\u{a95}', '\u{aa8}', GC_InCB_Consonant), ('\u{aaa}', '\u{ab0}', GC_InCB_Consonant),
+        ('\u{ab2}', '\u{ab3}', GC_InCB_Consonant), ('\u{ab5}', '\u{ab9}', GC_InCB_Consonant),
         ('\u{abc}', '\u{abc}', GC_Extend), ('\u{abe}', '\u{ac0}', GC_SpacingMark), ('\u{ac1}',
         '\u{ac5}', GC_Extend), ('\u{ac7}', '\u{ac8}', GC_Extend), ('\u{ac9}', '\u{ac9}',
         GC_SpacingMark), ('\u{acb}', '\u{acc}', GC_SpacingMark), ('\u{acd}', '\u{acd}', GC_Extend),
-        ('\u{ae2}', '\u{ae3}', GC_Extend), ('\u{afa}', '\u{aff}', GC_Extend), ('\u{b01}', '\u{b01}',
-        GC_Extend), ('\u{b02}', '\u{b03}', GC_SpacingMark), ('\u{b3c}', '\u{b3c}', GC_Extend),
-        ('\u{b3e}', '\u{b3f}', GC_Extend), ('\u{b40}', '\u{b40}', GC_SpacingMark), ('\u{b41}',
-        '\u{b44}', GC_Extend), ('\u{b47}', '\u{b48}', GC_SpacingMark), ('\u{b4b}', '\u{b4c}',
-        GC_SpacingMark), ('\u{b4d}', '\u{b4d}', GC_Extend), ('\u{b55}', '\u{b57}', GC_Extend),
-        ('\u{b62}', '\u{b63}', GC_Extend), ('\u{b82}', '\u{b82}', GC_Extend), ('\u{bbe}', '\u{bbe}',
+        ('\u{ae2}', '\u{ae3}', GC_Extend), ('\u{af9}', '\u{af9}', GC_InCB_Consonant), ('\u{afa}',
+        '\u{aff}', GC_Extend), ('\u{b01}', '\u{b01}', GC_Extend), ('\u{b02}', '\u{b03}',
+        GC_SpacingMark), ('\u{b15}', '\u{b28}', GC_InCB_Consonant), ('\u{b2a}', '\u{b30}',
+        GC_InCB_Consonant), ('\u{b32}', '\u{b33}', GC_InCB_Consonant), ('\u{b35}', '\u{b39}',
+        GC_InCB_Consonant), ('\u{b3c}', '\u{b3c}', GC_Extend), ('\u{b3e}', '\u{b3f}', GC_Extend),
+        ('\u{b40}', '\u{b40}', GC_SpacingMark), ('\u{b41}', '\u{b44}', GC_Extend), ('\u{b47}',
+        '\u{b48}', GC_SpacingMark), ('\u{b4b}', '\u{b4c}', GC_SpacingMark), ('\u{b4d}', '\u{b4d}',
+        GC_Extend), ('\u{b55}', '\u{b57}', GC_Extend), ('\u{b5c}', '\u{b5d}', GC_InCB_Consonant),
+        ('\u{b5f}', '\u{b5f}', GC_InCB_Consonant), ('\u{b62}', '\u{b63}', GC_Extend), ('\u{b71}',
+        '\u{b71}', GC_InCB_Consonant), ('\u{b82}', '\u{b82}', GC_Extend), ('\u{bbe}', '\u{bbe}',
         GC_Extend), ('\u{bbf}', '\u{bbf}', GC_SpacingMark), ('\u{bc0}', '\u{bc0}', GC_Extend),
         ('\u{bc1}', '\u{bc2}', GC_SpacingMark), ('\u{bc6}', '\u{bc8}', GC_SpacingMark), ('\u{bca}',
         '\u{bcc}', GC_SpacingMark), ('\u{bcd}', '\u{bcd}', GC_Extend), ('\u{bd7}', '\u{bd7}',
         GC_Extend), ('\u{c00}', '\u{c00}', GC_Extend), ('\u{c01}', '\u{c03}', GC_SpacingMark),
-        ('\u{c04}', '\u{c04}', GC_Extend), ('\u{c3c}', '\u{c3c}', GC_Extend), ('\u{c3e}', '\u{c40}',
+        ('\u{c04}', '\u{c04}', GC_Extend), ('\u{c15}', '\u{c28}', GC_InCB_Consonant), ('\u{c2a}',
+        '\u{c39}', GC_InCB_Consonant), ('\u{c3c}', '\u{c3c}', GC_Extend), ('\u{c3e}', '\u{c40}',
         GC_Extend), ('\u{c41}', '\u{c44}', GC_SpacingMark), ('\u{c46}', '\u{c48}', GC_Extend),
-        ('\u{c4a}', '\u{c4d}', GC_Extend), ('\u{c55}', '\u{c56}', GC_Extend), ('\u{c62}', '\u{c63}',
-        GC_Extend), ('\u{c81}', '\u{c81}', GC_Extend), ('\u{c82}', '\u{c83}', GC_SpacingMark),
-        ('\u{cbc}', '\u{cbc}', GC_Extend), ('\u{cbe}', '\u{cbe}', GC_SpacingMark), ('\u{cbf}',
-        '\u{cbf}', GC_Extend), ('\u{cc0}', '\u{cc1}', GC_SpacingMark), ('\u{cc2}', '\u{cc2}',
-        GC_Extend), ('\u{cc3}', '\u{cc4}', GC_SpacingMark), ('\u{cc6}', '\u{cc6}', GC_Extend),
-        ('\u{cc7}', '\u{cc8}', GC_SpacingMark), ('\u{cca}', '\u{ccb}', GC_SpacingMark), ('\u{ccc}',
-        '\u{ccd}', GC_Extend), ('\u{cd5}', '\u{cd6}', GC_Extend), ('\u{ce2}', '\u{ce3}', GC_Extend),
-        ('\u{cf3}', '\u{cf3}', GC_SpacingMark), ('\u{d00}', '\u{d01}', GC_Extend), ('\u{d02}',
-        '\u{d03}', GC_SpacingMark), ('\u{d3b}', '\u{d3c}', GC_Extend), ('\u{d3e}', '\u{d3e}',
+        ('\u{c4a}', '\u{c4d}', GC_Extend), ('\u{c55}', '\u{c56}', GC_Extend), ('\u{c58}', '\u{c5a}',
+        GC_InCB_Consonant), ('\u{c62}', '\u{c63}', GC_Extend), ('\u{c81}', '\u{c81}', GC_Extend),
+        ('\u{c82}', '\u{c83}', GC_SpacingMark), ('\u{cbc}', '\u{cbc}', GC_Extend), ('\u{cbe}',
+        '\u{cbe}', GC_SpacingMark), ('\u{cbf}', '\u{cc0}', GC_Extend), ('\u{cc1}', '\u{cc1}',
+        GC_SpacingMark), ('\u{cc2}', '\u{cc2}', GC_Extend), ('\u{cc3}', '\u{cc4}', GC_SpacingMark),
+        ('\u{cc6}', '\u{cc8}', GC_Extend), ('\u{cca}', '\u{ccd}', GC_Extend), ('\u{cd5}', '\u{cd6}',
+        GC_Extend), ('\u{ce2}', '\u{ce3}', GC_Extend), ('\u{cf3}', '\u{cf3}', GC_SpacingMark),
+        ('\u{d00}', '\u{d01}', GC_Extend), ('\u{d02}', '\u{d03}', GC_SpacingMark), ('\u{d15}',
+        '\u{d3a}', GC_InCB_Consonant), ('\u{d3b}', '\u{d3c}', GC_Extend), ('\u{d3e}', '\u{d3e}',
         GC_Extend), ('\u{d3f}', '\u{d40}', GC_SpacingMark), ('\u{d41}', '\u{d44}', GC_Extend),
         ('\u{d46}', '\u{d48}', GC_SpacingMark), ('\u{d4a}', '\u{d4c}', GC_SpacingMark), ('\u{d4d}',
         '\u{d4d}', GC_Extend), ('\u{d4e}', '\u{d4e}', GC_Prepend), ('\u{d57}', '\u{d57}',
@@ -555,16 +714,15 @@
         '\u{1084}', GC_SpacingMark), ('\u{1085}', '\u{1086}', GC_Extend), ('\u{108d}', '\u{108d}',
         GC_Extend), ('\u{109d}', '\u{109d}', GC_Extend), ('\u{1100}', '\u{115f}', GC_L),
         ('\u{1160}', '\u{11a7}', GC_V), ('\u{11a8}', '\u{11ff}', GC_T), ('\u{135d}', '\u{135f}',
-        GC_Extend), ('\u{1712}', '\u{1714}', GC_Extend), ('\u{1715}', '\u{1715}', GC_SpacingMark),
-        ('\u{1732}', '\u{1733}', GC_Extend), ('\u{1734}', '\u{1734}', GC_SpacingMark), ('\u{1752}',
-        '\u{1753}', GC_Extend), ('\u{1772}', '\u{1773}', GC_Extend), ('\u{17b4}', '\u{17b5}',
-        GC_Extend), ('\u{17b6}', '\u{17b6}', GC_SpacingMark), ('\u{17b7}', '\u{17bd}', GC_Extend),
-        ('\u{17be}', '\u{17c5}', GC_SpacingMark), ('\u{17c6}', '\u{17c6}', GC_Extend), ('\u{17c7}',
-        '\u{17c8}', GC_SpacingMark), ('\u{17c9}', '\u{17d3}', GC_Extend), ('\u{17dd}', '\u{17dd}',
-        GC_Extend), ('\u{180b}', '\u{180d}', GC_Extend), ('\u{180e}', '\u{180e}', GC_Control),
-        ('\u{180f}', '\u{180f}', GC_Extend), ('\u{1885}', '\u{1886}', GC_Extend), ('\u{18a9}',
-        '\u{18a9}', GC_Extend), ('\u{1920}', '\u{1922}', GC_Extend), ('\u{1923}', '\u{1926}',
-        GC_SpacingMark), ('\u{1927}', '\u{1928}', GC_Extend), ('\u{1929}', '\u{192b}',
+        GC_Extend), ('\u{1712}', '\u{1715}', GC_Extend), ('\u{1732}', '\u{1734}', GC_Extend),
+        ('\u{1752}', '\u{1753}', GC_Extend), ('\u{1772}', '\u{1773}', GC_Extend), ('\u{17b4}',
+        '\u{17b5}', GC_Extend), ('\u{17b6}', '\u{17b6}', GC_SpacingMark), ('\u{17b7}', '\u{17bd}',
+        GC_Extend), ('\u{17be}', '\u{17c5}', GC_SpacingMark), ('\u{17c6}', '\u{17c6}', GC_Extend),
+        ('\u{17c7}', '\u{17c8}', GC_SpacingMark), ('\u{17c9}', '\u{17d3}', GC_Extend), ('\u{17dd}',
+        '\u{17dd}', GC_Extend), ('\u{180b}', '\u{180d}', GC_Extend), ('\u{180e}', '\u{180e}',
+        GC_Control), ('\u{180f}', '\u{180f}', GC_Extend), ('\u{1885}', '\u{1886}', GC_Extend),
+        ('\u{18a9}', '\u{18a9}', GC_Extend), ('\u{1920}', '\u{1922}', GC_Extend), ('\u{1923}',
+        '\u{1926}', GC_SpacingMark), ('\u{1927}', '\u{1928}', GC_Extend), ('\u{1929}', '\u{192b}',
         GC_SpacingMark), ('\u{1930}', '\u{1931}', GC_SpacingMark), ('\u{1932}', '\u{1932}',
         GC_Extend), ('\u{1933}', '\u{1938}', GC_SpacingMark), ('\u{1939}', '\u{193b}', GC_Extend),
         ('\u{1a17}', '\u{1a18}', GC_Extend), ('\u{1a19}', '\u{1a1a}', GC_SpacingMark), ('\u{1a1b}',
@@ -574,415 +732,419 @@
         '\u{1a6c}', GC_Extend), ('\u{1a6d}', '\u{1a72}', GC_SpacingMark), ('\u{1a73}', '\u{1a7c}',
         GC_Extend), ('\u{1a7f}', '\u{1a7f}', GC_Extend), ('\u{1ab0}', '\u{1ace}', GC_Extend),
         ('\u{1b00}', '\u{1b03}', GC_Extend), ('\u{1b04}', '\u{1b04}', GC_SpacingMark), ('\u{1b34}',
-        '\u{1b3a}', GC_Extend), ('\u{1b3b}', '\u{1b3b}', GC_SpacingMark), ('\u{1b3c}', '\u{1b3c}',
-        GC_Extend), ('\u{1b3d}', '\u{1b41}', GC_SpacingMark), ('\u{1b42}', '\u{1b42}', GC_Extend),
-        ('\u{1b43}', '\u{1b44}', GC_SpacingMark), ('\u{1b6b}', '\u{1b73}', GC_Extend), ('\u{1b80}',
-        '\u{1b81}', GC_Extend), ('\u{1b82}', '\u{1b82}', GC_SpacingMark), ('\u{1ba1}', '\u{1ba1}',
-        GC_SpacingMark), ('\u{1ba2}', '\u{1ba5}', GC_Extend), ('\u{1ba6}', '\u{1ba7}',
-        GC_SpacingMark), ('\u{1ba8}', '\u{1ba9}', GC_Extend), ('\u{1baa}', '\u{1baa}',
-        GC_SpacingMark), ('\u{1bab}', '\u{1bad}', GC_Extend), ('\u{1be6}', '\u{1be6}', GC_Extend),
-        ('\u{1be7}', '\u{1be7}', GC_SpacingMark), ('\u{1be8}', '\u{1be9}', GC_Extend), ('\u{1bea}',
-        '\u{1bec}', GC_SpacingMark), ('\u{1bed}', '\u{1bed}', GC_Extend), ('\u{1bee}', '\u{1bee}',
-        GC_SpacingMark), ('\u{1bef}', '\u{1bf1}', GC_Extend), ('\u{1bf2}', '\u{1bf3}',
-        GC_SpacingMark), ('\u{1c24}', '\u{1c2b}', GC_SpacingMark), ('\u{1c2c}', '\u{1c33}',
-        GC_Extend), ('\u{1c34}', '\u{1c35}', GC_SpacingMark), ('\u{1c36}', '\u{1c37}', GC_Extend),
-        ('\u{1cd0}', '\u{1cd2}', GC_Extend), ('\u{1cd4}', '\u{1ce0}', GC_Extend), ('\u{1ce1}',
-        '\u{1ce1}', GC_SpacingMark), ('\u{1ce2}', '\u{1ce8}', GC_Extend), ('\u{1ced}', '\u{1ced}',
-        GC_Extend), ('\u{1cf4}', '\u{1cf4}', GC_Extend), ('\u{1cf7}', '\u{1cf7}', GC_SpacingMark),
-        ('\u{1cf8}', '\u{1cf9}', GC_Extend), ('\u{1dc0}', '\u{1dff}', GC_Extend), ('\u{200b}',
-        '\u{200b}', GC_Control), ('\u{200c}', '\u{200c}', GC_Extend), ('\u{200d}', '\u{200d}',
-        GC_ZWJ), ('\u{200e}', '\u{200f}', GC_Control), ('\u{2028}', '\u{202e}', GC_Control),
-        ('\u{203c}', '\u{203c}', GC_Extended_Pictographic), ('\u{2049}', '\u{2049}',
-        GC_Extended_Pictographic), ('\u{2060}', '\u{206f}', GC_Control), ('\u{20d0}', '\u{20f0}',
-        GC_Extend), ('\u{2122}', '\u{2122}', GC_Extended_Pictographic), ('\u{2139}', '\u{2139}',
-        GC_Extended_Pictographic), ('\u{2194}', '\u{2199}', GC_Extended_Pictographic), ('\u{21a9}',
-        '\u{21aa}', GC_Extended_Pictographic), ('\u{231a}', '\u{231b}', GC_Extended_Pictographic),
-        ('\u{2328}', '\u{2328}', GC_Extended_Pictographic), ('\u{2388}', '\u{2388}',
-        GC_Extended_Pictographic), ('\u{23cf}', '\u{23cf}', GC_Extended_Pictographic), ('\u{23e9}',
-        '\u{23f3}', GC_Extended_Pictographic), ('\u{23f8}', '\u{23fa}', GC_Extended_Pictographic),
-        ('\u{24c2}', '\u{24c2}', GC_Extended_Pictographic), ('\u{25aa}', '\u{25ab}',
-        GC_Extended_Pictographic), ('\u{25b6}', '\u{25b6}', GC_Extended_Pictographic), ('\u{25c0}',
-        '\u{25c0}', GC_Extended_Pictographic), ('\u{25fb}', '\u{25fe}', GC_Extended_Pictographic),
-        ('\u{2600}', '\u{2605}', GC_Extended_Pictographic), ('\u{2607}', '\u{2612}',
-        GC_Extended_Pictographic), ('\u{2614}', '\u{2685}', GC_Extended_Pictographic), ('\u{2690}',
-        '\u{2705}', GC_Extended_Pictographic), ('\u{2708}', '\u{2712}', GC_Extended_Pictographic),
-        ('\u{2714}', '\u{2714}', GC_Extended_Pictographic), ('\u{2716}', '\u{2716}',
-        GC_Extended_Pictographic), ('\u{271d}', '\u{271d}', GC_Extended_Pictographic), ('\u{2721}',
-        '\u{2721}', GC_Extended_Pictographic), ('\u{2728}', '\u{2728}', GC_Extended_Pictographic),
-        ('\u{2733}', '\u{2734}', GC_Extended_Pictographic), ('\u{2744}', '\u{2744}',
-        GC_Extended_Pictographic), ('\u{2747}', '\u{2747}', GC_Extended_Pictographic), ('\u{274c}',
-        '\u{274c}', GC_Extended_Pictographic), ('\u{274e}', '\u{274e}', GC_Extended_Pictographic),
-        ('\u{2753}', '\u{2755}', GC_Extended_Pictographic), ('\u{2757}', '\u{2757}',
-        GC_Extended_Pictographic), ('\u{2763}', '\u{2767}', GC_Extended_Pictographic), ('\u{2795}',
-        '\u{2797}', GC_Extended_Pictographic), ('\u{27a1}', '\u{27a1}', GC_Extended_Pictographic),
-        ('\u{27b0}', '\u{27b0}', GC_Extended_Pictographic), ('\u{27bf}', '\u{27bf}',
-        GC_Extended_Pictographic), ('\u{2934}', '\u{2935}', GC_Extended_Pictographic), ('\u{2b05}',
-        '\u{2b07}', GC_Extended_Pictographic), ('\u{2b1b}', '\u{2b1c}', GC_Extended_Pictographic),
-        ('\u{2b50}', '\u{2b50}', GC_Extended_Pictographic), ('\u{2b55}', '\u{2b55}',
-        GC_Extended_Pictographic), ('\u{2cef}', '\u{2cf1}', GC_Extend), ('\u{2d7f}', '\u{2d7f}',
-        GC_Extend), ('\u{2de0}', '\u{2dff}', GC_Extend), ('\u{302a}', '\u{302f}', GC_Extend),
-        ('\u{3030}', '\u{3030}', GC_Extended_Pictographic), ('\u{303d}', '\u{303d}',
-        GC_Extended_Pictographic), ('\u{3099}', '\u{309a}', GC_Extend), ('\u{3297}', '\u{3297}',
-        GC_Extended_Pictographic), ('\u{3299}', '\u{3299}', GC_Extended_Pictographic), ('\u{a66f}',
-        '\u{a672}', GC_Extend), ('\u{a674}', '\u{a67d}', GC_Extend), ('\u{a69e}', '\u{a69f}',
-        GC_Extend), ('\u{a6f0}', '\u{a6f1}', GC_Extend), ('\u{a802}', '\u{a802}', GC_Extend),
-        ('\u{a806}', '\u{a806}', GC_Extend), ('\u{a80b}', '\u{a80b}', GC_Extend), ('\u{a823}',
-        '\u{a824}', GC_SpacingMark), ('\u{a825}', '\u{a826}', GC_Extend), ('\u{a827}', '\u{a827}',
-        GC_SpacingMark), ('\u{a82c}', '\u{a82c}', GC_Extend), ('\u{a880}', '\u{a881}',
-        GC_SpacingMark), ('\u{a8b4}', '\u{a8c3}', GC_SpacingMark), ('\u{a8c4}', '\u{a8c5}',
-        GC_Extend), ('\u{a8e0}', '\u{a8f1}', GC_Extend), ('\u{a8ff}', '\u{a8ff}', GC_Extend),
-        ('\u{a926}', '\u{a92d}', GC_Extend), ('\u{a947}', '\u{a951}', GC_Extend), ('\u{a952}',
-        '\u{a953}', GC_SpacingMark), ('\u{a960}', '\u{a97c}', GC_L), ('\u{a980}', '\u{a982}',
-        GC_Extend), ('\u{a983}', '\u{a983}', GC_SpacingMark), ('\u{a9b3}', '\u{a9b3}', GC_Extend),
-        ('\u{a9b4}', '\u{a9b5}', GC_SpacingMark), ('\u{a9b6}', '\u{a9b9}', GC_Extend), ('\u{a9ba}',
-        '\u{a9bb}', GC_SpacingMark), ('\u{a9bc}', '\u{a9bd}', GC_Extend), ('\u{a9be}', '\u{a9c0}',
-        GC_SpacingMark), ('\u{a9e5}', '\u{a9e5}', GC_Extend), ('\u{aa29}', '\u{aa2e}', GC_Extend),
-        ('\u{aa2f}', '\u{aa30}', GC_SpacingMark), ('\u{aa31}', '\u{aa32}', GC_Extend), ('\u{aa33}',
-        '\u{aa34}', GC_SpacingMark), ('\u{aa35}', '\u{aa36}', GC_Extend), ('\u{aa43}', '\u{aa43}',
-        GC_Extend), ('\u{aa4c}', '\u{aa4c}', GC_Extend), ('\u{aa4d}', '\u{aa4d}', GC_SpacingMark),
-        ('\u{aa7c}', '\u{aa7c}', GC_Extend), ('\u{aab0}', '\u{aab0}', GC_Extend), ('\u{aab2}',
-        '\u{aab4}', GC_Extend), ('\u{aab7}', '\u{aab8}', GC_Extend), ('\u{aabe}', '\u{aabf}',
-        GC_Extend), ('\u{aac1}', '\u{aac1}', GC_Extend), ('\u{aaeb}', '\u{aaeb}', GC_SpacingMark),
-        ('\u{aaec}', '\u{aaed}', GC_Extend), ('\u{aaee}', '\u{aaef}', GC_SpacingMark), ('\u{aaf5}',
-        '\u{aaf5}', GC_SpacingMark), ('\u{aaf6}', '\u{aaf6}', GC_Extend), ('\u{abe3}', '\u{abe4}',
-        GC_SpacingMark), ('\u{abe5}', '\u{abe5}', GC_Extend), ('\u{abe6}', '\u{abe7}',
-        GC_SpacingMark), ('\u{abe8}', '\u{abe8}', GC_Extend), ('\u{abe9}', '\u{abea}',
-        GC_SpacingMark), ('\u{abec}', '\u{abec}', GC_SpacingMark), ('\u{abed}', '\u{abed}',
-        GC_Extend), ('\u{ac00}', '\u{ac00}', GC_LV), ('\u{ac01}', '\u{ac1b}', GC_LVT), ('\u{ac1c}',
-        '\u{ac1c}', GC_LV), ('\u{ac1d}', '\u{ac37}', GC_LVT), ('\u{ac38}', '\u{ac38}', GC_LV),
-        ('\u{ac39}', '\u{ac53}', GC_LVT), ('\u{ac54}', '\u{ac54}', GC_LV), ('\u{ac55}', '\u{ac6f}',
-        GC_LVT), ('\u{ac70}', '\u{ac70}', GC_LV), ('\u{ac71}', '\u{ac8b}', GC_LVT), ('\u{ac8c}',
-        '\u{ac8c}', GC_LV), ('\u{ac8d}', '\u{aca7}', GC_LVT), ('\u{aca8}', '\u{aca8}', GC_LV),
-        ('\u{aca9}', '\u{acc3}', GC_LVT), ('\u{acc4}', '\u{acc4}', GC_LV), ('\u{acc5}', '\u{acdf}',
-        GC_LVT), ('\u{ace0}', '\u{ace0}', GC_LV), ('\u{ace1}', '\u{acfb}', GC_LVT), ('\u{acfc}',
-        '\u{acfc}', GC_LV), ('\u{acfd}', '\u{ad17}', GC_LVT), ('\u{ad18}', '\u{ad18}', GC_LV),
-        ('\u{ad19}', '\u{ad33}', GC_LVT), ('\u{ad34}', '\u{ad34}', GC_LV), ('\u{ad35}', '\u{ad4f}',
-        GC_LVT), ('\u{ad50}', '\u{ad50}', GC_LV), ('\u{ad51}', '\u{ad6b}', GC_LVT), ('\u{ad6c}',
-        '\u{ad6c}', GC_LV), ('\u{ad6d}', '\u{ad87}', GC_LVT), ('\u{ad88}', '\u{ad88}', GC_LV),
-        ('\u{ad89}', '\u{ada3}', GC_LVT), ('\u{ada4}', '\u{ada4}', GC_LV), ('\u{ada5}', '\u{adbf}',
-        GC_LVT), ('\u{adc0}', '\u{adc0}', GC_LV), ('\u{adc1}', '\u{addb}', GC_LVT), ('\u{addc}',
-        '\u{addc}', GC_LV), ('\u{addd}', '\u{adf7}', GC_LVT), ('\u{adf8}', '\u{adf8}', GC_LV),
-        ('\u{adf9}', '\u{ae13}', GC_LVT), ('\u{ae14}', '\u{ae14}', GC_LV), ('\u{ae15}', '\u{ae2f}',
-        GC_LVT), ('\u{ae30}', '\u{ae30}', GC_LV), ('\u{ae31}', '\u{ae4b}', GC_LVT), ('\u{ae4c}',
-        '\u{ae4c}', GC_LV), ('\u{ae4d}', '\u{ae67}', GC_LVT), ('\u{ae68}', '\u{ae68}', GC_LV),
-        ('\u{ae69}', '\u{ae83}', GC_LVT), ('\u{ae84}', '\u{ae84}', GC_LV), ('\u{ae85}', '\u{ae9f}',
-        GC_LVT), ('\u{aea0}', '\u{aea0}', GC_LV), ('\u{aea1}', '\u{aebb}', GC_LVT), ('\u{aebc}',
-        '\u{aebc}', GC_LV), ('\u{aebd}', '\u{aed7}', GC_LVT), ('\u{aed8}', '\u{aed8}', GC_LV),
-        ('\u{aed9}', '\u{aef3}', GC_LVT), ('\u{aef4}', '\u{aef4}', GC_LV), ('\u{aef5}', '\u{af0f}',
-        GC_LVT), ('\u{af10}', '\u{af10}', GC_LV), ('\u{af11}', '\u{af2b}', GC_LVT), ('\u{af2c}',
-        '\u{af2c}', GC_LV), ('\u{af2d}', '\u{af47}', GC_LVT), ('\u{af48}', '\u{af48}', GC_LV),
-        ('\u{af49}', '\u{af63}', GC_LVT), ('\u{af64}', '\u{af64}', GC_LV), ('\u{af65}', '\u{af7f}',
-        GC_LVT), ('\u{af80}', '\u{af80}', GC_LV), ('\u{af81}', '\u{af9b}', GC_LVT), ('\u{af9c}',
-        '\u{af9c}', GC_LV), ('\u{af9d}', '\u{afb7}', GC_LVT), ('\u{afb8}', '\u{afb8}', GC_LV),
-        ('\u{afb9}', '\u{afd3}', GC_LVT), ('\u{afd4}', '\u{afd4}', GC_LV), ('\u{afd5}', '\u{afef}',
-        GC_LVT), ('\u{aff0}', '\u{aff0}', GC_LV), ('\u{aff1}', '\u{b00b}', GC_LVT), ('\u{b00c}',
-        '\u{b00c}', GC_LV), ('\u{b00d}', '\u{b027}', GC_LVT), ('\u{b028}', '\u{b028}', GC_LV),
-        ('\u{b029}', '\u{b043}', GC_LVT), ('\u{b044}', '\u{b044}', GC_LV), ('\u{b045}', '\u{b05f}',
-        GC_LVT), ('\u{b060}', '\u{b060}', GC_LV), ('\u{b061}', '\u{b07b}', GC_LVT), ('\u{b07c}',
-        '\u{b07c}', GC_LV), ('\u{b07d}', '\u{b097}', GC_LVT), ('\u{b098}', '\u{b098}', GC_LV),
-        ('\u{b099}', '\u{b0b3}', GC_LVT), ('\u{b0b4}', '\u{b0b4}', GC_LV), ('\u{b0b5}', '\u{b0cf}',
-        GC_LVT), ('\u{b0d0}', '\u{b0d0}', GC_LV), ('\u{b0d1}', '\u{b0eb}', GC_LVT), ('\u{b0ec}',
-        '\u{b0ec}', GC_LV), ('\u{b0ed}', '\u{b107}', GC_LVT), ('\u{b108}', '\u{b108}', GC_LV),
-        ('\u{b109}', '\u{b123}', GC_LVT), ('\u{b124}', '\u{b124}', GC_LV), ('\u{b125}', '\u{b13f}',
-        GC_LVT), ('\u{b140}', '\u{b140}', GC_LV), ('\u{b141}', '\u{b15b}', GC_LVT), ('\u{b15c}',
-        '\u{b15c}', GC_LV), ('\u{b15d}', '\u{b177}', GC_LVT), ('\u{b178}', '\u{b178}', GC_LV),
-        ('\u{b179}', '\u{b193}', GC_LVT), ('\u{b194}', '\u{b194}', GC_LV), ('\u{b195}', '\u{b1af}',
-        GC_LVT), ('\u{b1b0}', '\u{b1b0}', GC_LV), ('\u{b1b1}', '\u{b1cb}', GC_LVT), ('\u{b1cc}',
-        '\u{b1cc}', GC_LV), ('\u{b1cd}', '\u{b1e7}', GC_LVT), ('\u{b1e8}', '\u{b1e8}', GC_LV),
-        ('\u{b1e9}', '\u{b203}', GC_LVT), ('\u{b204}', '\u{b204}', GC_LV), ('\u{b205}', '\u{b21f}',
-        GC_LVT), ('\u{b220}', '\u{b220}', GC_LV), ('\u{b221}', '\u{b23b}', GC_LVT), ('\u{b23c}',
-        '\u{b23c}', GC_LV), ('\u{b23d}', '\u{b257}', GC_LVT), ('\u{b258}', '\u{b258}', GC_LV),
-        ('\u{b259}', '\u{b273}', GC_LVT), ('\u{b274}', '\u{b274}', GC_LV), ('\u{b275}', '\u{b28f}',
-        GC_LVT), ('\u{b290}', '\u{b290}', GC_LV), ('\u{b291}', '\u{b2ab}', GC_LVT), ('\u{b2ac}',
-        '\u{b2ac}', GC_LV), ('\u{b2ad}', '\u{b2c7}', GC_LVT), ('\u{b2c8}', '\u{b2c8}', GC_LV),
-        ('\u{b2c9}', '\u{b2e3}', GC_LVT), ('\u{b2e4}', '\u{b2e4}', GC_LV), ('\u{b2e5}', '\u{b2ff}',
-        GC_LVT), ('\u{b300}', '\u{b300}', GC_LV), ('\u{b301}', '\u{b31b}', GC_LVT), ('\u{b31c}',
-        '\u{b31c}', GC_LV), ('\u{b31d}', '\u{b337}', GC_LVT), ('\u{b338}', '\u{b338}', GC_LV),
-        ('\u{b339}', '\u{b353}', GC_LVT), ('\u{b354}', '\u{b354}', GC_LV), ('\u{b355}', '\u{b36f}',
-        GC_LVT), ('\u{b370}', '\u{b370}', GC_LV), ('\u{b371}', '\u{b38b}', GC_LVT), ('\u{b38c}',
-        '\u{b38c}', GC_LV), ('\u{b38d}', '\u{b3a7}', GC_LVT), ('\u{b3a8}', '\u{b3a8}', GC_LV),
-        ('\u{b3a9}', '\u{b3c3}', GC_LVT), ('\u{b3c4}', '\u{b3c4}', GC_LV), ('\u{b3c5}', '\u{b3df}',
-        GC_LVT), ('\u{b3e0}', '\u{b3e0}', GC_LV), ('\u{b3e1}', '\u{b3fb}', GC_LVT), ('\u{b3fc}',
-        '\u{b3fc}', GC_LV), ('\u{b3fd}', '\u{b417}', GC_LVT), ('\u{b418}', '\u{b418}', GC_LV),
-        ('\u{b419}', '\u{b433}', GC_LVT), ('\u{b434}', '\u{b434}', GC_LV), ('\u{b435}', '\u{b44f}',
-        GC_LVT), ('\u{b450}', '\u{b450}', GC_LV), ('\u{b451}', '\u{b46b}', GC_LVT), ('\u{b46c}',
-        '\u{b46c}', GC_LV), ('\u{b46d}', '\u{b487}', GC_LVT), ('\u{b488}', '\u{b488}', GC_LV),
-        ('\u{b489}', '\u{b4a3}', GC_LVT), ('\u{b4a4}', '\u{b4a4}', GC_LV), ('\u{b4a5}', '\u{b4bf}',
-        GC_LVT), ('\u{b4c0}', '\u{b4c0}', GC_LV), ('\u{b4c1}', '\u{b4db}', GC_LVT), ('\u{b4dc}',
-        '\u{b4dc}', GC_LV), ('\u{b4dd}', '\u{b4f7}', GC_LVT), ('\u{b4f8}', '\u{b4f8}', GC_LV),
-        ('\u{b4f9}', '\u{b513}', GC_LVT), ('\u{b514}', '\u{b514}', GC_LV), ('\u{b515}', '\u{b52f}',
-        GC_LVT), ('\u{b530}', '\u{b530}', GC_LV), ('\u{b531}', '\u{b54b}', GC_LVT), ('\u{b54c}',
-        '\u{b54c}', GC_LV), ('\u{b54d}', '\u{b567}', GC_LVT), ('\u{b568}', '\u{b568}', GC_LV),
-        ('\u{b569}', '\u{b583}', GC_LVT), ('\u{b584}', '\u{b584}', GC_LV), ('\u{b585}', '\u{b59f}',
-        GC_LVT), ('\u{b5a0}', '\u{b5a0}', GC_LV), ('\u{b5a1}', '\u{b5bb}', GC_LVT), ('\u{b5bc}',
-        '\u{b5bc}', GC_LV), ('\u{b5bd}', '\u{b5d7}', GC_LVT), ('\u{b5d8}', '\u{b5d8}', GC_LV),
-        ('\u{b5d9}', '\u{b5f3}', GC_LVT), ('\u{b5f4}', '\u{b5f4}', GC_LV), ('\u{b5f5}', '\u{b60f}',
-        GC_LVT), ('\u{b610}', '\u{b610}', GC_LV), ('\u{b611}', '\u{b62b}', GC_LVT), ('\u{b62c}',
-        '\u{b62c}', GC_LV), ('\u{b62d}', '\u{b647}', GC_LVT), ('\u{b648}', '\u{b648}', GC_LV),
-        ('\u{b649}', '\u{b663}', GC_LVT), ('\u{b664}', '\u{b664}', GC_LV), ('\u{b665}', '\u{b67f}',
-        GC_LVT), ('\u{b680}', '\u{b680}', GC_LV), ('\u{b681}', '\u{b69b}', GC_LVT), ('\u{b69c}',
-        '\u{b69c}', GC_LV), ('\u{b69d}', '\u{b6b7}', GC_LVT), ('\u{b6b8}', '\u{b6b8}', GC_LV),
-        ('\u{b6b9}', '\u{b6d3}', GC_LVT), ('\u{b6d4}', '\u{b6d4}', GC_LV), ('\u{b6d5}', '\u{b6ef}',
-        GC_LVT), ('\u{b6f0}', '\u{b6f0}', GC_LV), ('\u{b6f1}', '\u{b70b}', GC_LVT), ('\u{b70c}',
-        '\u{b70c}', GC_LV), ('\u{b70d}', '\u{b727}', GC_LVT), ('\u{b728}', '\u{b728}', GC_LV),
-        ('\u{b729}', '\u{b743}', GC_LVT), ('\u{b744}', '\u{b744}', GC_LV), ('\u{b745}', '\u{b75f}',
-        GC_LVT), ('\u{b760}', '\u{b760}', GC_LV), ('\u{b761}', '\u{b77b}', GC_LVT), ('\u{b77c}',
-        '\u{b77c}', GC_LV), ('\u{b77d}', '\u{b797}', GC_LVT), ('\u{b798}', '\u{b798}', GC_LV),
-        ('\u{b799}', '\u{b7b3}', GC_LVT), ('\u{b7b4}', '\u{b7b4}', GC_LV), ('\u{b7b5}', '\u{b7cf}',
-        GC_LVT), ('\u{b7d0}', '\u{b7d0}', GC_LV), ('\u{b7d1}', '\u{b7eb}', GC_LVT), ('\u{b7ec}',
-        '\u{b7ec}', GC_LV), ('\u{b7ed}', '\u{b807}', GC_LVT), ('\u{b808}', '\u{b808}', GC_LV),
-        ('\u{b809}', '\u{b823}', GC_LVT), ('\u{b824}', '\u{b824}', GC_LV), ('\u{b825}', '\u{b83f}',
-        GC_LVT), ('\u{b840}', '\u{b840}', GC_LV), ('\u{b841}', '\u{b85b}', GC_LVT), ('\u{b85c}',
-        '\u{b85c}', GC_LV), ('\u{b85d}', '\u{b877}', GC_LVT), ('\u{b878}', '\u{b878}', GC_LV),
-        ('\u{b879}', '\u{b893}', GC_LVT), ('\u{b894}', '\u{b894}', GC_LV), ('\u{b895}', '\u{b8af}',
-        GC_LVT), ('\u{b8b0}', '\u{b8b0}', GC_LV), ('\u{b8b1}', '\u{b8cb}', GC_LVT), ('\u{b8cc}',
-        '\u{b8cc}', GC_LV), ('\u{b8cd}', '\u{b8e7}', GC_LVT), ('\u{b8e8}', '\u{b8e8}', GC_LV),
-        ('\u{b8e9}', '\u{b903}', GC_LVT), ('\u{b904}', '\u{b904}', GC_LV), ('\u{b905}', '\u{b91f}',
-        GC_LVT), ('\u{b920}', '\u{b920}', GC_LV), ('\u{b921}', '\u{b93b}', GC_LVT), ('\u{b93c}',
-        '\u{b93c}', GC_LV), ('\u{b93d}', '\u{b957}', GC_LVT), ('\u{b958}', '\u{b958}', GC_LV),
-        ('\u{b959}', '\u{b973}', GC_LVT), ('\u{b974}', '\u{b974}', GC_LV), ('\u{b975}', '\u{b98f}',
-        GC_LVT), ('\u{b990}', '\u{b990}', GC_LV), ('\u{b991}', '\u{b9ab}', GC_LVT), ('\u{b9ac}',
-        '\u{b9ac}', GC_LV), ('\u{b9ad}', '\u{b9c7}', GC_LVT), ('\u{b9c8}', '\u{b9c8}', GC_LV),
-        ('\u{b9c9}', '\u{b9e3}', GC_LVT), ('\u{b9e4}', '\u{b9e4}', GC_LV), ('\u{b9e5}', '\u{b9ff}',
-        GC_LVT), ('\u{ba00}', '\u{ba00}', GC_LV), ('\u{ba01}', '\u{ba1b}', GC_LVT), ('\u{ba1c}',
-        '\u{ba1c}', GC_LV), ('\u{ba1d}', '\u{ba37}', GC_LVT), ('\u{ba38}', '\u{ba38}', GC_LV),
-        ('\u{ba39}', '\u{ba53}', GC_LVT), ('\u{ba54}', '\u{ba54}', GC_LV), ('\u{ba55}', '\u{ba6f}',
-        GC_LVT), ('\u{ba70}', '\u{ba70}', GC_LV), ('\u{ba71}', '\u{ba8b}', GC_LVT), ('\u{ba8c}',
-        '\u{ba8c}', GC_LV), ('\u{ba8d}', '\u{baa7}', GC_LVT), ('\u{baa8}', '\u{baa8}', GC_LV),
-        ('\u{baa9}', '\u{bac3}', GC_LVT), ('\u{bac4}', '\u{bac4}', GC_LV), ('\u{bac5}', '\u{badf}',
-        GC_LVT), ('\u{bae0}', '\u{bae0}', GC_LV), ('\u{bae1}', '\u{bafb}', GC_LVT), ('\u{bafc}',
-        '\u{bafc}', GC_LV), ('\u{bafd}', '\u{bb17}', GC_LVT), ('\u{bb18}', '\u{bb18}', GC_LV),
-        ('\u{bb19}', '\u{bb33}', GC_LVT), ('\u{bb34}', '\u{bb34}', GC_LV), ('\u{bb35}', '\u{bb4f}',
-        GC_LVT), ('\u{bb50}', '\u{bb50}', GC_LV), ('\u{bb51}', '\u{bb6b}', GC_LVT), ('\u{bb6c}',
-        '\u{bb6c}', GC_LV), ('\u{bb6d}', '\u{bb87}', GC_LVT), ('\u{bb88}', '\u{bb88}', GC_LV),
-        ('\u{bb89}', '\u{bba3}', GC_LVT), ('\u{bba4}', '\u{bba4}', GC_LV), ('\u{bba5}', '\u{bbbf}',
-        GC_LVT), ('\u{bbc0}', '\u{bbc0}', GC_LV), ('\u{bbc1}', '\u{bbdb}', GC_LVT), ('\u{bbdc}',
-        '\u{bbdc}', GC_LV), ('\u{bbdd}', '\u{bbf7}', GC_LVT), ('\u{bbf8}', '\u{bbf8}', GC_LV),
-        ('\u{bbf9}', '\u{bc13}', GC_LVT), ('\u{bc14}', '\u{bc14}', GC_LV), ('\u{bc15}', '\u{bc2f}',
-        GC_LVT), ('\u{bc30}', '\u{bc30}', GC_LV), ('\u{bc31}', '\u{bc4b}', GC_LVT), ('\u{bc4c}',
-        '\u{bc4c}', GC_LV), ('\u{bc4d}', '\u{bc67}', GC_LVT), ('\u{bc68}', '\u{bc68}', GC_LV),
-        ('\u{bc69}', '\u{bc83}', GC_LVT), ('\u{bc84}', '\u{bc84}', GC_LV), ('\u{bc85}', '\u{bc9f}',
-        GC_LVT), ('\u{bca0}', '\u{bca0}', GC_LV), ('\u{bca1}', '\u{bcbb}', GC_LVT), ('\u{bcbc}',
-        '\u{bcbc}', GC_LV), ('\u{bcbd}', '\u{bcd7}', GC_LVT), ('\u{bcd8}', '\u{bcd8}', GC_LV),
-        ('\u{bcd9}', '\u{bcf3}', GC_LVT), ('\u{bcf4}', '\u{bcf4}', GC_LV), ('\u{bcf5}', '\u{bd0f}',
-        GC_LVT), ('\u{bd10}', '\u{bd10}', GC_LV), ('\u{bd11}', '\u{bd2b}', GC_LVT), ('\u{bd2c}',
-        '\u{bd2c}', GC_LV), ('\u{bd2d}', '\u{bd47}', GC_LVT), ('\u{bd48}', '\u{bd48}', GC_LV),
-        ('\u{bd49}', '\u{bd63}', GC_LVT), ('\u{bd64}', '\u{bd64}', GC_LV), ('\u{bd65}', '\u{bd7f}',
-        GC_LVT), ('\u{bd80}', '\u{bd80}', GC_LV), ('\u{bd81}', '\u{bd9b}', GC_LVT), ('\u{bd9c}',
-        '\u{bd9c}', GC_LV), ('\u{bd9d}', '\u{bdb7}', GC_LVT), ('\u{bdb8}', '\u{bdb8}', GC_LV),
-        ('\u{bdb9}', '\u{bdd3}', GC_LVT), ('\u{bdd4}', '\u{bdd4}', GC_LV), ('\u{bdd5}', '\u{bdef}',
-        GC_LVT), ('\u{bdf0}', '\u{bdf0}', GC_LV), ('\u{bdf1}', '\u{be0b}', GC_LVT), ('\u{be0c}',
-        '\u{be0c}', GC_LV), ('\u{be0d}', '\u{be27}', GC_LVT), ('\u{be28}', '\u{be28}', GC_LV),
-        ('\u{be29}', '\u{be43}', GC_LVT), ('\u{be44}', '\u{be44}', GC_LV), ('\u{be45}', '\u{be5f}',
-        GC_LVT), ('\u{be60}', '\u{be60}', GC_LV), ('\u{be61}', '\u{be7b}', GC_LVT), ('\u{be7c}',
-        '\u{be7c}', GC_LV), ('\u{be7d}', '\u{be97}', GC_LVT), ('\u{be98}', '\u{be98}', GC_LV),
-        ('\u{be99}', '\u{beb3}', GC_LVT), ('\u{beb4}', '\u{beb4}', GC_LV), ('\u{beb5}', '\u{becf}',
-        GC_LVT), ('\u{bed0}', '\u{bed0}', GC_LV), ('\u{bed1}', '\u{beeb}', GC_LVT), ('\u{beec}',
-        '\u{beec}', GC_LV), ('\u{beed}', '\u{bf07}', GC_LVT), ('\u{bf08}', '\u{bf08}', GC_LV),
-        ('\u{bf09}', '\u{bf23}', GC_LVT), ('\u{bf24}', '\u{bf24}', GC_LV), ('\u{bf25}', '\u{bf3f}',
-        GC_LVT), ('\u{bf40}', '\u{bf40}', GC_LV), ('\u{bf41}', '\u{bf5b}', GC_LVT), ('\u{bf5c}',
-        '\u{bf5c}', GC_LV), ('\u{bf5d}', '\u{bf77}', GC_LVT), ('\u{bf78}', '\u{bf78}', GC_LV),
-        ('\u{bf79}', '\u{bf93}', GC_LVT), ('\u{bf94}', '\u{bf94}', GC_LV), ('\u{bf95}', '\u{bfaf}',
-        GC_LVT), ('\u{bfb0}', '\u{bfb0}', GC_LV), ('\u{bfb1}', '\u{bfcb}', GC_LVT), ('\u{bfcc}',
-        '\u{bfcc}', GC_LV), ('\u{bfcd}', '\u{bfe7}', GC_LVT), ('\u{bfe8}', '\u{bfe8}', GC_LV),
-        ('\u{bfe9}', '\u{c003}', GC_LVT), ('\u{c004}', '\u{c004}', GC_LV), ('\u{c005}', '\u{c01f}',
-        GC_LVT), ('\u{c020}', '\u{c020}', GC_LV), ('\u{c021}', '\u{c03b}', GC_LVT), ('\u{c03c}',
-        '\u{c03c}', GC_LV), ('\u{c03d}', '\u{c057}', GC_LVT), ('\u{c058}', '\u{c058}', GC_LV),
-        ('\u{c059}', '\u{c073}', GC_LVT), ('\u{c074}', '\u{c074}', GC_LV), ('\u{c075}', '\u{c08f}',
-        GC_LVT), ('\u{c090}', '\u{c090}', GC_LV), ('\u{c091}', '\u{c0ab}', GC_LVT), ('\u{c0ac}',
-        '\u{c0ac}', GC_LV), ('\u{c0ad}', '\u{c0c7}', GC_LVT), ('\u{c0c8}', '\u{c0c8}', GC_LV),
-        ('\u{c0c9}', '\u{c0e3}', GC_LVT), ('\u{c0e4}', '\u{c0e4}', GC_LV), ('\u{c0e5}', '\u{c0ff}',
-        GC_LVT), ('\u{c100}', '\u{c100}', GC_LV), ('\u{c101}', '\u{c11b}', GC_LVT), ('\u{c11c}',
-        '\u{c11c}', GC_LV), ('\u{c11d}', '\u{c137}', GC_LVT), ('\u{c138}', '\u{c138}', GC_LV),
-        ('\u{c139}', '\u{c153}', GC_LVT), ('\u{c154}', '\u{c154}', GC_LV), ('\u{c155}', '\u{c16f}',
-        GC_LVT), ('\u{c170}', '\u{c170}', GC_LV), ('\u{c171}', '\u{c18b}', GC_LVT), ('\u{c18c}',
-        '\u{c18c}', GC_LV), ('\u{c18d}', '\u{c1a7}', GC_LVT), ('\u{c1a8}', '\u{c1a8}', GC_LV),
-        ('\u{c1a9}', '\u{c1c3}', GC_LVT), ('\u{c1c4}', '\u{c1c4}', GC_LV), ('\u{c1c5}', '\u{c1df}',
-        GC_LVT), ('\u{c1e0}', '\u{c1e0}', GC_LV), ('\u{c1e1}', '\u{c1fb}', GC_LVT), ('\u{c1fc}',
-        '\u{c1fc}', GC_LV), ('\u{c1fd}', '\u{c217}', GC_LVT), ('\u{c218}', '\u{c218}', GC_LV),
-        ('\u{c219}', '\u{c233}', GC_LVT), ('\u{c234}', '\u{c234}', GC_LV), ('\u{c235}', '\u{c24f}',
-        GC_LVT), ('\u{c250}', '\u{c250}', GC_LV), ('\u{c251}', '\u{c26b}', GC_LVT), ('\u{c26c}',
-        '\u{c26c}', GC_LV), ('\u{c26d}', '\u{c287}', GC_LVT), ('\u{c288}', '\u{c288}', GC_LV),
-        ('\u{c289}', '\u{c2a3}', GC_LVT), ('\u{c2a4}', '\u{c2a4}', GC_LV), ('\u{c2a5}', '\u{c2bf}',
-        GC_LVT), ('\u{c2c0}', '\u{c2c0}', GC_LV), ('\u{c2c1}', '\u{c2db}', GC_LVT), ('\u{c2dc}',
-        '\u{c2dc}', GC_LV), ('\u{c2dd}', '\u{c2f7}', GC_LVT), ('\u{c2f8}', '\u{c2f8}', GC_LV),
-        ('\u{c2f9}', '\u{c313}', GC_LVT), ('\u{c314}', '\u{c314}', GC_LV), ('\u{c315}', '\u{c32f}',
-        GC_LVT), ('\u{c330}', '\u{c330}', GC_LV), ('\u{c331}', '\u{c34b}', GC_LVT), ('\u{c34c}',
-        '\u{c34c}', GC_LV), ('\u{c34d}', '\u{c367}', GC_LVT), ('\u{c368}', '\u{c368}', GC_LV),
-        ('\u{c369}', '\u{c383}', GC_LVT), ('\u{c384}', '\u{c384}', GC_LV), ('\u{c385}', '\u{c39f}',
-        GC_LVT), ('\u{c3a0}', '\u{c3a0}', GC_LV), ('\u{c3a1}', '\u{c3bb}', GC_LVT), ('\u{c3bc}',
-        '\u{c3bc}', GC_LV), ('\u{c3bd}', '\u{c3d7}', GC_LVT), ('\u{c3d8}', '\u{c3d8}', GC_LV),
-        ('\u{c3d9}', '\u{c3f3}', GC_LVT), ('\u{c3f4}', '\u{c3f4}', GC_LV), ('\u{c3f5}', '\u{c40f}',
-        GC_LVT), ('\u{c410}', '\u{c410}', GC_LV), ('\u{c411}', '\u{c42b}', GC_LVT), ('\u{c42c}',
-        '\u{c42c}', GC_LV), ('\u{c42d}', '\u{c447}', GC_LVT), ('\u{c448}', '\u{c448}', GC_LV),
-        ('\u{c449}', '\u{c463}', GC_LVT), ('\u{c464}', '\u{c464}', GC_LV), ('\u{c465}', '\u{c47f}',
-        GC_LVT), ('\u{c480}', '\u{c480}', GC_LV), ('\u{c481}', '\u{c49b}', GC_LVT), ('\u{c49c}',
-        '\u{c49c}', GC_LV), ('\u{c49d}', '\u{c4b7}', GC_LVT), ('\u{c4b8}', '\u{c4b8}', GC_LV),
-        ('\u{c4b9}', '\u{c4d3}', GC_LVT), ('\u{c4d4}', '\u{c4d4}', GC_LV), ('\u{c4d5}', '\u{c4ef}',
-        GC_LVT), ('\u{c4f0}', '\u{c4f0}', GC_LV), ('\u{c4f1}', '\u{c50b}', GC_LVT), ('\u{c50c}',
-        '\u{c50c}', GC_LV), ('\u{c50d}', '\u{c527}', GC_LVT), ('\u{c528}', '\u{c528}', GC_LV),
-        ('\u{c529}', '\u{c543}', GC_LVT), ('\u{c544}', '\u{c544}', GC_LV), ('\u{c545}', '\u{c55f}',
-        GC_LVT), ('\u{c560}', '\u{c560}', GC_LV), ('\u{c561}', '\u{c57b}', GC_LVT), ('\u{c57c}',
-        '\u{c57c}', GC_LV), ('\u{c57d}', '\u{c597}', GC_LVT), ('\u{c598}', '\u{c598}', GC_LV),
-        ('\u{c599}', '\u{c5b3}', GC_LVT), ('\u{c5b4}', '\u{c5b4}', GC_LV), ('\u{c5b5}', '\u{c5cf}',
-        GC_LVT), ('\u{c5d0}', '\u{c5d0}', GC_LV), ('\u{c5d1}', '\u{c5eb}', GC_LVT), ('\u{c5ec}',
-        '\u{c5ec}', GC_LV), ('\u{c5ed}', '\u{c607}', GC_LVT), ('\u{c608}', '\u{c608}', GC_LV),
-        ('\u{c609}', '\u{c623}', GC_LVT), ('\u{c624}', '\u{c624}', GC_LV), ('\u{c625}', '\u{c63f}',
-        GC_LVT), ('\u{c640}', '\u{c640}', GC_LV), ('\u{c641}', '\u{c65b}', GC_LVT), ('\u{c65c}',
-        '\u{c65c}', GC_LV), ('\u{c65d}', '\u{c677}', GC_LVT), ('\u{c678}', '\u{c678}', GC_LV),
-        ('\u{c679}', '\u{c693}', GC_LVT), ('\u{c694}', '\u{c694}', GC_LV), ('\u{c695}', '\u{c6af}',
-        GC_LVT), ('\u{c6b0}', '\u{c6b0}', GC_LV), ('\u{c6b1}', '\u{c6cb}', GC_LVT), ('\u{c6cc}',
-        '\u{c6cc}', GC_LV), ('\u{c6cd}', '\u{c6e7}', GC_LVT), ('\u{c6e8}', '\u{c6e8}', GC_LV),
-        ('\u{c6e9}', '\u{c703}', GC_LVT), ('\u{c704}', '\u{c704}', GC_LV), ('\u{c705}', '\u{c71f}',
-        GC_LVT), ('\u{c720}', '\u{c720}', GC_LV), ('\u{c721}', '\u{c73b}', GC_LVT), ('\u{c73c}',
-        '\u{c73c}', GC_LV), ('\u{c73d}', '\u{c757}', GC_LVT), ('\u{c758}', '\u{c758}', GC_LV),
-        ('\u{c759}', '\u{c773}', GC_LVT), ('\u{c774}', '\u{c774}', GC_LV), ('\u{c775}', '\u{c78f}',
-        GC_LVT), ('\u{c790}', '\u{c790}', GC_LV), ('\u{c791}', '\u{c7ab}', GC_LVT), ('\u{c7ac}',
-        '\u{c7ac}', GC_LV), ('\u{c7ad}', '\u{c7c7}', GC_LVT), ('\u{c7c8}', '\u{c7c8}', GC_LV),
-        ('\u{c7c9}', '\u{c7e3}', GC_LVT), ('\u{c7e4}', '\u{c7e4}', GC_LV), ('\u{c7e5}', '\u{c7ff}',
-        GC_LVT), ('\u{c800}', '\u{c800}', GC_LV), ('\u{c801}', '\u{c81b}', GC_LVT), ('\u{c81c}',
-        '\u{c81c}', GC_LV), ('\u{c81d}', '\u{c837}', GC_LVT), ('\u{c838}', '\u{c838}', GC_LV),
-        ('\u{c839}', '\u{c853}', GC_LVT), ('\u{c854}', '\u{c854}', GC_LV), ('\u{c855}', '\u{c86f}',
-        GC_LVT), ('\u{c870}', '\u{c870}', GC_LV), ('\u{c871}', '\u{c88b}', GC_LVT), ('\u{c88c}',
-        '\u{c88c}', GC_LV), ('\u{c88d}', '\u{c8a7}', GC_LVT), ('\u{c8a8}', '\u{c8a8}', GC_LV),
-        ('\u{c8a9}', '\u{c8c3}', GC_LVT), ('\u{c8c4}', '\u{c8c4}', GC_LV), ('\u{c8c5}', '\u{c8df}',
-        GC_LVT), ('\u{c8e0}', '\u{c8e0}', GC_LV), ('\u{c8e1}', '\u{c8fb}', GC_LVT), ('\u{c8fc}',
-        '\u{c8fc}', GC_LV), ('\u{c8fd}', '\u{c917}', GC_LVT), ('\u{c918}', '\u{c918}', GC_LV),
-        ('\u{c919}', '\u{c933}', GC_LVT), ('\u{c934}', '\u{c934}', GC_LV), ('\u{c935}', '\u{c94f}',
-        GC_LVT), ('\u{c950}', '\u{c950}', GC_LV), ('\u{c951}', '\u{c96b}', GC_LVT), ('\u{c96c}',
-        '\u{c96c}', GC_LV), ('\u{c96d}', '\u{c987}', GC_LVT), ('\u{c988}', '\u{c988}', GC_LV),
-        ('\u{c989}', '\u{c9a3}', GC_LVT), ('\u{c9a4}', '\u{c9a4}', GC_LV), ('\u{c9a5}', '\u{c9bf}',
-        GC_LVT), ('\u{c9c0}', '\u{c9c0}', GC_LV), ('\u{c9c1}', '\u{c9db}', GC_LVT), ('\u{c9dc}',
-        '\u{c9dc}', GC_LV), ('\u{c9dd}', '\u{c9f7}', GC_LVT), ('\u{c9f8}', '\u{c9f8}', GC_LV),
-        ('\u{c9f9}', '\u{ca13}', GC_LVT), ('\u{ca14}', '\u{ca14}', GC_LV), ('\u{ca15}', '\u{ca2f}',
-        GC_LVT), ('\u{ca30}', '\u{ca30}', GC_LV), ('\u{ca31}', '\u{ca4b}', GC_LVT), ('\u{ca4c}',
-        '\u{ca4c}', GC_LV), ('\u{ca4d}', '\u{ca67}', GC_LVT), ('\u{ca68}', '\u{ca68}', GC_LV),
-        ('\u{ca69}', '\u{ca83}', GC_LVT), ('\u{ca84}', '\u{ca84}', GC_LV), ('\u{ca85}', '\u{ca9f}',
-        GC_LVT), ('\u{caa0}', '\u{caa0}', GC_LV), ('\u{caa1}', '\u{cabb}', GC_LVT), ('\u{cabc}',
-        '\u{cabc}', GC_LV), ('\u{cabd}', '\u{cad7}', GC_LVT), ('\u{cad8}', '\u{cad8}', GC_LV),
-        ('\u{cad9}', '\u{caf3}', GC_LVT), ('\u{caf4}', '\u{caf4}', GC_LV), ('\u{caf5}', '\u{cb0f}',
-        GC_LVT), ('\u{cb10}', '\u{cb10}', GC_LV), ('\u{cb11}', '\u{cb2b}', GC_LVT), ('\u{cb2c}',
-        '\u{cb2c}', GC_LV), ('\u{cb2d}', '\u{cb47}', GC_LVT), ('\u{cb48}', '\u{cb48}', GC_LV),
-        ('\u{cb49}', '\u{cb63}', GC_LVT), ('\u{cb64}', '\u{cb64}', GC_LV), ('\u{cb65}', '\u{cb7f}',
-        GC_LVT), ('\u{cb80}', '\u{cb80}', GC_LV), ('\u{cb81}', '\u{cb9b}', GC_LVT), ('\u{cb9c}',
-        '\u{cb9c}', GC_LV), ('\u{cb9d}', '\u{cbb7}', GC_LVT), ('\u{cbb8}', '\u{cbb8}', GC_LV),
-        ('\u{cbb9}', '\u{cbd3}', GC_LVT), ('\u{cbd4}', '\u{cbd4}', GC_LV), ('\u{cbd5}', '\u{cbef}',
-        GC_LVT), ('\u{cbf0}', '\u{cbf0}', GC_LV), ('\u{cbf1}', '\u{cc0b}', GC_LVT), ('\u{cc0c}',
-        '\u{cc0c}', GC_LV), ('\u{cc0d}', '\u{cc27}', GC_LVT), ('\u{cc28}', '\u{cc28}', GC_LV),
-        ('\u{cc29}', '\u{cc43}', GC_LVT), ('\u{cc44}', '\u{cc44}', GC_LV), ('\u{cc45}', '\u{cc5f}',
-        GC_LVT), ('\u{cc60}', '\u{cc60}', GC_LV), ('\u{cc61}', '\u{cc7b}', GC_LVT), ('\u{cc7c}',
-        '\u{cc7c}', GC_LV), ('\u{cc7d}', '\u{cc97}', GC_LVT), ('\u{cc98}', '\u{cc98}', GC_LV),
-        ('\u{cc99}', '\u{ccb3}', GC_LVT), ('\u{ccb4}', '\u{ccb4}', GC_LV), ('\u{ccb5}', '\u{cccf}',
-        GC_LVT), ('\u{ccd0}', '\u{ccd0}', GC_LV), ('\u{ccd1}', '\u{cceb}', GC_LVT), ('\u{ccec}',
-        '\u{ccec}', GC_LV), ('\u{cced}', '\u{cd07}', GC_LVT), ('\u{cd08}', '\u{cd08}', GC_LV),
-        ('\u{cd09}', '\u{cd23}', GC_LVT), ('\u{cd24}', '\u{cd24}', GC_LV), ('\u{cd25}', '\u{cd3f}',
-        GC_LVT), ('\u{cd40}', '\u{cd40}', GC_LV), ('\u{cd41}', '\u{cd5b}', GC_LVT), ('\u{cd5c}',
-        '\u{cd5c}', GC_LV), ('\u{cd5d}', '\u{cd77}', GC_LVT), ('\u{cd78}', '\u{cd78}', GC_LV),
-        ('\u{cd79}', '\u{cd93}', GC_LVT), ('\u{cd94}', '\u{cd94}', GC_LV), ('\u{cd95}', '\u{cdaf}',
-        GC_LVT), ('\u{cdb0}', '\u{cdb0}', GC_LV), ('\u{cdb1}', '\u{cdcb}', GC_LVT), ('\u{cdcc}',
-        '\u{cdcc}', GC_LV), ('\u{cdcd}', '\u{cde7}', GC_LVT), ('\u{cde8}', '\u{cde8}', GC_LV),
-        ('\u{cde9}', '\u{ce03}', GC_LVT), ('\u{ce04}', '\u{ce04}', GC_LV), ('\u{ce05}', '\u{ce1f}',
-        GC_LVT), ('\u{ce20}', '\u{ce20}', GC_LV), ('\u{ce21}', '\u{ce3b}', GC_LVT), ('\u{ce3c}',
-        '\u{ce3c}', GC_LV), ('\u{ce3d}', '\u{ce57}', GC_LVT), ('\u{ce58}', '\u{ce58}', GC_LV),
-        ('\u{ce59}', '\u{ce73}', GC_LVT), ('\u{ce74}', '\u{ce74}', GC_LV), ('\u{ce75}', '\u{ce8f}',
-        GC_LVT), ('\u{ce90}', '\u{ce90}', GC_LV), ('\u{ce91}', '\u{ceab}', GC_LVT), ('\u{ceac}',
-        '\u{ceac}', GC_LV), ('\u{cead}', '\u{cec7}', GC_LVT), ('\u{cec8}', '\u{cec8}', GC_LV),
-        ('\u{cec9}', '\u{cee3}', GC_LVT), ('\u{cee4}', '\u{cee4}', GC_LV), ('\u{cee5}', '\u{ceff}',
-        GC_LVT), ('\u{cf00}', '\u{cf00}', GC_LV), ('\u{cf01}', '\u{cf1b}', GC_LVT), ('\u{cf1c}',
-        '\u{cf1c}', GC_LV), ('\u{cf1d}', '\u{cf37}', GC_LVT), ('\u{cf38}', '\u{cf38}', GC_LV),
-        ('\u{cf39}', '\u{cf53}', GC_LVT), ('\u{cf54}', '\u{cf54}', GC_LV), ('\u{cf55}', '\u{cf6f}',
-        GC_LVT), ('\u{cf70}', '\u{cf70}', GC_LV), ('\u{cf71}', '\u{cf8b}', GC_LVT), ('\u{cf8c}',
-        '\u{cf8c}', GC_LV), ('\u{cf8d}', '\u{cfa7}', GC_LVT), ('\u{cfa8}', '\u{cfa8}', GC_LV),
-        ('\u{cfa9}', '\u{cfc3}', GC_LVT), ('\u{cfc4}', '\u{cfc4}', GC_LV), ('\u{cfc5}', '\u{cfdf}',
-        GC_LVT), ('\u{cfe0}', '\u{cfe0}', GC_LV), ('\u{cfe1}', '\u{cffb}', GC_LVT), ('\u{cffc}',
-        '\u{cffc}', GC_LV), ('\u{cffd}', '\u{d017}', GC_LVT), ('\u{d018}', '\u{d018}', GC_LV),
-        ('\u{d019}', '\u{d033}', GC_LVT), ('\u{d034}', '\u{d034}', GC_LV), ('\u{d035}', '\u{d04f}',
-        GC_LVT), ('\u{d050}', '\u{d050}', GC_LV), ('\u{d051}', '\u{d06b}', GC_LVT), ('\u{d06c}',
-        '\u{d06c}', GC_LV), ('\u{d06d}', '\u{d087}', GC_LVT), ('\u{d088}', '\u{d088}', GC_LV),
-        ('\u{d089}', '\u{d0a3}', GC_LVT), ('\u{d0a4}', '\u{d0a4}', GC_LV), ('\u{d0a5}', '\u{d0bf}',
-        GC_LVT), ('\u{d0c0}', '\u{d0c0}', GC_LV), ('\u{d0c1}', '\u{d0db}', GC_LVT), ('\u{d0dc}',
-        '\u{d0dc}', GC_LV), ('\u{d0dd}', '\u{d0f7}', GC_LVT), ('\u{d0f8}', '\u{d0f8}', GC_LV),
-        ('\u{d0f9}', '\u{d113}', GC_LVT), ('\u{d114}', '\u{d114}', GC_LV), ('\u{d115}', '\u{d12f}',
-        GC_LVT), ('\u{d130}', '\u{d130}', GC_LV), ('\u{d131}', '\u{d14b}', GC_LVT), ('\u{d14c}',
-        '\u{d14c}', GC_LV), ('\u{d14d}', '\u{d167}', GC_LVT), ('\u{d168}', '\u{d168}', GC_LV),
-        ('\u{d169}', '\u{d183}', GC_LVT), ('\u{d184}', '\u{d184}', GC_LV), ('\u{d185}', '\u{d19f}',
-        GC_LVT), ('\u{d1a0}', '\u{d1a0}', GC_LV), ('\u{d1a1}', '\u{d1bb}', GC_LVT), ('\u{d1bc}',
-        '\u{d1bc}', GC_LV), ('\u{d1bd}', '\u{d1d7}', GC_LVT), ('\u{d1d8}', '\u{d1d8}', GC_LV),
-        ('\u{d1d9}', '\u{d1f3}', GC_LVT), ('\u{d1f4}', '\u{d1f4}', GC_LV), ('\u{d1f5}', '\u{d20f}',
-        GC_LVT), ('\u{d210}', '\u{d210}', GC_LV), ('\u{d211}', '\u{d22b}', GC_LVT), ('\u{d22c}',
-        '\u{d22c}', GC_LV), ('\u{d22d}', '\u{d247}', GC_LVT), ('\u{d248}', '\u{d248}', GC_LV),
-        ('\u{d249}', '\u{d263}', GC_LVT), ('\u{d264}', '\u{d264}', GC_LV), ('\u{d265}', '\u{d27f}',
-        GC_LVT), ('\u{d280}', '\u{d280}', GC_LV), ('\u{d281}', '\u{d29b}', GC_LVT), ('\u{d29c}',
-        '\u{d29c}', GC_LV), ('\u{d29d}', '\u{d2b7}', GC_LVT), ('\u{d2b8}', '\u{d2b8}', GC_LV),
-        ('\u{d2b9}', '\u{d2d3}', GC_LVT), ('\u{d2d4}', '\u{d2d4}', GC_LV), ('\u{d2d5}', '\u{d2ef}',
-        GC_LVT), ('\u{d2f0}', '\u{d2f0}', GC_LV), ('\u{d2f1}', '\u{d30b}', GC_LVT), ('\u{d30c}',
-        '\u{d30c}', GC_LV), ('\u{d30d}', '\u{d327}', GC_LVT), ('\u{d328}', '\u{d328}', GC_LV),
-        ('\u{d329}', '\u{d343}', GC_LVT), ('\u{d344}', '\u{d344}', GC_LV), ('\u{d345}', '\u{d35f}',
-        GC_LVT), ('\u{d360}', '\u{d360}', GC_LV), ('\u{d361}', '\u{d37b}', GC_LVT), ('\u{d37c}',
-        '\u{d37c}', GC_LV), ('\u{d37d}', '\u{d397}', GC_LVT), ('\u{d398}', '\u{d398}', GC_LV),
-        ('\u{d399}', '\u{d3b3}', GC_LVT), ('\u{d3b4}', '\u{d3b4}', GC_LV), ('\u{d3b5}', '\u{d3cf}',
-        GC_LVT), ('\u{d3d0}', '\u{d3d0}', GC_LV), ('\u{d3d1}', '\u{d3eb}', GC_LVT), ('\u{d3ec}',
-        '\u{d3ec}', GC_LV), ('\u{d3ed}', '\u{d407}', GC_LVT), ('\u{d408}', '\u{d408}', GC_LV),
-        ('\u{d409}', '\u{d423}', GC_LVT), ('\u{d424}', '\u{d424}', GC_LV), ('\u{d425}', '\u{d43f}',
-        GC_LVT), ('\u{d440}', '\u{d440}', GC_LV), ('\u{d441}', '\u{d45b}', GC_LVT), ('\u{d45c}',
-        '\u{d45c}', GC_LV), ('\u{d45d}', '\u{d477}', GC_LVT), ('\u{d478}', '\u{d478}', GC_LV),
-        ('\u{d479}', '\u{d493}', GC_LVT), ('\u{d494}', '\u{d494}', GC_LV), ('\u{d495}', '\u{d4af}',
-        GC_LVT), ('\u{d4b0}', '\u{d4b0}', GC_LV), ('\u{d4b1}', '\u{d4cb}', GC_LVT), ('\u{d4cc}',
-        '\u{d4cc}', GC_LV), ('\u{d4cd}', '\u{d4e7}', GC_LVT), ('\u{d4e8}', '\u{d4e8}', GC_LV),
-        ('\u{d4e9}', '\u{d503}', GC_LVT), ('\u{d504}', '\u{d504}', GC_LV), ('\u{d505}', '\u{d51f}',
-        GC_LVT), ('\u{d520}', '\u{d520}', GC_LV), ('\u{d521}', '\u{d53b}', GC_LVT), ('\u{d53c}',
-        '\u{d53c}', GC_LV), ('\u{d53d}', '\u{d557}', GC_LVT), ('\u{d558}', '\u{d558}', GC_LV),
-        ('\u{d559}', '\u{d573}', GC_LVT), ('\u{d574}', '\u{d574}', GC_LV), ('\u{d575}', '\u{d58f}',
-        GC_LVT), ('\u{d590}', '\u{d590}', GC_LV), ('\u{d591}', '\u{d5ab}', GC_LVT), ('\u{d5ac}',
-        '\u{d5ac}', GC_LV), ('\u{d5ad}', '\u{d5c7}', GC_LVT), ('\u{d5c8}', '\u{d5c8}', GC_LV),
-        ('\u{d5c9}', '\u{d5e3}', GC_LVT), ('\u{d5e4}', '\u{d5e4}', GC_LV), ('\u{d5e5}', '\u{d5ff}',
-        GC_LVT), ('\u{d600}', '\u{d600}', GC_LV), ('\u{d601}', '\u{d61b}', GC_LVT), ('\u{d61c}',
-        '\u{d61c}', GC_LV), ('\u{d61d}', '\u{d637}', GC_LVT), ('\u{d638}', '\u{d638}', GC_LV),
-        ('\u{d639}', '\u{d653}', GC_LVT), ('\u{d654}', '\u{d654}', GC_LV), ('\u{d655}', '\u{d66f}',
-        GC_LVT), ('\u{d670}', '\u{d670}', GC_LV), ('\u{d671}', '\u{d68b}', GC_LVT), ('\u{d68c}',
-        '\u{d68c}', GC_LV), ('\u{d68d}', '\u{d6a7}', GC_LVT), ('\u{d6a8}', '\u{d6a8}', GC_LV),
-        ('\u{d6a9}', '\u{d6c3}', GC_LVT), ('\u{d6c4}', '\u{d6c4}', GC_LV), ('\u{d6c5}', '\u{d6df}',
-        GC_LVT), ('\u{d6e0}', '\u{d6e0}', GC_LV), ('\u{d6e1}', '\u{d6fb}', GC_LVT), ('\u{d6fc}',
-        '\u{d6fc}', GC_LV), ('\u{d6fd}', '\u{d717}', GC_LVT), ('\u{d718}', '\u{d718}', GC_LV),
-        ('\u{d719}', '\u{d733}', GC_LVT), ('\u{d734}', '\u{d734}', GC_LV), ('\u{d735}', '\u{d74f}',
-        GC_LVT), ('\u{d750}', '\u{d750}', GC_LV), ('\u{d751}', '\u{d76b}', GC_LVT), ('\u{d76c}',
-        '\u{d76c}', GC_LV), ('\u{d76d}', '\u{d787}', GC_LVT), ('\u{d788}', '\u{d788}', GC_LV),
-        ('\u{d789}', '\u{d7a3}', GC_LVT), ('\u{d7b0}', '\u{d7c6}', GC_V), ('\u{d7cb}', '\u{d7fb}',
-        GC_T), ('\u{fb1e}', '\u{fb1e}', GC_Extend), ('\u{fe00}', '\u{fe0f}', GC_Extend),
-        ('\u{fe20}', '\u{fe2f}', GC_Extend), ('\u{feff}', '\u{feff}', GC_Control), ('\u{ff9e}',
-        '\u{ff9f}', GC_Extend), ('\u{fff0}', '\u{fffb}', GC_Control), ('\u{101fd}', '\u{101fd}',
-        GC_Extend), ('\u{102e0}', '\u{102e0}', GC_Extend), ('\u{10376}', '\u{1037a}', GC_Extend),
-        ('\u{10a01}', '\u{10a03}', GC_Extend), ('\u{10a05}', '\u{10a06}', GC_Extend), ('\u{10a0c}',
-        '\u{10a0f}', GC_Extend), ('\u{10a38}', '\u{10a3a}', GC_Extend), ('\u{10a3f}', '\u{10a3f}',
-        GC_Extend), ('\u{10ae5}', '\u{10ae6}', GC_Extend), ('\u{10d24}', '\u{10d27}', GC_Extend),
-        ('\u{10eab}', '\u{10eac}', GC_Extend), ('\u{10efd}', '\u{10eff}', GC_Extend), ('\u{10f46}',
-        '\u{10f50}', GC_Extend), ('\u{10f82}', '\u{10f85}', GC_Extend), ('\u{11000}', '\u{11000}',
-        GC_SpacingMark), ('\u{11001}', '\u{11001}', GC_Extend), ('\u{11002}', '\u{11002}',
-        GC_SpacingMark), ('\u{11038}', '\u{11046}', GC_Extend), ('\u{11070}', '\u{11070}',
-        GC_Extend), ('\u{11073}', '\u{11074}', GC_Extend), ('\u{1107f}', '\u{11081}', GC_Extend),
-        ('\u{11082}', '\u{11082}', GC_SpacingMark), ('\u{110b0}', '\u{110b2}', GC_SpacingMark),
-        ('\u{110b3}', '\u{110b6}', GC_Extend), ('\u{110b7}', '\u{110b8}', GC_SpacingMark),
-        ('\u{110b9}', '\u{110ba}', GC_Extend), ('\u{110bd}', '\u{110bd}', GC_Prepend), ('\u{110c2}',
-        '\u{110c2}', GC_Extend), ('\u{110cd}', '\u{110cd}', GC_Prepend), ('\u{11100}', '\u{11102}',
-        GC_Extend), ('\u{11127}', '\u{1112b}', GC_Extend), ('\u{1112c}', '\u{1112c}',
-        GC_SpacingMark), ('\u{1112d}', '\u{11134}', GC_Extend), ('\u{11145}', '\u{11146}',
-        GC_SpacingMark), ('\u{11173}', '\u{11173}', GC_Extend), ('\u{11180}', '\u{11181}',
-        GC_Extend), ('\u{11182}', '\u{11182}', GC_SpacingMark), ('\u{111b3}', '\u{111b5}',
-        GC_SpacingMark), ('\u{111b6}', '\u{111be}', GC_Extend), ('\u{111bf}', '\u{111c0}',
-        GC_SpacingMark), ('\u{111c2}', '\u{111c3}', GC_Prepend), ('\u{111c9}', '\u{111cc}',
-        GC_Extend), ('\u{111ce}', '\u{111ce}', GC_SpacingMark), ('\u{111cf}', '\u{111cf}',
-        GC_Extend), ('\u{1122c}', '\u{1122e}', GC_SpacingMark), ('\u{1122f}', '\u{11231}',
-        GC_Extend), ('\u{11232}', '\u{11233}', GC_SpacingMark), ('\u{11234}', '\u{11234}',
-        GC_Extend), ('\u{11235}', '\u{11235}', GC_SpacingMark), ('\u{11236}', '\u{11237}',
-        GC_Extend), ('\u{1123e}', '\u{1123e}', GC_Extend), ('\u{11241}', '\u{11241}', GC_Extend),
-        ('\u{112df}', '\u{112df}', GC_Extend), ('\u{112e0}', '\u{112e2}', GC_SpacingMark),
-        ('\u{112e3}', '\u{112ea}', GC_Extend), ('\u{11300}', '\u{11301}', GC_Extend), ('\u{11302}',
-        '\u{11303}', GC_SpacingMark), ('\u{1133b}', '\u{1133c}', GC_Extend), ('\u{1133e}',
-        '\u{1133e}', GC_Extend), ('\u{1133f}', '\u{1133f}', GC_SpacingMark), ('\u{11340}',
-        '\u{11340}', GC_Extend), ('\u{11341}', '\u{11344}', GC_SpacingMark), ('\u{11347}',
-        '\u{11348}', GC_SpacingMark), ('\u{1134b}', '\u{1134d}', GC_SpacingMark), ('\u{11357}',
-        '\u{11357}', GC_Extend), ('\u{11362}', '\u{11363}', GC_SpacingMark), ('\u{11366}',
-        '\u{1136c}', GC_Extend), ('\u{11370}', '\u{11374}', GC_Extend), ('\u{11435}', '\u{11437}',
+        '\u{1b3d}', GC_Extend), ('\u{1b3e}', '\u{1b41}', GC_SpacingMark), ('\u{1b42}', '\u{1b44}',
+        GC_Extend), ('\u{1b6b}', '\u{1b73}', GC_Extend), ('\u{1b80}', '\u{1b81}', GC_Extend),
+        ('\u{1b82}', '\u{1b82}', GC_SpacingMark), ('\u{1ba1}', '\u{1ba1}', GC_SpacingMark),
+        ('\u{1ba2}', '\u{1ba5}', GC_Extend), ('\u{1ba6}', '\u{1ba7}', GC_SpacingMark), ('\u{1ba8}',
+        '\u{1bad}', GC_Extend), ('\u{1be6}', '\u{1be6}', GC_Extend), ('\u{1be7}', '\u{1be7}',
+        GC_SpacingMark), ('\u{1be8}', '\u{1be9}', GC_Extend), ('\u{1bea}', '\u{1bec}',
+        GC_SpacingMark), ('\u{1bed}', '\u{1bed}', GC_Extend), ('\u{1bee}', '\u{1bee}',
+        GC_SpacingMark), ('\u{1bef}', '\u{1bf3}', GC_Extend), ('\u{1c24}', '\u{1c2b}',
+        GC_SpacingMark), ('\u{1c2c}', '\u{1c33}', GC_Extend), ('\u{1c34}', '\u{1c35}',
+        GC_SpacingMark), ('\u{1c36}', '\u{1c37}', GC_Extend), ('\u{1cd0}', '\u{1cd2}', GC_Extend),
+        ('\u{1cd4}', '\u{1ce0}', GC_Extend), ('\u{1ce1}', '\u{1ce1}', GC_SpacingMark), ('\u{1ce2}',
+        '\u{1ce8}', GC_Extend), ('\u{1ced}', '\u{1ced}', GC_Extend), ('\u{1cf4}', '\u{1cf4}',
+        GC_Extend), ('\u{1cf7}', '\u{1cf7}', GC_SpacingMark), ('\u{1cf8}', '\u{1cf9}', GC_Extend),
+        ('\u{1dc0}', '\u{1dff}', GC_Extend), ('\u{200b}', '\u{200b}', GC_Control), ('\u{200c}',
+        '\u{200c}', GC_Extend), ('\u{200d}', '\u{200d}', GC_ZWJ), ('\u{200e}', '\u{200f}',
+        GC_Control), ('\u{2028}', '\u{202e}', GC_Control), ('\u{203c}', '\u{203c}',
+        GC_Extended_Pictographic), ('\u{2049}', '\u{2049}', GC_Extended_Pictographic), ('\u{2060}',
+        '\u{206f}', GC_Control), ('\u{20d0}', '\u{20f0}', GC_Extend), ('\u{2122}', '\u{2122}',
+        GC_Extended_Pictographic), ('\u{2139}', '\u{2139}', GC_Extended_Pictographic), ('\u{2194}',
+        '\u{2199}', GC_Extended_Pictographic), ('\u{21a9}', '\u{21aa}', GC_Extended_Pictographic),
+        ('\u{231a}', '\u{231b}', GC_Extended_Pictographic), ('\u{2328}', '\u{2328}',
+        GC_Extended_Pictographic), ('\u{2388}', '\u{2388}', GC_Extended_Pictographic), ('\u{23cf}',
+        '\u{23cf}', GC_Extended_Pictographic), ('\u{23e9}', '\u{23f3}', GC_Extended_Pictographic),
+        ('\u{23f8}', '\u{23fa}', GC_Extended_Pictographic), ('\u{24c2}', '\u{24c2}',
+        GC_Extended_Pictographic), ('\u{25aa}', '\u{25ab}', GC_Extended_Pictographic), ('\u{25b6}',
+        '\u{25b6}', GC_Extended_Pictographic), ('\u{25c0}', '\u{25c0}', GC_Extended_Pictographic),
+        ('\u{25fb}', '\u{25fe}', GC_Extended_Pictographic), ('\u{2600}', '\u{2605}',
+        GC_Extended_Pictographic), ('\u{2607}', '\u{2612}', GC_Extended_Pictographic), ('\u{2614}',
+        '\u{2685}', GC_Extended_Pictographic), ('\u{2690}', '\u{2705}', GC_Extended_Pictographic),
+        ('\u{2708}', '\u{2712}', GC_Extended_Pictographic), ('\u{2714}', '\u{2714}',
+        GC_Extended_Pictographic), ('\u{2716}', '\u{2716}', GC_Extended_Pictographic), ('\u{271d}',
+        '\u{271d}', GC_Extended_Pictographic), ('\u{2721}', '\u{2721}', GC_Extended_Pictographic),
+        ('\u{2728}', '\u{2728}', GC_Extended_Pictographic), ('\u{2733}', '\u{2734}',
+        GC_Extended_Pictographic), ('\u{2744}', '\u{2744}', GC_Extended_Pictographic), ('\u{2747}',
+        '\u{2747}', GC_Extended_Pictographic), ('\u{274c}', '\u{274c}', GC_Extended_Pictographic),
+        ('\u{274e}', '\u{274e}', GC_Extended_Pictographic), ('\u{2753}', '\u{2755}',
+        GC_Extended_Pictographic), ('\u{2757}', '\u{2757}', GC_Extended_Pictographic), ('\u{2763}',
+        '\u{2767}', GC_Extended_Pictographic), ('\u{2795}', '\u{2797}', GC_Extended_Pictographic),
+        ('\u{27a1}', '\u{27a1}', GC_Extended_Pictographic), ('\u{27b0}', '\u{27b0}',
+        GC_Extended_Pictographic), ('\u{27bf}', '\u{27bf}', GC_Extended_Pictographic), ('\u{2934}',
+        '\u{2935}', GC_Extended_Pictographic), ('\u{2b05}', '\u{2b07}', GC_Extended_Pictographic),
+        ('\u{2b1b}', '\u{2b1c}', GC_Extended_Pictographic), ('\u{2b50}', '\u{2b50}',
+        GC_Extended_Pictographic), ('\u{2b55}', '\u{2b55}', GC_Extended_Pictographic), ('\u{2cef}',
+        '\u{2cf1}', GC_Extend), ('\u{2d7f}', '\u{2d7f}', GC_Extend), ('\u{2de0}', '\u{2dff}',
+        GC_Extend), ('\u{302a}', '\u{302f}', GC_Extend), ('\u{3030}', '\u{3030}',
+        GC_Extended_Pictographic), ('\u{303d}', '\u{303d}', GC_Extended_Pictographic), ('\u{3099}',
+        '\u{309a}', GC_Extend), ('\u{3297}', '\u{3297}', GC_Extended_Pictographic), ('\u{3299}',
+        '\u{3299}', GC_Extended_Pictographic), ('\u{a66f}', '\u{a672}', GC_Extend), ('\u{a674}',
+        '\u{a67d}', GC_Extend), ('\u{a69e}', '\u{a69f}', GC_Extend), ('\u{a6f0}', '\u{a6f1}',
+        GC_Extend), ('\u{a802}', '\u{a802}', GC_Extend), ('\u{a806}', '\u{a806}', GC_Extend),
+        ('\u{a80b}', '\u{a80b}', GC_Extend), ('\u{a823}', '\u{a824}', GC_SpacingMark), ('\u{a825}',
+        '\u{a826}', GC_Extend), ('\u{a827}', '\u{a827}', GC_SpacingMark), ('\u{a82c}', '\u{a82c}',
+        GC_Extend), ('\u{a880}', '\u{a881}', GC_SpacingMark), ('\u{a8b4}', '\u{a8c3}',
+        GC_SpacingMark), ('\u{a8c4}', '\u{a8c5}', GC_Extend), ('\u{a8e0}', '\u{a8f1}', GC_Extend),
+        ('\u{a8ff}', '\u{a8ff}', GC_Extend), ('\u{a926}', '\u{a92d}', GC_Extend), ('\u{a947}',
+        '\u{a951}', GC_Extend), ('\u{a952}', '\u{a952}', GC_SpacingMark), ('\u{a953}', '\u{a953}',
+        GC_Extend), ('\u{a960}', '\u{a97c}', GC_L), ('\u{a980}', '\u{a982}', GC_Extend),
+        ('\u{a983}', '\u{a983}', GC_SpacingMark), ('\u{a9b3}', '\u{a9b3}', GC_Extend), ('\u{a9b4}',
+        '\u{a9b5}', GC_SpacingMark), ('\u{a9b6}', '\u{a9b9}', GC_Extend), ('\u{a9ba}', '\u{a9bb}',
+        GC_SpacingMark), ('\u{a9bc}', '\u{a9bd}', GC_Extend), ('\u{a9be}', '\u{a9bf}',
+        GC_SpacingMark), ('\u{a9c0}', '\u{a9c0}', GC_Extend), ('\u{a9e5}', '\u{a9e5}', GC_Extend),
+        ('\u{aa29}', '\u{aa2e}', GC_Extend), ('\u{aa2f}', '\u{aa30}', GC_SpacingMark), ('\u{aa31}',
+        '\u{aa32}', GC_Extend), ('\u{aa33}', '\u{aa34}', GC_SpacingMark), ('\u{aa35}', '\u{aa36}',
+        GC_Extend), ('\u{aa43}', '\u{aa43}', GC_Extend), ('\u{aa4c}', '\u{aa4c}', GC_Extend),
+        ('\u{aa4d}', '\u{aa4d}', GC_SpacingMark), ('\u{aa7c}', '\u{aa7c}', GC_Extend), ('\u{aab0}',
+        '\u{aab0}', GC_Extend), ('\u{aab2}', '\u{aab4}', GC_Extend), ('\u{aab7}', '\u{aab8}',
+        GC_Extend), ('\u{aabe}', '\u{aabf}', GC_Extend), ('\u{aac1}', '\u{aac1}', GC_Extend),
+        ('\u{aaeb}', '\u{aaeb}', GC_SpacingMark), ('\u{aaec}', '\u{aaed}', GC_Extend), ('\u{aaee}',
+        '\u{aaef}', GC_SpacingMark), ('\u{aaf5}', '\u{aaf5}', GC_SpacingMark), ('\u{aaf6}',
+        '\u{aaf6}', GC_Extend), ('\u{abe3}', '\u{abe4}', GC_SpacingMark), ('\u{abe5}', '\u{abe5}',
+        GC_Extend), ('\u{abe6}', '\u{abe7}', GC_SpacingMark), ('\u{abe8}', '\u{abe8}', GC_Extend),
+        ('\u{abe9}', '\u{abea}', GC_SpacingMark), ('\u{abec}', '\u{abec}', GC_SpacingMark),
+        ('\u{abed}', '\u{abed}', GC_Extend), ('\u{ac00}', '\u{ac00}', GC_LV), ('\u{ac01}',
+        '\u{ac1b}', GC_LVT), ('\u{ac1c}', '\u{ac1c}', GC_LV), ('\u{ac1d}', '\u{ac37}', GC_LVT),
+        ('\u{ac38}', '\u{ac38}', GC_LV), ('\u{ac39}', '\u{ac53}', GC_LVT), ('\u{ac54}', '\u{ac54}',
+        GC_LV), ('\u{ac55}', '\u{ac6f}', GC_LVT), ('\u{ac70}', '\u{ac70}', GC_LV), ('\u{ac71}',
+        '\u{ac8b}', GC_LVT), ('\u{ac8c}', '\u{ac8c}', GC_LV), ('\u{ac8d}', '\u{aca7}', GC_LVT),
+        ('\u{aca8}', '\u{aca8}', GC_LV), ('\u{aca9}', '\u{acc3}', GC_LVT), ('\u{acc4}', '\u{acc4}',
+        GC_LV), ('\u{acc5}', '\u{acdf}', GC_LVT), ('\u{ace0}', '\u{ace0}', GC_LV), ('\u{ace1}',
+        '\u{acfb}', GC_LVT), ('\u{acfc}', '\u{acfc}', GC_LV), ('\u{acfd}', '\u{ad17}', GC_LVT),
+        ('\u{ad18}', '\u{ad18}', GC_LV), ('\u{ad19}', '\u{ad33}', GC_LVT), ('\u{ad34}', '\u{ad34}',
+        GC_LV), ('\u{ad35}', '\u{ad4f}', GC_LVT), ('\u{ad50}', '\u{ad50}', GC_LV), ('\u{ad51}',
+        '\u{ad6b}', GC_LVT), ('\u{ad6c}', '\u{ad6c}', GC_LV), ('\u{ad6d}', '\u{ad87}', GC_LVT),
+        ('\u{ad88}', '\u{ad88}', GC_LV), ('\u{ad89}', '\u{ada3}', GC_LVT), ('\u{ada4}', '\u{ada4}',
+        GC_LV), ('\u{ada5}', '\u{adbf}', GC_LVT), ('\u{adc0}', '\u{adc0}', GC_LV), ('\u{adc1}',
+        '\u{addb}', GC_LVT), ('\u{addc}', '\u{addc}', GC_LV), ('\u{addd}', '\u{adf7}', GC_LVT),
+        ('\u{adf8}', '\u{adf8}', GC_LV), ('\u{adf9}', '\u{ae13}', GC_LVT), ('\u{ae14}', '\u{ae14}',
+        GC_LV), ('\u{ae15}', '\u{ae2f}', GC_LVT), ('\u{ae30}', '\u{ae30}', GC_LV), ('\u{ae31}',
+        '\u{ae4b}', GC_LVT), ('\u{ae4c}', '\u{ae4c}', GC_LV), ('\u{ae4d}', '\u{ae67}', GC_LVT),
+        ('\u{ae68}', '\u{ae68}', GC_LV), ('\u{ae69}', '\u{ae83}', GC_LVT), ('\u{ae84}', '\u{ae84}',
+        GC_LV), ('\u{ae85}', '\u{ae9f}', GC_LVT), ('\u{aea0}', '\u{aea0}', GC_LV), ('\u{aea1}',
+        '\u{aebb}', GC_LVT), ('\u{aebc}', '\u{aebc}', GC_LV), ('\u{aebd}', '\u{aed7}', GC_LVT),
+        ('\u{aed8}', '\u{aed8}', GC_LV), ('\u{aed9}', '\u{aef3}', GC_LVT), ('\u{aef4}', '\u{aef4}',
+        GC_LV), ('\u{aef5}', '\u{af0f}', GC_LVT), ('\u{af10}', '\u{af10}', GC_LV), ('\u{af11}',
+        '\u{af2b}', GC_LVT), ('\u{af2c}', '\u{af2c}', GC_LV), ('\u{af2d}', '\u{af47}', GC_LVT),
+        ('\u{af48}', '\u{af48}', GC_LV), ('\u{af49}', '\u{af63}', GC_LVT), ('\u{af64}', '\u{af64}',
+        GC_LV), ('\u{af65}', '\u{af7f}', GC_LVT), ('\u{af80}', '\u{af80}', GC_LV), ('\u{af81}',
+        '\u{af9b}', GC_LVT), ('\u{af9c}', '\u{af9c}', GC_LV), ('\u{af9d}', '\u{afb7}', GC_LVT),
+        ('\u{afb8}', '\u{afb8}', GC_LV), ('\u{afb9}', '\u{afd3}', GC_LVT), ('\u{afd4}', '\u{afd4}',
+        GC_LV), ('\u{afd5}', '\u{afef}', GC_LVT), ('\u{aff0}', '\u{aff0}', GC_LV), ('\u{aff1}',
+        '\u{b00b}', GC_LVT), ('\u{b00c}', '\u{b00c}', GC_LV), ('\u{b00d}', '\u{b027}', GC_LVT),
+        ('\u{b028}', '\u{b028}', GC_LV), ('\u{b029}', '\u{b043}', GC_LVT), ('\u{b044}', '\u{b044}',
+        GC_LV), ('\u{b045}', '\u{b05f}', GC_LVT), ('\u{b060}', '\u{b060}', GC_LV), ('\u{b061}',
+        '\u{b07b}', GC_LVT), ('\u{b07c}', '\u{b07c}', GC_LV), ('\u{b07d}', '\u{b097}', GC_LVT),
+        ('\u{b098}', '\u{b098}', GC_LV), ('\u{b099}', '\u{b0b3}', GC_LVT), ('\u{b0b4}', '\u{b0b4}',
+        GC_LV), ('\u{b0b5}', '\u{b0cf}', GC_LVT), ('\u{b0d0}', '\u{b0d0}', GC_LV), ('\u{b0d1}',
+        '\u{b0eb}', GC_LVT), ('\u{b0ec}', '\u{b0ec}', GC_LV), ('\u{b0ed}', '\u{b107}', GC_LVT),
+        ('\u{b108}', '\u{b108}', GC_LV), ('\u{b109}', '\u{b123}', GC_LVT), ('\u{b124}', '\u{b124}',
+        GC_LV), ('\u{b125}', '\u{b13f}', GC_LVT), ('\u{b140}', '\u{b140}', GC_LV), ('\u{b141}',
+        '\u{b15b}', GC_LVT), ('\u{b15c}', '\u{b15c}', GC_LV), ('\u{b15d}', '\u{b177}', GC_LVT),
+        ('\u{b178}', '\u{b178}', GC_LV), ('\u{b179}', '\u{b193}', GC_LVT), ('\u{b194}', '\u{b194}',
+        GC_LV), ('\u{b195}', '\u{b1af}', GC_LVT), ('\u{b1b0}', '\u{b1b0}', GC_LV), ('\u{b1b1}',
+        '\u{b1cb}', GC_LVT), ('\u{b1cc}', '\u{b1cc}', GC_LV), ('\u{b1cd}', '\u{b1e7}', GC_LVT),
+        ('\u{b1e8}', '\u{b1e8}', GC_LV), ('\u{b1e9}', '\u{b203}', GC_LVT), ('\u{b204}', '\u{b204}',
+        GC_LV), ('\u{b205}', '\u{b21f}', GC_LVT), ('\u{b220}', '\u{b220}', GC_LV), ('\u{b221}',
+        '\u{b23b}', GC_LVT), ('\u{b23c}', '\u{b23c}', GC_LV), ('\u{b23d}', '\u{b257}', GC_LVT),
+        ('\u{b258}', '\u{b258}', GC_LV), ('\u{b259}', '\u{b273}', GC_LVT), ('\u{b274}', '\u{b274}',
+        GC_LV), ('\u{b275}', '\u{b28f}', GC_LVT), ('\u{b290}', '\u{b290}', GC_LV), ('\u{b291}',
+        '\u{b2ab}', GC_LVT), ('\u{b2ac}', '\u{b2ac}', GC_LV), ('\u{b2ad}', '\u{b2c7}', GC_LVT),
+        ('\u{b2c8}', '\u{b2c8}', GC_LV), ('\u{b2c9}', '\u{b2e3}', GC_LVT), ('\u{b2e4}', '\u{b2e4}',
+        GC_LV), ('\u{b2e5}', '\u{b2ff}', GC_LVT), ('\u{b300}', '\u{b300}', GC_LV), ('\u{b301}',
+        '\u{b31b}', GC_LVT), ('\u{b31c}', '\u{b31c}', GC_LV), ('\u{b31d}', '\u{b337}', GC_LVT),
+        ('\u{b338}', '\u{b338}', GC_LV), ('\u{b339}', '\u{b353}', GC_LVT), ('\u{b354}', '\u{b354}',
+        GC_LV), ('\u{b355}', '\u{b36f}', GC_LVT), ('\u{b370}', '\u{b370}', GC_LV), ('\u{b371}',
+        '\u{b38b}', GC_LVT), ('\u{b38c}', '\u{b38c}', GC_LV), ('\u{b38d}', '\u{b3a7}', GC_LVT),
+        ('\u{b3a8}', '\u{b3a8}', GC_LV), ('\u{b3a9}', '\u{b3c3}', GC_LVT), ('\u{b3c4}', '\u{b3c4}',
+        GC_LV), ('\u{b3c5}', '\u{b3df}', GC_LVT), ('\u{b3e0}', '\u{b3e0}', GC_LV), ('\u{b3e1}',
+        '\u{b3fb}', GC_LVT), ('\u{b3fc}', '\u{b3fc}', GC_LV), ('\u{b3fd}', '\u{b417}', GC_LVT),
+        ('\u{b418}', '\u{b418}', GC_LV), ('\u{b419}', '\u{b433}', GC_LVT), ('\u{b434}', '\u{b434}',
+        GC_LV), ('\u{b435}', '\u{b44f}', GC_LVT), ('\u{b450}', '\u{b450}', GC_LV), ('\u{b451}',
+        '\u{b46b}', GC_LVT), ('\u{b46c}', '\u{b46c}', GC_LV), ('\u{b46d}', '\u{b487}', GC_LVT),
+        ('\u{b488}', '\u{b488}', GC_LV), ('\u{b489}', '\u{b4a3}', GC_LVT), ('\u{b4a4}', '\u{b4a4}',
+        GC_LV), ('\u{b4a5}', '\u{b4bf}', GC_LVT), ('\u{b4c0}', '\u{b4c0}', GC_LV), ('\u{b4c1}',
+        '\u{b4db}', GC_LVT), ('\u{b4dc}', '\u{b4dc}', GC_LV), ('\u{b4dd}', '\u{b4f7}', GC_LVT),
+        ('\u{b4f8}', '\u{b4f8}', GC_LV), ('\u{b4f9}', '\u{b513}', GC_LVT), ('\u{b514}', '\u{b514}',
+        GC_LV), ('\u{b515}', '\u{b52f}', GC_LVT), ('\u{b530}', '\u{b530}', GC_LV), ('\u{b531}',
+        '\u{b54b}', GC_LVT), ('\u{b54c}', '\u{b54c}', GC_LV), ('\u{b54d}', '\u{b567}', GC_LVT),
+        ('\u{b568}', '\u{b568}', GC_LV), ('\u{b569}', '\u{b583}', GC_LVT), ('\u{b584}', '\u{b584}',
+        GC_LV), ('\u{b585}', '\u{b59f}', GC_LVT), ('\u{b5a0}', '\u{b5a0}', GC_LV), ('\u{b5a1}',
+        '\u{b5bb}', GC_LVT), ('\u{b5bc}', '\u{b5bc}', GC_LV), ('\u{b5bd}', '\u{b5d7}', GC_LVT),
+        ('\u{b5d8}', '\u{b5d8}', GC_LV), ('\u{b5d9}', '\u{b5f3}', GC_LVT), ('\u{b5f4}', '\u{b5f4}',
+        GC_LV), ('\u{b5f5}', '\u{b60f}', GC_LVT), ('\u{b610}', '\u{b610}', GC_LV), ('\u{b611}',
+        '\u{b62b}', GC_LVT), ('\u{b62c}', '\u{b62c}', GC_LV), ('\u{b62d}', '\u{b647}', GC_LVT),
+        ('\u{b648}', '\u{b648}', GC_LV), ('\u{b649}', '\u{b663}', GC_LVT), ('\u{b664}', '\u{b664}',
+        GC_LV), ('\u{b665}', '\u{b67f}', GC_LVT), ('\u{b680}', '\u{b680}', GC_LV), ('\u{b681}',
+        '\u{b69b}', GC_LVT), ('\u{b69c}', '\u{b69c}', GC_LV), ('\u{b69d}', '\u{b6b7}', GC_LVT),
+        ('\u{b6b8}', '\u{b6b8}', GC_LV), ('\u{b6b9}', '\u{b6d3}', GC_LVT), ('\u{b6d4}', '\u{b6d4}',
+        GC_LV), ('\u{b6d5}', '\u{b6ef}', GC_LVT), ('\u{b6f0}', '\u{b6f0}', GC_LV), ('\u{b6f1}',
+        '\u{b70b}', GC_LVT), ('\u{b70c}', '\u{b70c}', GC_LV), ('\u{b70d}', '\u{b727}', GC_LVT),
+        ('\u{b728}', '\u{b728}', GC_LV), ('\u{b729}', '\u{b743}', GC_LVT), ('\u{b744}', '\u{b744}',
+        GC_LV), ('\u{b745}', '\u{b75f}', GC_LVT), ('\u{b760}', '\u{b760}', GC_LV), ('\u{b761}',
+        '\u{b77b}', GC_LVT), ('\u{b77c}', '\u{b77c}', GC_LV), ('\u{b77d}', '\u{b797}', GC_LVT),
+        ('\u{b798}', '\u{b798}', GC_LV), ('\u{b799}', '\u{b7b3}', GC_LVT), ('\u{b7b4}', '\u{b7b4}',
+        GC_LV), ('\u{b7b5}', '\u{b7cf}', GC_LVT), ('\u{b7d0}', '\u{b7d0}', GC_LV), ('\u{b7d1}',
+        '\u{b7eb}', GC_LVT), ('\u{b7ec}', '\u{b7ec}', GC_LV), ('\u{b7ed}', '\u{b807}', GC_LVT),
+        ('\u{b808}', '\u{b808}', GC_LV), ('\u{b809}', '\u{b823}', GC_LVT), ('\u{b824}', '\u{b824}',
+        GC_LV), ('\u{b825}', '\u{b83f}', GC_LVT), ('\u{b840}', '\u{b840}', GC_LV), ('\u{b841}',
+        '\u{b85b}', GC_LVT), ('\u{b85c}', '\u{b85c}', GC_LV), ('\u{b85d}', '\u{b877}', GC_LVT),
+        ('\u{b878}', '\u{b878}', GC_LV), ('\u{b879}', '\u{b893}', GC_LVT), ('\u{b894}', '\u{b894}',
+        GC_LV), ('\u{b895}', '\u{b8af}', GC_LVT), ('\u{b8b0}', '\u{b8b0}', GC_LV), ('\u{b8b1}',
+        '\u{b8cb}', GC_LVT), ('\u{b8cc}', '\u{b8cc}', GC_LV), ('\u{b8cd}', '\u{b8e7}', GC_LVT),
+        ('\u{b8e8}', '\u{b8e8}', GC_LV), ('\u{b8e9}', '\u{b903}', GC_LVT), ('\u{b904}', '\u{b904}',
+        GC_LV), ('\u{b905}', '\u{b91f}', GC_LVT), ('\u{b920}', '\u{b920}', GC_LV), ('\u{b921}',
+        '\u{b93b}', GC_LVT), ('\u{b93c}', '\u{b93c}', GC_LV), ('\u{b93d}', '\u{b957}', GC_LVT),
+        ('\u{b958}', '\u{b958}', GC_LV), ('\u{b959}', '\u{b973}', GC_LVT), ('\u{b974}', '\u{b974}',
+        GC_LV), ('\u{b975}', '\u{b98f}', GC_LVT), ('\u{b990}', '\u{b990}', GC_LV), ('\u{b991}',
+        '\u{b9ab}', GC_LVT), ('\u{b9ac}', '\u{b9ac}', GC_LV), ('\u{b9ad}', '\u{b9c7}', GC_LVT),
+        ('\u{b9c8}', '\u{b9c8}', GC_LV), ('\u{b9c9}', '\u{b9e3}', GC_LVT), ('\u{b9e4}', '\u{b9e4}',
+        GC_LV), ('\u{b9e5}', '\u{b9ff}', GC_LVT), ('\u{ba00}', '\u{ba00}', GC_LV), ('\u{ba01}',
+        '\u{ba1b}', GC_LVT), ('\u{ba1c}', '\u{ba1c}', GC_LV), ('\u{ba1d}', '\u{ba37}', GC_LVT),
+        ('\u{ba38}', '\u{ba38}', GC_LV), ('\u{ba39}', '\u{ba53}', GC_LVT), ('\u{ba54}', '\u{ba54}',
+        GC_LV), ('\u{ba55}', '\u{ba6f}', GC_LVT), ('\u{ba70}', '\u{ba70}', GC_LV), ('\u{ba71}',
+        '\u{ba8b}', GC_LVT), ('\u{ba8c}', '\u{ba8c}', GC_LV), ('\u{ba8d}', '\u{baa7}', GC_LVT),
+        ('\u{baa8}', '\u{baa8}', GC_LV), ('\u{baa9}', '\u{bac3}', GC_LVT), ('\u{bac4}', '\u{bac4}',
+        GC_LV), ('\u{bac5}', '\u{badf}', GC_LVT), ('\u{bae0}', '\u{bae0}', GC_LV), ('\u{bae1}',
+        '\u{bafb}', GC_LVT), ('\u{bafc}', '\u{bafc}', GC_LV), ('\u{bafd}', '\u{bb17}', GC_LVT),
+        ('\u{bb18}', '\u{bb18}', GC_LV), ('\u{bb19}', '\u{bb33}', GC_LVT), ('\u{bb34}', '\u{bb34}',
+        GC_LV), ('\u{bb35}', '\u{bb4f}', GC_LVT), ('\u{bb50}', '\u{bb50}', GC_LV), ('\u{bb51}',
+        '\u{bb6b}', GC_LVT), ('\u{bb6c}', '\u{bb6c}', GC_LV), ('\u{bb6d}', '\u{bb87}', GC_LVT),
+        ('\u{bb88}', '\u{bb88}', GC_LV), ('\u{bb89}', '\u{bba3}', GC_LVT), ('\u{bba4}', '\u{bba4}',
+        GC_LV), ('\u{bba5}', '\u{bbbf}', GC_LVT), ('\u{bbc0}', '\u{bbc0}', GC_LV), ('\u{bbc1}',
+        '\u{bbdb}', GC_LVT), ('\u{bbdc}', '\u{bbdc}', GC_LV), ('\u{bbdd}', '\u{bbf7}', GC_LVT),
+        ('\u{bbf8}', '\u{bbf8}', GC_LV), ('\u{bbf9}', '\u{bc13}', GC_LVT), ('\u{bc14}', '\u{bc14}',
+        GC_LV), ('\u{bc15}', '\u{bc2f}', GC_LVT), ('\u{bc30}', '\u{bc30}', GC_LV), ('\u{bc31}',
+        '\u{bc4b}', GC_LVT), ('\u{bc4c}', '\u{bc4c}', GC_LV), ('\u{bc4d}', '\u{bc67}', GC_LVT),
+        ('\u{bc68}', '\u{bc68}', GC_LV), ('\u{bc69}', '\u{bc83}', GC_LVT), ('\u{bc84}', '\u{bc84}',
+        GC_LV), ('\u{bc85}', '\u{bc9f}', GC_LVT), ('\u{bca0}', '\u{bca0}', GC_LV), ('\u{bca1}',
+        '\u{bcbb}', GC_LVT), ('\u{bcbc}', '\u{bcbc}', GC_LV), ('\u{bcbd}', '\u{bcd7}', GC_LVT),
+        ('\u{bcd8}', '\u{bcd8}', GC_LV), ('\u{bcd9}', '\u{bcf3}', GC_LVT), ('\u{bcf4}', '\u{bcf4}',
+        GC_LV), ('\u{bcf5}', '\u{bd0f}', GC_LVT), ('\u{bd10}', '\u{bd10}', GC_LV), ('\u{bd11}',
+        '\u{bd2b}', GC_LVT), ('\u{bd2c}', '\u{bd2c}', GC_LV), ('\u{bd2d}', '\u{bd47}', GC_LVT),
+        ('\u{bd48}', '\u{bd48}', GC_LV), ('\u{bd49}', '\u{bd63}', GC_LVT), ('\u{bd64}', '\u{bd64}',
+        GC_LV), ('\u{bd65}', '\u{bd7f}', GC_LVT), ('\u{bd80}', '\u{bd80}', GC_LV), ('\u{bd81}',
+        '\u{bd9b}', GC_LVT), ('\u{bd9c}', '\u{bd9c}', GC_LV), ('\u{bd9d}', '\u{bdb7}', GC_LVT),
+        ('\u{bdb8}', '\u{bdb8}', GC_LV), ('\u{bdb9}', '\u{bdd3}', GC_LVT), ('\u{bdd4}', '\u{bdd4}',
+        GC_LV), ('\u{bdd5}', '\u{bdef}', GC_LVT), ('\u{bdf0}', '\u{bdf0}', GC_LV), ('\u{bdf1}',
+        '\u{be0b}', GC_LVT), ('\u{be0c}', '\u{be0c}', GC_LV), ('\u{be0d}', '\u{be27}', GC_LVT),
+        ('\u{be28}', '\u{be28}', GC_LV), ('\u{be29}', '\u{be43}', GC_LVT), ('\u{be44}', '\u{be44}',
+        GC_LV), ('\u{be45}', '\u{be5f}', GC_LVT), ('\u{be60}', '\u{be60}', GC_LV), ('\u{be61}',
+        '\u{be7b}', GC_LVT), ('\u{be7c}', '\u{be7c}', GC_LV), ('\u{be7d}', '\u{be97}', GC_LVT),
+        ('\u{be98}', '\u{be98}', GC_LV), ('\u{be99}', '\u{beb3}', GC_LVT), ('\u{beb4}', '\u{beb4}',
+        GC_LV), ('\u{beb5}', '\u{becf}', GC_LVT), ('\u{bed0}', '\u{bed0}', GC_LV), ('\u{bed1}',
+        '\u{beeb}', GC_LVT), ('\u{beec}', '\u{beec}', GC_LV), ('\u{beed}', '\u{bf07}', GC_LVT),
+        ('\u{bf08}', '\u{bf08}', GC_LV), ('\u{bf09}', '\u{bf23}', GC_LVT), ('\u{bf24}', '\u{bf24}',
+        GC_LV), ('\u{bf25}', '\u{bf3f}', GC_LVT), ('\u{bf40}', '\u{bf40}', GC_LV), ('\u{bf41}',
+        '\u{bf5b}', GC_LVT), ('\u{bf5c}', '\u{bf5c}', GC_LV), ('\u{bf5d}', '\u{bf77}', GC_LVT),
+        ('\u{bf78}', '\u{bf78}', GC_LV), ('\u{bf79}', '\u{bf93}', GC_LVT), ('\u{bf94}', '\u{bf94}',
+        GC_LV), ('\u{bf95}', '\u{bfaf}', GC_LVT), ('\u{bfb0}', '\u{bfb0}', GC_LV), ('\u{bfb1}',
+        '\u{bfcb}', GC_LVT), ('\u{bfcc}', '\u{bfcc}', GC_LV), ('\u{bfcd}', '\u{bfe7}', GC_LVT),
+        ('\u{bfe8}', '\u{bfe8}', GC_LV), ('\u{bfe9}', '\u{c003}', GC_LVT), ('\u{c004}', '\u{c004}',
+        GC_LV), ('\u{c005}', '\u{c01f}', GC_LVT), ('\u{c020}', '\u{c020}', GC_LV), ('\u{c021}',
+        '\u{c03b}', GC_LVT), ('\u{c03c}', '\u{c03c}', GC_LV), ('\u{c03d}', '\u{c057}', GC_LVT),
+        ('\u{c058}', '\u{c058}', GC_LV), ('\u{c059}', '\u{c073}', GC_LVT), ('\u{c074}', '\u{c074}',
+        GC_LV), ('\u{c075}', '\u{c08f}', GC_LVT), ('\u{c090}', '\u{c090}', GC_LV), ('\u{c091}',
+        '\u{c0ab}', GC_LVT), ('\u{c0ac}', '\u{c0ac}', GC_LV), ('\u{c0ad}', '\u{c0c7}', GC_LVT),
+        ('\u{c0c8}', '\u{c0c8}', GC_LV), ('\u{c0c9}', '\u{c0e3}', GC_LVT), ('\u{c0e4}', '\u{c0e4}',
+        GC_LV), ('\u{c0e5}', '\u{c0ff}', GC_LVT), ('\u{c100}', '\u{c100}', GC_LV), ('\u{c101}',
+        '\u{c11b}', GC_LVT), ('\u{c11c}', '\u{c11c}', GC_LV), ('\u{c11d}', '\u{c137}', GC_LVT),
+        ('\u{c138}', '\u{c138}', GC_LV), ('\u{c139}', '\u{c153}', GC_LVT), ('\u{c154}', '\u{c154}',
+        GC_LV), ('\u{c155}', '\u{c16f}', GC_LVT), ('\u{c170}', '\u{c170}', GC_LV), ('\u{c171}',
+        '\u{c18b}', GC_LVT), ('\u{c18c}', '\u{c18c}', GC_LV), ('\u{c18d}', '\u{c1a7}', GC_LVT),
+        ('\u{c1a8}', '\u{c1a8}', GC_LV), ('\u{c1a9}', '\u{c1c3}', GC_LVT), ('\u{c1c4}', '\u{c1c4}',
+        GC_LV), ('\u{c1c5}', '\u{c1df}', GC_LVT), ('\u{c1e0}', '\u{c1e0}', GC_LV), ('\u{c1e1}',
+        '\u{c1fb}', GC_LVT), ('\u{c1fc}', '\u{c1fc}', GC_LV), ('\u{c1fd}', '\u{c217}', GC_LVT),
+        ('\u{c218}', '\u{c218}', GC_LV), ('\u{c219}', '\u{c233}', GC_LVT), ('\u{c234}', '\u{c234}',
+        GC_LV), ('\u{c235}', '\u{c24f}', GC_LVT), ('\u{c250}', '\u{c250}', GC_LV), ('\u{c251}',
+        '\u{c26b}', GC_LVT), ('\u{c26c}', '\u{c26c}', GC_LV), ('\u{c26d}', '\u{c287}', GC_LVT),
+        ('\u{c288}', '\u{c288}', GC_LV), ('\u{c289}', '\u{c2a3}', GC_LVT), ('\u{c2a4}', '\u{c2a4}',
+        GC_LV), ('\u{c2a5}', '\u{c2bf}', GC_LVT), ('\u{c2c0}', '\u{c2c0}', GC_LV), ('\u{c2c1}',
+        '\u{c2db}', GC_LVT), ('\u{c2dc}', '\u{c2dc}', GC_LV), ('\u{c2dd}', '\u{c2f7}', GC_LVT),
+        ('\u{c2f8}', '\u{c2f8}', GC_LV), ('\u{c2f9}', '\u{c313}', GC_LVT), ('\u{c314}', '\u{c314}',
+        GC_LV), ('\u{c315}', '\u{c32f}', GC_LVT), ('\u{c330}', '\u{c330}', GC_LV), ('\u{c331}',
+        '\u{c34b}', GC_LVT), ('\u{c34c}', '\u{c34c}', GC_LV), ('\u{c34d}', '\u{c367}', GC_LVT),
+        ('\u{c368}', '\u{c368}', GC_LV), ('\u{c369}', '\u{c383}', GC_LVT), ('\u{c384}', '\u{c384}',
+        GC_LV), ('\u{c385}', '\u{c39f}', GC_LVT), ('\u{c3a0}', '\u{c3a0}', GC_LV), ('\u{c3a1}',
+        '\u{c3bb}', GC_LVT), ('\u{c3bc}', '\u{c3bc}', GC_LV), ('\u{c3bd}', '\u{c3d7}', GC_LVT),
+        ('\u{c3d8}', '\u{c3d8}', GC_LV), ('\u{c3d9}', '\u{c3f3}', GC_LVT), ('\u{c3f4}', '\u{c3f4}',
+        GC_LV), ('\u{c3f5}', '\u{c40f}', GC_LVT), ('\u{c410}', '\u{c410}', GC_LV), ('\u{c411}',
+        '\u{c42b}', GC_LVT), ('\u{c42c}', '\u{c42c}', GC_LV), ('\u{c42d}', '\u{c447}', GC_LVT),
+        ('\u{c448}', '\u{c448}', GC_LV), ('\u{c449}', '\u{c463}', GC_LVT), ('\u{c464}', '\u{c464}',
+        GC_LV), ('\u{c465}', '\u{c47f}', GC_LVT), ('\u{c480}', '\u{c480}', GC_LV), ('\u{c481}',
+        '\u{c49b}', GC_LVT), ('\u{c49c}', '\u{c49c}', GC_LV), ('\u{c49d}', '\u{c4b7}', GC_LVT),
+        ('\u{c4b8}', '\u{c4b8}', GC_LV), ('\u{c4b9}', '\u{c4d3}', GC_LVT), ('\u{c4d4}', '\u{c4d4}',
+        GC_LV), ('\u{c4d5}', '\u{c4ef}', GC_LVT), ('\u{c4f0}', '\u{c4f0}', GC_LV), ('\u{c4f1}',
+        '\u{c50b}', GC_LVT), ('\u{c50c}', '\u{c50c}', GC_LV), ('\u{c50d}', '\u{c527}', GC_LVT),
+        ('\u{c528}', '\u{c528}', GC_LV), ('\u{c529}', '\u{c543}', GC_LVT), ('\u{c544}', '\u{c544}',
+        GC_LV), ('\u{c545}', '\u{c55f}', GC_LVT), ('\u{c560}', '\u{c560}', GC_LV), ('\u{c561}',
+        '\u{c57b}', GC_LVT), ('\u{c57c}', '\u{c57c}', GC_LV), ('\u{c57d}', '\u{c597}', GC_LVT),
+        ('\u{c598}', '\u{c598}', GC_LV), ('\u{c599}', '\u{c5b3}', GC_LVT), ('\u{c5b4}', '\u{c5b4}',
+        GC_LV), ('\u{c5b5}', '\u{c5cf}', GC_LVT), ('\u{c5d0}', '\u{c5d0}', GC_LV), ('\u{c5d1}',
+        '\u{c5eb}', GC_LVT), ('\u{c5ec}', '\u{c5ec}', GC_LV), ('\u{c5ed}', '\u{c607}', GC_LVT),
+        ('\u{c608}', '\u{c608}', GC_LV), ('\u{c609}', '\u{c623}', GC_LVT), ('\u{c624}', '\u{c624}',
+        GC_LV), ('\u{c625}', '\u{c63f}', GC_LVT), ('\u{c640}', '\u{c640}', GC_LV), ('\u{c641}',
+        '\u{c65b}', GC_LVT), ('\u{c65c}', '\u{c65c}', GC_LV), ('\u{c65d}', '\u{c677}', GC_LVT),
+        ('\u{c678}', '\u{c678}', GC_LV), ('\u{c679}', '\u{c693}', GC_LVT), ('\u{c694}', '\u{c694}',
+        GC_LV), ('\u{c695}', '\u{c6af}', GC_LVT), ('\u{c6b0}', '\u{c6b0}', GC_LV), ('\u{c6b1}',
+        '\u{c6cb}', GC_LVT), ('\u{c6cc}', '\u{c6cc}', GC_LV), ('\u{c6cd}', '\u{c6e7}', GC_LVT),
+        ('\u{c6e8}', '\u{c6e8}', GC_LV), ('\u{c6e9}', '\u{c703}', GC_LVT), ('\u{c704}', '\u{c704}',
+        GC_LV), ('\u{c705}', '\u{c71f}', GC_LVT), ('\u{c720}', '\u{c720}', GC_LV), ('\u{c721}',
+        '\u{c73b}', GC_LVT), ('\u{c73c}', '\u{c73c}', GC_LV), ('\u{c73d}', '\u{c757}', GC_LVT),
+        ('\u{c758}', '\u{c758}', GC_LV), ('\u{c759}', '\u{c773}', GC_LVT), ('\u{c774}', '\u{c774}',
+        GC_LV), ('\u{c775}', '\u{c78f}', GC_LVT), ('\u{c790}', '\u{c790}', GC_LV), ('\u{c791}',
+        '\u{c7ab}', GC_LVT), ('\u{c7ac}', '\u{c7ac}', GC_LV), ('\u{c7ad}', '\u{c7c7}', GC_LVT),
+        ('\u{c7c8}', '\u{c7c8}', GC_LV), ('\u{c7c9}', '\u{c7e3}', GC_LVT), ('\u{c7e4}', '\u{c7e4}',
+        GC_LV), ('\u{c7e5}', '\u{c7ff}', GC_LVT), ('\u{c800}', '\u{c800}', GC_LV), ('\u{c801}',
+        '\u{c81b}', GC_LVT), ('\u{c81c}', '\u{c81c}', GC_LV), ('\u{c81d}', '\u{c837}', GC_LVT),
+        ('\u{c838}', '\u{c838}', GC_LV), ('\u{c839}', '\u{c853}', GC_LVT), ('\u{c854}', '\u{c854}',
+        GC_LV), ('\u{c855}', '\u{c86f}', GC_LVT), ('\u{c870}', '\u{c870}', GC_LV), ('\u{c871}',
+        '\u{c88b}', GC_LVT), ('\u{c88c}', '\u{c88c}', GC_LV), ('\u{c88d}', '\u{c8a7}', GC_LVT),
+        ('\u{c8a8}', '\u{c8a8}', GC_LV), ('\u{c8a9}', '\u{c8c3}', GC_LVT), ('\u{c8c4}', '\u{c8c4}',
+        GC_LV), ('\u{c8c5}', '\u{c8df}', GC_LVT), ('\u{c8e0}', '\u{c8e0}', GC_LV), ('\u{c8e1}',
+        '\u{c8fb}', GC_LVT), ('\u{c8fc}', '\u{c8fc}', GC_LV), ('\u{c8fd}', '\u{c917}', GC_LVT),
+        ('\u{c918}', '\u{c918}', GC_LV), ('\u{c919}', '\u{c933}', GC_LVT), ('\u{c934}', '\u{c934}',
+        GC_LV), ('\u{c935}', '\u{c94f}', GC_LVT), ('\u{c950}', '\u{c950}', GC_LV), ('\u{c951}',
+        '\u{c96b}', GC_LVT), ('\u{c96c}', '\u{c96c}', GC_LV), ('\u{c96d}', '\u{c987}', GC_LVT),
+        ('\u{c988}', '\u{c988}', GC_LV), ('\u{c989}', '\u{c9a3}', GC_LVT), ('\u{c9a4}', '\u{c9a4}',
+        GC_LV), ('\u{c9a5}', '\u{c9bf}', GC_LVT), ('\u{c9c0}', '\u{c9c0}', GC_LV), ('\u{c9c1}',
+        '\u{c9db}', GC_LVT), ('\u{c9dc}', '\u{c9dc}', GC_LV), ('\u{c9dd}', '\u{c9f7}', GC_LVT),
+        ('\u{c9f8}', '\u{c9f8}', GC_LV), ('\u{c9f9}', '\u{ca13}', GC_LVT), ('\u{ca14}', '\u{ca14}',
+        GC_LV), ('\u{ca15}', '\u{ca2f}', GC_LVT), ('\u{ca30}', '\u{ca30}', GC_LV), ('\u{ca31}',
+        '\u{ca4b}', GC_LVT), ('\u{ca4c}', '\u{ca4c}', GC_LV), ('\u{ca4d}', '\u{ca67}', GC_LVT),
+        ('\u{ca68}', '\u{ca68}', GC_LV), ('\u{ca69}', '\u{ca83}', GC_LVT), ('\u{ca84}', '\u{ca84}',
+        GC_LV), ('\u{ca85}', '\u{ca9f}', GC_LVT), ('\u{caa0}', '\u{caa0}', GC_LV), ('\u{caa1}',
+        '\u{cabb}', GC_LVT), ('\u{cabc}', '\u{cabc}', GC_LV), ('\u{cabd}', '\u{cad7}', GC_LVT),
+        ('\u{cad8}', '\u{cad8}', GC_LV), ('\u{cad9}', '\u{caf3}', GC_LVT), ('\u{caf4}', '\u{caf4}',
+        GC_LV), ('\u{caf5}', '\u{cb0f}', GC_LVT), ('\u{cb10}', '\u{cb10}', GC_LV), ('\u{cb11}',
+        '\u{cb2b}', GC_LVT), ('\u{cb2c}', '\u{cb2c}', GC_LV), ('\u{cb2d}', '\u{cb47}', GC_LVT),
+        ('\u{cb48}', '\u{cb48}', GC_LV), ('\u{cb49}', '\u{cb63}', GC_LVT), ('\u{cb64}', '\u{cb64}',
+        GC_LV), ('\u{cb65}', '\u{cb7f}', GC_LVT), ('\u{cb80}', '\u{cb80}', GC_LV), ('\u{cb81}',
+        '\u{cb9b}', GC_LVT), ('\u{cb9c}', '\u{cb9c}', GC_LV), ('\u{cb9d}', '\u{cbb7}', GC_LVT),
+        ('\u{cbb8}', '\u{cbb8}', GC_LV), ('\u{cbb9}', '\u{cbd3}', GC_LVT), ('\u{cbd4}', '\u{cbd4}',
+        GC_LV), ('\u{cbd5}', '\u{cbef}', GC_LVT), ('\u{cbf0}', '\u{cbf0}', GC_LV), ('\u{cbf1}',
+        '\u{cc0b}', GC_LVT), ('\u{cc0c}', '\u{cc0c}', GC_LV), ('\u{cc0d}', '\u{cc27}', GC_LVT),
+        ('\u{cc28}', '\u{cc28}', GC_LV), ('\u{cc29}', '\u{cc43}', GC_LVT), ('\u{cc44}', '\u{cc44}',
+        GC_LV), ('\u{cc45}', '\u{cc5f}', GC_LVT), ('\u{cc60}', '\u{cc60}', GC_LV), ('\u{cc61}',
+        '\u{cc7b}', GC_LVT), ('\u{cc7c}', '\u{cc7c}', GC_LV), ('\u{cc7d}', '\u{cc97}', GC_LVT),
+        ('\u{cc98}', '\u{cc98}', GC_LV), ('\u{cc99}', '\u{ccb3}', GC_LVT), ('\u{ccb4}', '\u{ccb4}',
+        GC_LV), ('\u{ccb5}', '\u{cccf}', GC_LVT), ('\u{ccd0}', '\u{ccd0}', GC_LV), ('\u{ccd1}',
+        '\u{cceb}', GC_LVT), ('\u{ccec}', '\u{ccec}', GC_LV), ('\u{cced}', '\u{cd07}', GC_LVT),
+        ('\u{cd08}', '\u{cd08}', GC_LV), ('\u{cd09}', '\u{cd23}', GC_LVT), ('\u{cd24}', '\u{cd24}',
+        GC_LV), ('\u{cd25}', '\u{cd3f}', GC_LVT), ('\u{cd40}', '\u{cd40}', GC_LV), ('\u{cd41}',
+        '\u{cd5b}', GC_LVT), ('\u{cd5c}', '\u{cd5c}', GC_LV), ('\u{cd5d}', '\u{cd77}', GC_LVT),
+        ('\u{cd78}', '\u{cd78}', GC_LV), ('\u{cd79}', '\u{cd93}', GC_LVT), ('\u{cd94}', '\u{cd94}',
+        GC_LV), ('\u{cd95}', '\u{cdaf}', GC_LVT), ('\u{cdb0}', '\u{cdb0}', GC_LV), ('\u{cdb1}',
+        '\u{cdcb}', GC_LVT), ('\u{cdcc}', '\u{cdcc}', GC_LV), ('\u{cdcd}', '\u{cde7}', GC_LVT),
+        ('\u{cde8}', '\u{cde8}', GC_LV), ('\u{cde9}', '\u{ce03}', GC_LVT), ('\u{ce04}', '\u{ce04}',
+        GC_LV), ('\u{ce05}', '\u{ce1f}', GC_LVT), ('\u{ce20}', '\u{ce20}', GC_LV), ('\u{ce21}',
+        '\u{ce3b}', GC_LVT), ('\u{ce3c}', '\u{ce3c}', GC_LV), ('\u{ce3d}', '\u{ce57}', GC_LVT),
+        ('\u{ce58}', '\u{ce58}', GC_LV), ('\u{ce59}', '\u{ce73}', GC_LVT), ('\u{ce74}', '\u{ce74}',
+        GC_LV), ('\u{ce75}', '\u{ce8f}', GC_LVT), ('\u{ce90}', '\u{ce90}', GC_LV), ('\u{ce91}',
+        '\u{ceab}', GC_LVT), ('\u{ceac}', '\u{ceac}', GC_LV), ('\u{cead}', '\u{cec7}', GC_LVT),
+        ('\u{cec8}', '\u{cec8}', GC_LV), ('\u{cec9}', '\u{cee3}', GC_LVT), ('\u{cee4}', '\u{cee4}',
+        GC_LV), ('\u{cee5}', '\u{ceff}', GC_LVT), ('\u{cf00}', '\u{cf00}', GC_LV), ('\u{cf01}',
+        '\u{cf1b}', GC_LVT), ('\u{cf1c}', '\u{cf1c}', GC_LV), ('\u{cf1d}', '\u{cf37}', GC_LVT),
+        ('\u{cf38}', '\u{cf38}', GC_LV), ('\u{cf39}', '\u{cf53}', GC_LVT), ('\u{cf54}', '\u{cf54}',
+        GC_LV), ('\u{cf55}', '\u{cf6f}', GC_LVT), ('\u{cf70}', '\u{cf70}', GC_LV), ('\u{cf71}',
+        '\u{cf8b}', GC_LVT), ('\u{cf8c}', '\u{cf8c}', GC_LV), ('\u{cf8d}', '\u{cfa7}', GC_LVT),
+        ('\u{cfa8}', '\u{cfa8}', GC_LV), ('\u{cfa9}', '\u{cfc3}', GC_LVT), ('\u{cfc4}', '\u{cfc4}',
+        GC_LV), ('\u{cfc5}', '\u{cfdf}', GC_LVT), ('\u{cfe0}', '\u{cfe0}', GC_LV), ('\u{cfe1}',
+        '\u{cffb}', GC_LVT), ('\u{cffc}', '\u{cffc}', GC_LV), ('\u{cffd}', '\u{d017}', GC_LVT),
+        ('\u{d018}', '\u{d018}', GC_LV), ('\u{d019}', '\u{d033}', GC_LVT), ('\u{d034}', '\u{d034}',
+        GC_LV), ('\u{d035}', '\u{d04f}', GC_LVT), ('\u{d050}', '\u{d050}', GC_LV), ('\u{d051}',
+        '\u{d06b}', GC_LVT), ('\u{d06c}', '\u{d06c}', GC_LV), ('\u{d06d}', '\u{d087}', GC_LVT),
+        ('\u{d088}', '\u{d088}', GC_LV), ('\u{d089}', '\u{d0a3}', GC_LVT), ('\u{d0a4}', '\u{d0a4}',
+        GC_LV), ('\u{d0a5}', '\u{d0bf}', GC_LVT), ('\u{d0c0}', '\u{d0c0}', GC_LV), ('\u{d0c1}',
+        '\u{d0db}', GC_LVT), ('\u{d0dc}', '\u{d0dc}', GC_LV), ('\u{d0dd}', '\u{d0f7}', GC_LVT),
+        ('\u{d0f8}', '\u{d0f8}', GC_LV), ('\u{d0f9}', '\u{d113}', GC_LVT), ('\u{d114}', '\u{d114}',
+        GC_LV), ('\u{d115}', '\u{d12f}', GC_LVT), ('\u{d130}', '\u{d130}', GC_LV), ('\u{d131}',
+        '\u{d14b}', GC_LVT), ('\u{d14c}', '\u{d14c}', GC_LV), ('\u{d14d}', '\u{d167}', GC_LVT),
+        ('\u{d168}', '\u{d168}', GC_LV), ('\u{d169}', '\u{d183}', GC_LVT), ('\u{d184}', '\u{d184}',
+        GC_LV), ('\u{d185}', '\u{d19f}', GC_LVT), ('\u{d1a0}', '\u{d1a0}', GC_LV), ('\u{d1a1}',
+        '\u{d1bb}', GC_LVT), ('\u{d1bc}', '\u{d1bc}', GC_LV), ('\u{d1bd}', '\u{d1d7}', GC_LVT),
+        ('\u{d1d8}', '\u{d1d8}', GC_LV), ('\u{d1d9}', '\u{d1f3}', GC_LVT), ('\u{d1f4}', '\u{d1f4}',
+        GC_LV), ('\u{d1f5}', '\u{d20f}', GC_LVT), ('\u{d210}', '\u{d210}', GC_LV), ('\u{d211}',
+        '\u{d22b}', GC_LVT), ('\u{d22c}', '\u{d22c}', GC_LV), ('\u{d22d}', '\u{d247}', GC_LVT),
+        ('\u{d248}', '\u{d248}', GC_LV), ('\u{d249}', '\u{d263}', GC_LVT), ('\u{d264}', '\u{d264}',
+        GC_LV), ('\u{d265}', '\u{d27f}', GC_LVT), ('\u{d280}', '\u{d280}', GC_LV), ('\u{d281}',
+        '\u{d29b}', GC_LVT), ('\u{d29c}', '\u{d29c}', GC_LV), ('\u{d29d}', '\u{d2b7}', GC_LVT),
+        ('\u{d2b8}', '\u{d2b8}', GC_LV), ('\u{d2b9}', '\u{d2d3}', GC_LVT), ('\u{d2d4}', '\u{d2d4}',
+        GC_LV), ('\u{d2d5}', '\u{d2ef}', GC_LVT), ('\u{d2f0}', '\u{d2f0}', GC_LV), ('\u{d2f1}',
+        '\u{d30b}', GC_LVT), ('\u{d30c}', '\u{d30c}', GC_LV), ('\u{d30d}', '\u{d327}', GC_LVT),
+        ('\u{d328}', '\u{d328}', GC_LV), ('\u{d329}', '\u{d343}', GC_LVT), ('\u{d344}', '\u{d344}',
+        GC_LV), ('\u{d345}', '\u{d35f}', GC_LVT), ('\u{d360}', '\u{d360}', GC_LV), ('\u{d361}',
+        '\u{d37b}', GC_LVT), ('\u{d37c}', '\u{d37c}', GC_LV), ('\u{d37d}', '\u{d397}', GC_LVT),
+        ('\u{d398}', '\u{d398}', GC_LV), ('\u{d399}', '\u{d3b3}', GC_LVT), ('\u{d3b4}', '\u{d3b4}',
+        GC_LV), ('\u{d3b5}', '\u{d3cf}', GC_LVT), ('\u{d3d0}', '\u{d3d0}', GC_LV), ('\u{d3d1}',
+        '\u{d3eb}', GC_LVT), ('\u{d3ec}', '\u{d3ec}', GC_LV), ('\u{d3ed}', '\u{d407}', GC_LVT),
+        ('\u{d408}', '\u{d408}', GC_LV), ('\u{d409}', '\u{d423}', GC_LVT), ('\u{d424}', '\u{d424}',
+        GC_LV), ('\u{d425}', '\u{d43f}', GC_LVT), ('\u{d440}', '\u{d440}', GC_LV), ('\u{d441}',
+        '\u{d45b}', GC_LVT), ('\u{d45c}', '\u{d45c}', GC_LV), ('\u{d45d}', '\u{d477}', GC_LVT),
+        ('\u{d478}', '\u{d478}', GC_LV), ('\u{d479}', '\u{d493}', GC_LVT), ('\u{d494}', '\u{d494}',
+        GC_LV), ('\u{d495}', '\u{d4af}', GC_LVT), ('\u{d4b0}', '\u{d4b0}', GC_LV), ('\u{d4b1}',
+        '\u{d4cb}', GC_LVT), ('\u{d4cc}', '\u{d4cc}', GC_LV), ('\u{d4cd}', '\u{d4e7}', GC_LVT),
+        ('\u{d4e8}', '\u{d4e8}', GC_LV), ('\u{d4e9}', '\u{d503}', GC_LVT), ('\u{d504}', '\u{d504}',
+        GC_LV), ('\u{d505}', '\u{d51f}', GC_LVT), ('\u{d520}', '\u{d520}', GC_LV), ('\u{d521}',
+        '\u{d53b}', GC_LVT), ('\u{d53c}', '\u{d53c}', GC_LV), ('\u{d53d}', '\u{d557}', GC_LVT),
+        ('\u{d558}', '\u{d558}', GC_LV), ('\u{d559}', '\u{d573}', GC_LVT), ('\u{d574}', '\u{d574}',
+        GC_LV), ('\u{d575}', '\u{d58f}', GC_LVT), ('\u{d590}', '\u{d590}', GC_LV), ('\u{d591}',
+        '\u{d5ab}', GC_LVT), ('\u{d5ac}', '\u{d5ac}', GC_LV), ('\u{d5ad}', '\u{d5c7}', GC_LVT),
+        ('\u{d5c8}', '\u{d5c8}', GC_LV), ('\u{d5c9}', '\u{d5e3}', GC_LVT), ('\u{d5e4}', '\u{d5e4}',
+        GC_LV), ('\u{d5e5}', '\u{d5ff}', GC_LVT), ('\u{d600}', '\u{d600}', GC_LV), ('\u{d601}',
+        '\u{d61b}', GC_LVT), ('\u{d61c}', '\u{d61c}', GC_LV), ('\u{d61d}', '\u{d637}', GC_LVT),
+        ('\u{d638}', '\u{d638}', GC_LV), ('\u{d639}', '\u{d653}', GC_LVT), ('\u{d654}', '\u{d654}',
+        GC_LV), ('\u{d655}', '\u{d66f}', GC_LVT), ('\u{d670}', '\u{d670}', GC_LV), ('\u{d671}',
+        '\u{d68b}', GC_LVT), ('\u{d68c}', '\u{d68c}', GC_LV), ('\u{d68d}', '\u{d6a7}', GC_LVT),
+        ('\u{d6a8}', '\u{d6a8}', GC_LV), ('\u{d6a9}', '\u{d6c3}', GC_LVT), ('\u{d6c4}', '\u{d6c4}',
+        GC_LV), ('\u{d6c5}', '\u{d6df}', GC_LVT), ('\u{d6e0}', '\u{d6e0}', GC_LV), ('\u{d6e1}',
+        '\u{d6fb}', GC_LVT), ('\u{d6fc}', '\u{d6fc}', GC_LV), ('\u{d6fd}', '\u{d717}', GC_LVT),
+        ('\u{d718}', '\u{d718}', GC_LV), ('\u{d719}', '\u{d733}', GC_LVT), ('\u{d734}', '\u{d734}',
+        GC_LV), ('\u{d735}', '\u{d74f}', GC_LVT), ('\u{d750}', '\u{d750}', GC_LV), ('\u{d751}',
+        '\u{d76b}', GC_LVT), ('\u{d76c}', '\u{d76c}', GC_LV), ('\u{d76d}', '\u{d787}', GC_LVT),
+        ('\u{d788}', '\u{d788}', GC_LV), ('\u{d789}', '\u{d7a3}', GC_LVT), ('\u{d7b0}', '\u{d7c6}',
+        GC_V), ('\u{d7cb}', '\u{d7fb}', GC_T), ('\u{fb1e}', '\u{fb1e}', GC_Extend), ('\u{fe00}',
+        '\u{fe0f}', GC_Extend), ('\u{fe20}', '\u{fe2f}', GC_Extend), ('\u{feff}', '\u{feff}',
+        GC_Control), ('\u{ff9e}', '\u{ff9f}', GC_Extend), ('\u{fff0}', '\u{fffb}', GC_Control),
+        ('\u{101fd}', '\u{101fd}', GC_Extend), ('\u{102e0}', '\u{102e0}', GC_Extend), ('\u{10376}',
+        '\u{1037a}', GC_Extend), ('\u{10a01}', '\u{10a03}', GC_Extend), ('\u{10a05}', '\u{10a06}',
+        GC_Extend), ('\u{10a0c}', '\u{10a0f}', GC_Extend), ('\u{10a38}', '\u{10a3a}', GC_Extend),
+        ('\u{10a3f}', '\u{10a3f}', GC_Extend), ('\u{10ae5}', '\u{10ae6}', GC_Extend), ('\u{10d24}',
+        '\u{10d27}', GC_Extend), ('\u{10d69}', '\u{10d6d}', GC_Extend), ('\u{10eab}', '\u{10eac}',
+        GC_Extend), ('\u{10efc}', '\u{10eff}', GC_Extend), ('\u{10f46}', '\u{10f50}', GC_Extend),
+        ('\u{10f82}', '\u{10f85}', GC_Extend), ('\u{11000}', '\u{11000}', GC_SpacingMark),
+        ('\u{11001}', '\u{11001}', GC_Extend), ('\u{11002}', '\u{11002}', GC_SpacingMark),
+        ('\u{11038}', '\u{11046}', GC_Extend), ('\u{11070}', '\u{11070}', GC_Extend), ('\u{11073}',
+        '\u{11074}', GC_Extend), ('\u{1107f}', '\u{11081}', GC_Extend), ('\u{11082}', '\u{11082}',
+        GC_SpacingMark), ('\u{110b0}', '\u{110b2}', GC_SpacingMark), ('\u{110b3}', '\u{110b6}',
+        GC_Extend), ('\u{110b7}', '\u{110b8}', GC_SpacingMark), ('\u{110b9}', '\u{110ba}',
+        GC_Extend), ('\u{110bd}', '\u{110bd}', GC_Prepend), ('\u{110c2}', '\u{110c2}', GC_Extend),
+        ('\u{110cd}', '\u{110cd}', GC_Prepend), ('\u{11100}', '\u{11102}', GC_Extend), ('\u{11127}',
+        '\u{1112b}', GC_Extend), ('\u{1112c}', '\u{1112c}', GC_SpacingMark), ('\u{1112d}',
+        '\u{11134}', GC_Extend), ('\u{11145}', '\u{11146}', GC_SpacingMark), ('\u{11173}',
+        '\u{11173}', GC_Extend), ('\u{11180}', '\u{11181}', GC_Extend), ('\u{11182}', '\u{11182}',
+        GC_SpacingMark), ('\u{111b3}', '\u{111b5}', GC_SpacingMark), ('\u{111b6}', '\u{111be}',
+        GC_Extend), ('\u{111bf}', '\u{111bf}', GC_SpacingMark), ('\u{111c0}', '\u{111c0}',
+        GC_Extend), ('\u{111c2}', '\u{111c3}', GC_Prepend), ('\u{111c9}', '\u{111cc}', GC_Extend),
+        ('\u{111ce}', '\u{111ce}', GC_SpacingMark), ('\u{111cf}', '\u{111cf}', GC_Extend),
+        ('\u{1122c}', '\u{1122e}', GC_SpacingMark), ('\u{1122f}', '\u{11231}', GC_Extend),
+        ('\u{11232}', '\u{11233}', GC_SpacingMark), ('\u{11234}', '\u{11237}', GC_Extend),
+        ('\u{1123e}', '\u{1123e}', GC_Extend), ('\u{11241}', '\u{11241}', GC_Extend), ('\u{112df}',
+        '\u{112df}', GC_Extend), ('\u{112e0}', '\u{112e2}', GC_SpacingMark), ('\u{112e3}',
+        '\u{112ea}', GC_Extend), ('\u{11300}', '\u{11301}', GC_Extend), ('\u{11302}', '\u{11303}',
+        GC_SpacingMark), ('\u{1133b}', '\u{1133c}', GC_Extend), ('\u{1133e}', '\u{1133e}',
+        GC_Extend), ('\u{1133f}', '\u{1133f}', GC_SpacingMark), ('\u{11340}', '\u{11340}',
+        GC_Extend), ('\u{11341}', '\u{11344}', GC_SpacingMark), ('\u{11347}', '\u{11348}',
+        GC_SpacingMark), ('\u{1134b}', '\u{1134c}', GC_SpacingMark), ('\u{1134d}', '\u{1134d}',
+        GC_Extend), ('\u{11357}', '\u{11357}', GC_Extend), ('\u{11362}', '\u{11363}',
+        GC_SpacingMark), ('\u{11366}', '\u{1136c}', GC_Extend), ('\u{11370}', '\u{11374}',
+        GC_Extend), ('\u{113b8}', '\u{113b8}', GC_Extend), ('\u{113b9}', '\u{113ba}',
+        GC_SpacingMark), ('\u{113bb}', '\u{113c0}', GC_Extend), ('\u{113c2}', '\u{113c2}',
+        GC_Extend), ('\u{113c5}', '\u{113c5}', GC_Extend), ('\u{113c7}', '\u{113c9}', GC_Extend),
+        ('\u{113ca}', '\u{113ca}', GC_SpacingMark), ('\u{113cc}', '\u{113cd}', GC_SpacingMark),
+        ('\u{113ce}', '\u{113d0}', GC_Extend), ('\u{113d1}', '\u{113d1}', GC_Prepend), ('\u{113d2}',
+        '\u{113d2}', GC_Extend), ('\u{113e1}', '\u{113e2}', GC_Extend), ('\u{11435}', '\u{11437}',
         GC_SpacingMark), ('\u{11438}', '\u{1143f}', GC_Extend), ('\u{11440}', '\u{11441}',
         GC_SpacingMark), ('\u{11442}', '\u{11444}', GC_Extend), ('\u{11445}', '\u{11445}',
         GC_SpacingMark), ('\u{11446}', '\u{11446}', GC_Extend), ('\u{1145e}', '\u{1145e}',
@@ -1000,30 +1162,29 @@
         GC_SpacingMark), ('\u{1163d}', '\u{1163d}', GC_Extend), ('\u{1163e}', '\u{1163e}',
         GC_SpacingMark), ('\u{1163f}', '\u{11640}', GC_Extend), ('\u{116ab}', '\u{116ab}',
         GC_Extend), ('\u{116ac}', '\u{116ac}', GC_SpacingMark), ('\u{116ad}', '\u{116ad}',
-        GC_Extend), ('\u{116ae}', '\u{116af}', GC_SpacingMark), ('\u{116b0}', '\u{116b5}',
-        GC_Extend), ('\u{116b6}', '\u{116b6}', GC_SpacingMark), ('\u{116b7}', '\u{116b7}',
-        GC_Extend), ('\u{1171d}', '\u{1171f}', GC_Extend), ('\u{11722}', '\u{11725}', GC_Extend),
-        ('\u{11726}', '\u{11726}', GC_SpacingMark), ('\u{11727}', '\u{1172b}', GC_Extend),
-        ('\u{1182c}', '\u{1182e}', GC_SpacingMark), ('\u{1182f}', '\u{11837}', GC_Extend),
-        ('\u{11838}', '\u{11838}', GC_SpacingMark), ('\u{11839}', '\u{1183a}', GC_Extend),
-        ('\u{11930}', '\u{11930}', GC_Extend), ('\u{11931}', '\u{11935}', GC_SpacingMark),
-        ('\u{11937}', '\u{11938}', GC_SpacingMark), ('\u{1193b}', '\u{1193c}', GC_Extend),
-        ('\u{1193d}', '\u{1193d}', GC_SpacingMark), ('\u{1193e}', '\u{1193e}', GC_Extend),
-        ('\u{1193f}', '\u{1193f}', GC_Prepend), ('\u{11940}', '\u{11940}', GC_SpacingMark),
-        ('\u{11941}', '\u{11941}', GC_Prepend), ('\u{11942}', '\u{11942}', GC_SpacingMark),
-        ('\u{11943}', '\u{11943}', GC_Extend), ('\u{119d1}', '\u{119d3}', GC_SpacingMark),
-        ('\u{119d4}', '\u{119d7}', GC_Extend), ('\u{119da}', '\u{119db}', GC_Extend), ('\u{119dc}',
-        '\u{119df}', GC_SpacingMark), ('\u{119e0}', '\u{119e0}', GC_Extend), ('\u{119e4}',
-        '\u{119e4}', GC_SpacingMark), ('\u{11a01}', '\u{11a0a}', GC_Extend), ('\u{11a33}',
-        '\u{11a38}', GC_Extend), ('\u{11a39}', '\u{11a39}', GC_SpacingMark), ('\u{11a3a}',
-        '\u{11a3a}', GC_Prepend), ('\u{11a3b}', '\u{11a3e}', GC_Extend), ('\u{11a47}', '\u{11a47}',
-        GC_Extend), ('\u{11a51}', '\u{11a56}', GC_Extend), ('\u{11a57}', '\u{11a58}',
-        GC_SpacingMark), ('\u{11a59}', '\u{11a5b}', GC_Extend), ('\u{11a84}', '\u{11a89}',
-        GC_Prepend), ('\u{11a8a}', '\u{11a96}', GC_Extend), ('\u{11a97}', '\u{11a97}',
-        GC_SpacingMark), ('\u{11a98}', '\u{11a99}', GC_Extend), ('\u{11c2f}', '\u{11c2f}',
-        GC_SpacingMark), ('\u{11c30}', '\u{11c36}', GC_Extend), ('\u{11c38}', '\u{11c3d}',
-        GC_Extend), ('\u{11c3e}', '\u{11c3e}', GC_SpacingMark), ('\u{11c3f}', '\u{11c3f}',
-        GC_Extend), ('\u{11c92}', '\u{11ca7}', GC_Extend), ('\u{11ca9}', '\u{11ca9}',
+        GC_Extend), ('\u{116ae}', '\u{116af}', GC_SpacingMark), ('\u{116b0}', '\u{116b7}',
+        GC_Extend), ('\u{1171d}', '\u{1171d}', GC_Extend), ('\u{1171e}', '\u{1171e}',
+        GC_SpacingMark), ('\u{1171f}', '\u{1171f}', GC_Extend), ('\u{11722}', '\u{11725}',
+        GC_Extend), ('\u{11726}', '\u{11726}', GC_SpacingMark), ('\u{11727}', '\u{1172b}',
+        GC_Extend), ('\u{1182c}', '\u{1182e}', GC_SpacingMark), ('\u{1182f}', '\u{11837}',
+        GC_Extend), ('\u{11838}', '\u{11838}', GC_SpacingMark), ('\u{11839}', '\u{1183a}',
+        GC_Extend), ('\u{11930}', '\u{11930}', GC_Extend), ('\u{11931}', '\u{11935}',
+        GC_SpacingMark), ('\u{11937}', '\u{11938}', GC_SpacingMark), ('\u{1193b}', '\u{1193e}',
+        GC_Extend), ('\u{1193f}', '\u{1193f}', GC_Prepend), ('\u{11940}', '\u{11940}',
+        GC_SpacingMark), ('\u{11941}', '\u{11941}', GC_Prepend), ('\u{11942}', '\u{11942}',
+        GC_SpacingMark), ('\u{11943}', '\u{11943}', GC_Extend), ('\u{119d1}', '\u{119d3}',
+        GC_SpacingMark), ('\u{119d4}', '\u{119d7}', GC_Extend), ('\u{119da}', '\u{119db}',
+        GC_Extend), ('\u{119dc}', '\u{119df}', GC_SpacingMark), ('\u{119e0}', '\u{119e0}',
+        GC_Extend), ('\u{119e4}', '\u{119e4}', GC_SpacingMark), ('\u{11a01}', '\u{11a0a}',
+        GC_Extend), ('\u{11a33}', '\u{11a38}', GC_Extend), ('\u{11a39}', '\u{11a39}',
+        GC_SpacingMark), ('\u{11a3a}', '\u{11a3a}', GC_Prepend), ('\u{11a3b}', '\u{11a3e}',
+        GC_Extend), ('\u{11a47}', '\u{11a47}', GC_Extend), ('\u{11a51}', '\u{11a56}', GC_Extend),
+        ('\u{11a57}', '\u{11a58}', GC_SpacingMark), ('\u{11a59}', '\u{11a5b}', GC_Extend),
+        ('\u{11a84}', '\u{11a89}', GC_Prepend), ('\u{11a8a}', '\u{11a96}', GC_Extend), ('\u{11a97}',
+        '\u{11a97}', GC_SpacingMark), ('\u{11a98}', '\u{11a99}', GC_Extend), ('\u{11c2f}',
+        '\u{11c2f}', GC_SpacingMark), ('\u{11c30}', '\u{11c36}', GC_Extend), ('\u{11c38}',
+        '\u{11c3d}', GC_Extend), ('\u{11c3e}', '\u{11c3e}', GC_SpacingMark), ('\u{11c3f}',
+        '\u{11c3f}', GC_Extend), ('\u{11c92}', '\u{11ca7}', GC_Extend), ('\u{11ca9}', '\u{11ca9}',
         GC_SpacingMark), ('\u{11caa}', '\u{11cb0}', GC_Extend), ('\u{11cb1}', '\u{11cb1}',
         GC_SpacingMark), ('\u{11cb2}', '\u{11cb3}', GC_Extend), ('\u{11cb4}', '\u{11cb4}',
         GC_SpacingMark), ('\u{11cb5}', '\u{11cb6}', GC_Extend), ('\u{11d31}', '\u{11d36}',
@@ -1036,17 +1197,17 @@
         GC_SpacingMark), ('\u{11f00}', '\u{11f01}', GC_Extend), ('\u{11f02}', '\u{11f02}',
         GC_Prepend), ('\u{11f03}', '\u{11f03}', GC_SpacingMark), ('\u{11f34}', '\u{11f35}',
         GC_SpacingMark), ('\u{11f36}', '\u{11f3a}', GC_Extend), ('\u{11f3e}', '\u{11f3f}',
-        GC_SpacingMark), ('\u{11f40}', '\u{11f40}', GC_Extend), ('\u{11f41}', '\u{11f41}',
-        GC_SpacingMark), ('\u{11f42}', '\u{11f42}', GC_Extend), ('\u{13430}', '\u{1343f}',
-        GC_Control), ('\u{13440}', '\u{13440}', GC_Extend), ('\u{13447}', '\u{13455}', GC_Extend),
-        ('\u{16af0}', '\u{16af4}', GC_Extend), ('\u{16b30}', '\u{16b36}', GC_Extend), ('\u{16f4f}',
-        '\u{16f4f}', GC_Extend), ('\u{16f51}', '\u{16f87}', GC_SpacingMark), ('\u{16f8f}',
-        '\u{16f92}', GC_Extend), ('\u{16fe4}', '\u{16fe4}', GC_Extend), ('\u{16ff0}', '\u{16ff1}',
-        GC_SpacingMark), ('\u{1bc9d}', '\u{1bc9e}', GC_Extend), ('\u{1bca0}', '\u{1bca3}',
-        GC_Control), ('\u{1cf00}', '\u{1cf2d}', GC_Extend), ('\u{1cf30}', '\u{1cf46}', GC_Extend),
-        ('\u{1d165}', '\u{1d165}', GC_Extend), ('\u{1d166}', '\u{1d166}', GC_SpacingMark),
-        ('\u{1d167}', '\u{1d169}', GC_Extend), ('\u{1d16d}', '\u{1d16d}', GC_SpacingMark),
-        ('\u{1d16e}', '\u{1d172}', GC_Extend), ('\u{1d173}', '\u{1d17a}', GC_Control), ('\u{1d17b}',
+        GC_SpacingMark), ('\u{11f40}', '\u{11f42}', GC_Extend), ('\u{11f5a}', '\u{11f5a}',
+        GC_Extend), ('\u{13430}', '\u{1343f}', GC_Control), ('\u{13440}', '\u{13440}', GC_Extend),
+        ('\u{13447}', '\u{13455}', GC_Extend), ('\u{1611e}', '\u{16129}', GC_Extend), ('\u{1612a}',
+        '\u{1612c}', GC_SpacingMark), ('\u{1612d}', '\u{1612f}', GC_Extend), ('\u{16af0}',
+        '\u{16af4}', GC_Extend), ('\u{16b30}', '\u{16b36}', GC_Extend), ('\u{16d63}', '\u{16d63}',
+        GC_V), ('\u{16d67}', '\u{16d6a}', GC_V), ('\u{16f4f}', '\u{16f4f}', GC_Extend),
+        ('\u{16f51}', '\u{16f87}', GC_SpacingMark), ('\u{16f8f}', '\u{16f92}', GC_Extend),
+        ('\u{16fe4}', '\u{16fe4}', GC_Extend), ('\u{16ff0}', '\u{16ff1}', GC_Extend), ('\u{1bc9d}',
+        '\u{1bc9e}', GC_Extend), ('\u{1bca0}', '\u{1bca3}', GC_Control), ('\u{1cf00}', '\u{1cf2d}',
+        GC_Extend), ('\u{1cf30}', '\u{1cf46}', GC_Extend), ('\u{1d165}', '\u{1d169}', GC_Extend),
+        ('\u{1d16d}', '\u{1d172}', GC_Extend), ('\u{1d173}', '\u{1d17a}', GC_Control), ('\u{1d17b}',
         '\u{1d182}', GC_Extend), ('\u{1d185}', '\u{1d18b}', GC_Extend), ('\u{1d1aa}', '\u{1d1ad}',
         GC_Extend), ('\u{1d242}', '\u{1d244}', GC_Extend), ('\u{1da00}', '\u{1da36}', GC_Extend),
         ('\u{1da3b}', '\u{1da6c}', GC_Extend), ('\u{1da75}', '\u{1da75}', GC_Extend), ('\u{1da84}',
@@ -1055,30 +1216,30 @@
         ('\u{1e01b}', '\u{1e021}', GC_Extend), ('\u{1e023}', '\u{1e024}', GC_Extend), ('\u{1e026}',
         '\u{1e02a}', GC_Extend), ('\u{1e08f}', '\u{1e08f}', GC_Extend), ('\u{1e130}', '\u{1e136}',
         GC_Extend), ('\u{1e2ae}', '\u{1e2ae}', GC_Extend), ('\u{1e2ec}', '\u{1e2ef}', GC_Extend),
-        ('\u{1e4ec}', '\u{1e4ef}', GC_Extend), ('\u{1e8d0}', '\u{1e8d6}', GC_Extend), ('\u{1e944}',
-        '\u{1e94a}', GC_Extend), ('\u{1f000}', '\u{1f0ff}', GC_Extended_Pictographic), ('\u{1f10d}',
-        '\u{1f10f}', GC_Extended_Pictographic), ('\u{1f12f}', '\u{1f12f}',
-        GC_Extended_Pictographic), ('\u{1f16c}', '\u{1f171}', GC_Extended_Pictographic),
-        ('\u{1f17e}', '\u{1f17f}', GC_Extended_Pictographic), ('\u{1f18e}', '\u{1f18e}',
-        GC_Extended_Pictographic), ('\u{1f191}', '\u{1f19a}', GC_Extended_Pictographic),
-        ('\u{1f1ad}', '\u{1f1e5}', GC_Extended_Pictographic), ('\u{1f1e6}', '\u{1f1ff}',
-        GC_Regional_Indicator), ('\u{1f201}', '\u{1f20f}', GC_Extended_Pictographic), ('\u{1f21a}',
-        '\u{1f21a}', GC_Extended_Pictographic), ('\u{1f22f}', '\u{1f22f}',
-        GC_Extended_Pictographic), ('\u{1f232}', '\u{1f23a}', GC_Extended_Pictographic),
-        ('\u{1f23c}', '\u{1f23f}', GC_Extended_Pictographic), ('\u{1f249}', '\u{1f3fa}',
-        GC_Extended_Pictographic), ('\u{1f3fb}', '\u{1f3ff}', GC_Extend), ('\u{1f400}', '\u{1f53d}',
-        GC_Extended_Pictographic), ('\u{1f546}', '\u{1f64f}', GC_Extended_Pictographic),
-        ('\u{1f680}', '\u{1f6ff}', GC_Extended_Pictographic), ('\u{1f774}', '\u{1f77f}',
-        GC_Extended_Pictographic), ('\u{1f7d5}', '\u{1f7ff}', GC_Extended_Pictographic),
-        ('\u{1f80c}', '\u{1f80f}', GC_Extended_Pictographic), ('\u{1f848}', '\u{1f84f}',
-        GC_Extended_Pictographic), ('\u{1f85a}', '\u{1f85f}', GC_Extended_Pictographic),
-        ('\u{1f888}', '\u{1f88f}', GC_Extended_Pictographic), ('\u{1f8ae}', '\u{1f8ff}',
-        GC_Extended_Pictographic), ('\u{1f90c}', '\u{1f93a}', GC_Extended_Pictographic),
-        ('\u{1f93c}', '\u{1f945}', GC_Extended_Pictographic), ('\u{1f947}', '\u{1faff}',
-        GC_Extended_Pictographic), ('\u{1fc00}', '\u{1fffd}', GC_Extended_Pictographic),
-        ('\u{e0000}', '\u{e001f}', GC_Control), ('\u{e0020}', '\u{e007f}', GC_Extend), ('\u{e0080}',
-        '\u{e00ff}', GC_Control), ('\u{e0100}', '\u{e01ef}', GC_Extend), ('\u{e01f0}', '\u{e0fff}',
-        GC_Control)
+        ('\u{1e4ec}', '\u{1e4ef}', GC_Extend), ('\u{1e5ee}', '\u{1e5ef}', GC_Extend), ('\u{1e8d0}',
+        '\u{1e8d6}', GC_Extend), ('\u{1e944}', '\u{1e94a}', GC_Extend), ('\u{1f000}', '\u{1f0ff}',
+        GC_Extended_Pictographic), ('\u{1f10d}', '\u{1f10f}', GC_Extended_Pictographic),
+        ('\u{1f12f}', '\u{1f12f}', GC_Extended_Pictographic), ('\u{1f16c}', '\u{1f171}',
+        GC_Extended_Pictographic), ('\u{1f17e}', '\u{1f17f}', GC_Extended_Pictographic),
+        ('\u{1f18e}', '\u{1f18e}', GC_Extended_Pictographic), ('\u{1f191}', '\u{1f19a}',
+        GC_Extended_Pictographic), ('\u{1f1ad}', '\u{1f1e5}', GC_Extended_Pictographic),
+        ('\u{1f1e6}', '\u{1f1ff}', GC_Regional_Indicator), ('\u{1f201}', '\u{1f20f}',
+        GC_Extended_Pictographic), ('\u{1f21a}', '\u{1f21a}', GC_Extended_Pictographic),
+        ('\u{1f22f}', '\u{1f22f}', GC_Extended_Pictographic), ('\u{1f232}', '\u{1f23a}',
+        GC_Extended_Pictographic), ('\u{1f23c}', '\u{1f23f}', GC_Extended_Pictographic),
+        ('\u{1f249}', '\u{1f3fa}', GC_Extended_Pictographic), ('\u{1f3fb}', '\u{1f3ff}', GC_Extend),
+        ('\u{1f400}', '\u{1f53d}', GC_Extended_Pictographic), ('\u{1f546}', '\u{1f64f}',
+        GC_Extended_Pictographic), ('\u{1f680}', '\u{1f6ff}', GC_Extended_Pictographic),
+        ('\u{1f774}', '\u{1f77f}', GC_Extended_Pictographic), ('\u{1f7d5}', '\u{1f7ff}',
+        GC_Extended_Pictographic), ('\u{1f80c}', '\u{1f80f}', GC_Extended_Pictographic),
+        ('\u{1f848}', '\u{1f84f}', GC_Extended_Pictographic), ('\u{1f85a}', '\u{1f85f}',
+        GC_Extended_Pictographic), ('\u{1f888}', '\u{1f88f}', GC_Extended_Pictographic),
+        ('\u{1f8ae}', '\u{1f8ff}', GC_Extended_Pictographic), ('\u{1f90c}', '\u{1f93a}',
+        GC_Extended_Pictographic), ('\u{1f93c}', '\u{1f945}', GC_Extended_Pictographic),
+        ('\u{1f947}', '\u{1faff}', GC_Extended_Pictographic), ('\u{1fc00}', '\u{1fffd}',
+        GC_Extended_Pictographic), ('\u{e0000}', '\u{e001f}', GC_Control), ('\u{e0020}',
+        '\u{e007f}', GC_Extend), ('\u{e0080}', '\u{e00ff}', GC_Control), ('\u{e0100}', '\u{e01ef}',
+        GC_Extend), ('\u{e01f0}', '\u{e0fff}', GC_Control)
     ];
 
 }
@@ -1112,7 +1273,7 @@
         WC_ZWJ,
     }
 
-    fn bsearch_range_value_table(c: char, r: &'static [(char, char, WordCat)], default_lower: u32, default_upper: u32) -> (u32, u32, WordCat) {
+    fn bsearch_range_value_table(c: char, r: &[(char, char, WordCat)], default_lower: u32, default_upper: u32) -> (u32, u32, WordCat) {
         use core::cmp::Ordering::{Equal, Less, Greater};
         match r.binary_search_by(|&(lo, hi, _)| {
             if lo <= c && c <= hi { Equal }
@@ -1142,7 +1303,7 @@
           // If the `idx` is outside of the precomputed table - use the slice
           // starting from the last covered index in the precomputed table and
           // ending with the length of the range table.
-          1050..1053,
+          1082..1085,
           |r| (r[0] as usize)..((r[1] + 1) as usize)
         );
 
@@ -1154,68 +1315,68 @@
         bsearch_range_value_table(c, &word_cat_table[range], lower, upper)
     }
 
-    const word_cat_lookup: &'static [u16] = &[
-        0, 14, 22, 22, 22, 22, 24, 30, 36, 36, 38, 43, 55, 66, 78, 83, 93, 104, 111, 121, 143, 162,
-        180, 198, 215, 231, 250, 266, 278, 282, 286, 295, 301, 308, 316, 316, 316, 321, 329, 333,
-        336, 336, 336, 336, 336, 338, 342, 351, 354, 359, 365, 369, 370, 375, 378, 384, 391, 397,
-        409, 409, 411, 411, 411, 420, 430, 449, 451, 464, 465, 465, 465, 465, 465, 465, 466, 466,
-        466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 470, 476, 486, 487,
-        487, 487, 487, 492, 496, 497, 500, 500, 501, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
-        502, 502, 504, 504, 504, 511, 515, 515, 519, 529, 538, 544, 551, 559, 568, 574, 578, 578,
-        578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578,
-        578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578,
-        578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578,
-        578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578,
-        578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 581, 581, 581, 581,
-        581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581,
-        581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581,
-        581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581,
-        581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 592, 593, 593, 593, 594,
-        597, 609, 611, 620, 628, 634, 635, 636, 637, 637, 640, 644, 648, 648, 652, 655, 662, 662,
-        662, 665, 668, 675, 678, 680, 682, 692, 696, 699, 700, 701, 703, 706, 706, 706, 710, 714,
-        718, 726, 734, 744, 753, 759, 767, 785, 785, 791, 796, 796, 801, 805, 809, 811, 811, 813,
-        815, 828, 835, 844, 848, 848, 848, 854, 857, 869, 875, 875, 877, 885, 886, 886, 886, 886,
-        886, 886, 886, 886, 887, 888, 888, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889,
-        889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 890, 890, 890, 890, 890, 890, 890, 890,
-        890, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895,
-        895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895,
-        895, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896,
-        896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896,
-        896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896,
-        896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896,
-        896, 899, 903, 908, 909, 909, 909, 909, 909, 910, 910, 913, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
-        920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 923, 924, 924, 927,
-        927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927,
-        927, 927, 927, 929, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
-        933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
-        933, 933, 933, 933, 933, 935, 935, 935, 935, 938, 941, 942, 942, 942, 942, 943, 951, 960,
-        960, 960, 964, 968, 973, 973, 973, 973, 973, 976, 979, 979, 979, 979, 979, 979, 979, 979,
-        979, 981, 981, 987, 988, 993, 993, 993, 998, 998, 998, 998, 1001, 1001, 1001, 1001, 1001,
-        1001, 1005, 1005, 1007, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1039,
-        1044, 1044, 1044, 1044, 1044, 1046, 1048, 1048, 1048, 1048, 1049, 1049, 1049, 1049, 1049,
-        1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1050, 1050, 1050, 1050,
-        1050, 1050, 1050, 1050
+    const word_cat_lookup: &[u16] = &[
+        0, 14, 22, 22, 22, 22, 24, 30, 36, 36, 38, 43, 55, 66, 78, 82, 92, 103, 110, 120, 142, 161,
+        179, 197, 214, 230, 249, 265, 277, 281, 285, 294, 300, 307, 315, 315, 315, 320, 328, 332,
+        335, 335, 335, 335, 335, 337, 341, 350, 353, 358, 364, 368, 369, 374, 377, 383, 390, 396,
+        408, 408, 410, 410, 410, 419, 429, 448, 450, 463, 464, 464, 464, 464, 464, 464, 465, 465,
+        465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 469, 475, 485, 486,
+        486, 486, 486, 491, 495, 496, 499, 499, 500, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501,
+        501, 501, 503, 503, 503, 510, 514, 514, 518, 528, 537, 543, 550, 558, 567, 573, 577, 577,
+        577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577,
+        577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577,
+        577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577,
+        577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577,
+        577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 580, 580, 580, 580,
+        580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+        580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+        580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+        580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 591, 592, 592, 592, 593,
+        596, 606, 608, 617, 625, 631, 632, 633, 634, 634, 637, 641, 645, 645, 649, 652, 660, 660,
+        660, 663, 666, 673, 676, 678, 680, 690, 694, 697, 698, 699, 701, 707, 708, 708, 713, 717,
+        721, 729, 737, 747, 756, 762, 770, 788, 802, 808, 813, 813, 818, 822, 827, 829, 829, 831,
+        833, 846, 853, 862, 866, 866, 868, 874, 877, 889, 895, 895, 897, 906, 907, 907, 907, 907,
+        907, 907, 907, 907, 908, 909, 909, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910,
+        910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 911, 911, 911, 911, 911, 911, 911, 911,
+        911, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+        916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 917, 917, 917, 917,
+        917, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+        918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+        918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+        918, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921,
+        921, 924, 928, 933, 934, 934, 934, 936, 936, 937, 937, 940, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947,
+        947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 950, 951, 951, 954,
+        954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
+        954, 954, 954, 956, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+        960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+        961, 961, 961, 961, 961, 963, 963, 963, 963, 966, 969, 970, 970, 970, 970, 971, 979, 988,
+        988, 988, 992, 996, 1001, 1001, 1001, 1001, 1001, 1004, 1007, 1007, 1007, 1007, 1007, 1007,
+        1007, 1007, 1007, 1009, 1009, 1015, 1016, 1021, 1021, 1021, 1026, 1026, 1026, 1026, 1029,
+        1029, 1033, 1033, 1033, 1033, 1037, 1037, 1039, 1043, 1043, 1043, 1043, 1043, 1043, 1043,
+        1043, 1043, 1043, 1071, 1076, 1076, 1076, 1076, 1076, 1078, 1080, 1080, 1080, 1080, 1081,
+        1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081,
+        1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082
     ];
 
-    const word_cat_table: &'static [(char, char, WordCat)] = &[
+    const word_cat_table: &[(char, char, WordCat)] = &[
         ('\u{a}', '\u{a}', WC_LF), ('\u{b}', '\u{c}', WC_Newline), ('\u{d}', '\u{d}', WC_CR),
         ('\u{20}', '\u{20}', WC_WSegSpace), ('\u{22}', '\u{22}', WC_Double_Quote), ('\u{27}',
         '\u{27}', WC_Single_Quote), ('\u{2c}', '\u{2c}', WC_MidNum), ('\u{2e}', '\u{2e}',
@@ -1239,253 +1400,252 @@
         WC_Extend), ('\u{5c4}', '\u{5c5}', WC_Extend), ('\u{5c7}', '\u{5c7}', WC_Extend),
         ('\u{5d0}', '\u{5ea}', WC_Hebrew_Letter), ('\u{5ef}', '\u{5f2}', WC_Hebrew_Letter),
         ('\u{5f3}', '\u{5f3}', WC_ALetter), ('\u{5f4}', '\u{5f4}', WC_MidLetter), ('\u{600}',
-        '\u{605}', WC_Format), ('\u{60c}', '\u{60d}', WC_MidNum), ('\u{610}', '\u{61a}', WC_Extend),
-        ('\u{61c}', '\u{61c}', WC_Format), ('\u{620}', '\u{64a}', WC_ALetter), ('\u{64b}',
-        '\u{65f}', WC_Extend), ('\u{660}', '\u{669}', WC_Numeric), ('\u{66b}', '\u{66b}',
-        WC_Numeric), ('\u{66c}', '\u{66c}', WC_MidNum), ('\u{66e}', '\u{66f}', WC_ALetter),
-        ('\u{670}', '\u{670}', WC_Extend), ('\u{671}', '\u{6d3}', WC_ALetter), ('\u{6d5}',
-        '\u{6d5}', WC_ALetter), ('\u{6d6}', '\u{6dc}', WC_Extend), ('\u{6dd}', '\u{6dd}',
-        WC_Format), ('\u{6df}', '\u{6e4}', WC_Extend), ('\u{6e5}', '\u{6e6}', WC_ALetter),
-        ('\u{6e7}', '\u{6e8}', WC_Extend), ('\u{6ea}', '\u{6ed}', WC_Extend), ('\u{6ee}', '\u{6ef}',
-        WC_ALetter), ('\u{6f0}', '\u{6f9}', WC_Numeric), ('\u{6fa}', '\u{6fc}', WC_ALetter),
-        ('\u{6ff}', '\u{6ff}', WC_ALetter), ('\u{70f}', '\u{70f}', WC_Format), ('\u{710}',
-        '\u{710}', WC_ALetter), ('\u{711}', '\u{711}', WC_Extend), ('\u{712}', '\u{72f}',
-        WC_ALetter), ('\u{730}', '\u{74a}', WC_Extend), ('\u{74d}', '\u{7a5}', WC_ALetter),
-        ('\u{7a6}', '\u{7b0}', WC_Extend), ('\u{7b1}', '\u{7b1}', WC_ALetter), ('\u{7c0}',
-        '\u{7c9}', WC_Numeric), ('\u{7ca}', '\u{7ea}', WC_ALetter), ('\u{7eb}', '\u{7f3}',
-        WC_Extend), ('\u{7f4}', '\u{7f5}', WC_ALetter), ('\u{7f8}', '\u{7f8}', WC_MidNum),
-        ('\u{7fa}', '\u{7fa}', WC_ALetter), ('\u{7fd}', '\u{7fd}', WC_Extend), ('\u{800}',
-        '\u{815}', WC_ALetter), ('\u{816}', '\u{819}', WC_Extend), ('\u{81a}', '\u{81a}',
-        WC_ALetter), ('\u{81b}', '\u{823}', WC_Extend), ('\u{824}', '\u{824}', WC_ALetter),
-        ('\u{825}', '\u{827}', WC_Extend), ('\u{828}', '\u{828}', WC_ALetter), ('\u{829}',
-        '\u{82d}', WC_Extend), ('\u{840}', '\u{858}', WC_ALetter), ('\u{859}', '\u{85b}',
-        WC_Extend), ('\u{860}', '\u{86a}', WC_ALetter), ('\u{870}', '\u{887}', WC_ALetter),
-        ('\u{889}', '\u{88e}', WC_ALetter), ('\u{890}', '\u{891}', WC_Format), ('\u{898}',
-        '\u{89f}', WC_Extend), ('\u{8a0}', '\u{8c9}', WC_ALetter), ('\u{8ca}', '\u{8e1}',
-        WC_Extend), ('\u{8e2}', '\u{8e2}', WC_Format), ('\u{8e3}', '\u{903}', WC_Extend),
-        ('\u{904}', '\u{939}', WC_ALetter), ('\u{93a}', '\u{93c}', WC_Extend), ('\u{93d}',
-        '\u{93d}', WC_ALetter), ('\u{93e}', '\u{94f}', WC_Extend), ('\u{950}', '\u{950}',
-        WC_ALetter), ('\u{951}', '\u{957}', WC_Extend), ('\u{958}', '\u{961}', WC_ALetter),
-        ('\u{962}', '\u{963}', WC_Extend), ('\u{966}', '\u{96f}', WC_Numeric), ('\u{971}',
-        '\u{980}', WC_ALetter), ('\u{981}', '\u{983}', WC_Extend), ('\u{985}', '\u{98c}',
-        WC_ALetter), ('\u{98f}', '\u{990}', WC_ALetter), ('\u{993}', '\u{9a8}', WC_ALetter),
-        ('\u{9aa}', '\u{9b0}', WC_ALetter), ('\u{9b2}', '\u{9b2}', WC_ALetter), ('\u{9b6}',
-        '\u{9b9}', WC_ALetter), ('\u{9bc}', '\u{9bc}', WC_Extend), ('\u{9bd}', '\u{9bd}',
-        WC_ALetter), ('\u{9be}', '\u{9c4}', WC_Extend), ('\u{9c7}', '\u{9c8}', WC_Extend),
-        ('\u{9cb}', '\u{9cd}', WC_Extend), ('\u{9ce}', '\u{9ce}', WC_ALetter), ('\u{9d7}',
-        '\u{9d7}', WC_Extend), ('\u{9dc}', '\u{9dd}', WC_ALetter), ('\u{9df}', '\u{9e1}',
-        WC_ALetter), ('\u{9e2}', '\u{9e3}', WC_Extend), ('\u{9e6}', '\u{9ef}', WC_Numeric),
-        ('\u{9f0}', '\u{9f1}', WC_ALetter), ('\u{9fc}', '\u{9fc}', WC_ALetter), ('\u{9fe}',
-        '\u{9fe}', WC_Extend), ('\u{a01}', '\u{a03}', WC_Extend), ('\u{a05}', '\u{a0a}',
-        WC_ALetter), ('\u{a0f}', '\u{a10}', WC_ALetter), ('\u{a13}', '\u{a28}', WC_ALetter),
-        ('\u{a2a}', '\u{a30}', WC_ALetter), ('\u{a32}', '\u{a33}', WC_ALetter), ('\u{a35}',
-        '\u{a36}', WC_ALetter), ('\u{a38}', '\u{a39}', WC_ALetter), ('\u{a3c}', '\u{a3c}',
-        WC_Extend), ('\u{a3e}', '\u{a42}', WC_Extend), ('\u{a47}', '\u{a48}', WC_Extend),
-        ('\u{a4b}', '\u{a4d}', WC_Extend), ('\u{a51}', '\u{a51}', WC_Extend), ('\u{a59}', '\u{a5c}',
-        WC_ALetter), ('\u{a5e}', '\u{a5e}', WC_ALetter), ('\u{a66}', '\u{a6f}', WC_Numeric),
-        ('\u{a70}', '\u{a71}', WC_Extend), ('\u{a72}', '\u{a74}', WC_ALetter), ('\u{a75}',
-        '\u{a75}', WC_Extend), ('\u{a81}', '\u{a83}', WC_Extend), ('\u{a85}', '\u{a8d}',
-        WC_ALetter), ('\u{a8f}', '\u{a91}', WC_ALetter), ('\u{a93}', '\u{aa8}', WC_ALetter),
-        ('\u{aaa}', '\u{ab0}', WC_ALetter), ('\u{ab2}', '\u{ab3}', WC_ALetter), ('\u{ab5}',
-        '\u{ab9}', WC_ALetter), ('\u{abc}', '\u{abc}', WC_Extend), ('\u{abd}', '\u{abd}',
-        WC_ALetter), ('\u{abe}', '\u{ac5}', WC_Extend), ('\u{ac7}', '\u{ac9}', WC_Extend),
-        ('\u{acb}', '\u{acd}', WC_Extend), ('\u{ad0}', '\u{ad0}', WC_ALetter), ('\u{ae0}',
-        '\u{ae1}', WC_ALetter), ('\u{ae2}', '\u{ae3}', WC_Extend), ('\u{ae6}', '\u{aef}',
-        WC_Numeric), ('\u{af9}', '\u{af9}', WC_ALetter), ('\u{afa}', '\u{aff}', WC_Extend),
-        ('\u{b01}', '\u{b03}', WC_Extend), ('\u{b05}', '\u{b0c}', WC_ALetter), ('\u{b0f}',
-        '\u{b10}', WC_ALetter), ('\u{b13}', '\u{b28}', WC_ALetter), ('\u{b2a}', '\u{b30}',
-        WC_ALetter), ('\u{b32}', '\u{b33}', WC_ALetter), ('\u{b35}', '\u{b39}', WC_ALetter),
-        ('\u{b3c}', '\u{b3c}', WC_Extend), ('\u{b3d}', '\u{b3d}', WC_ALetter), ('\u{b3e}',
-        '\u{b44}', WC_Extend), ('\u{b47}', '\u{b48}', WC_Extend), ('\u{b4b}', '\u{b4d}', WC_Extend),
-        ('\u{b55}', '\u{b57}', WC_Extend), ('\u{b5c}', '\u{b5d}', WC_ALetter), ('\u{b5f}',
-        '\u{b61}', WC_ALetter), ('\u{b62}', '\u{b63}', WC_Extend), ('\u{b66}', '\u{b6f}',
-        WC_Numeric), ('\u{b71}', '\u{b71}', WC_ALetter), ('\u{b82}', '\u{b82}', WC_Extend),
-        ('\u{b83}', '\u{b83}', WC_ALetter), ('\u{b85}', '\u{b8a}', WC_ALetter), ('\u{b8e}',
-        '\u{b90}', WC_ALetter), ('\u{b92}', '\u{b95}', WC_ALetter), ('\u{b99}', '\u{b9a}',
-        WC_ALetter), ('\u{b9c}', '\u{b9c}', WC_ALetter), ('\u{b9e}', '\u{b9f}', WC_ALetter),
-        ('\u{ba3}', '\u{ba4}', WC_ALetter), ('\u{ba8}', '\u{baa}', WC_ALetter), ('\u{bae}',
-        '\u{bb9}', WC_ALetter), ('\u{bbe}', '\u{bc2}', WC_Extend), ('\u{bc6}', '\u{bc8}',
-        WC_Extend), ('\u{bca}', '\u{bcd}', WC_Extend), ('\u{bd0}', '\u{bd0}', WC_ALetter),
-        ('\u{bd7}', '\u{bd7}', WC_Extend), ('\u{be6}', '\u{bef}', WC_Numeric), ('\u{c00}',
-        '\u{c04}', WC_Extend), ('\u{c05}', '\u{c0c}', WC_ALetter), ('\u{c0e}', '\u{c10}',
-        WC_ALetter), ('\u{c12}', '\u{c28}', WC_ALetter), ('\u{c2a}', '\u{c39}', WC_ALetter),
-        ('\u{c3c}', '\u{c3c}', WC_Extend), ('\u{c3d}', '\u{c3d}', WC_ALetter), ('\u{c3e}',
-        '\u{c44}', WC_Extend), ('\u{c46}', '\u{c48}', WC_Extend), ('\u{c4a}', '\u{c4d}', WC_Extend),
-        ('\u{c55}', '\u{c56}', WC_Extend), ('\u{c58}', '\u{c5a}', WC_ALetter), ('\u{c5d}',
-        '\u{c5d}', WC_ALetter), ('\u{c60}', '\u{c61}', WC_ALetter), ('\u{c62}', '\u{c63}',
-        WC_Extend), ('\u{c66}', '\u{c6f}', WC_Numeric), ('\u{c80}', '\u{c80}', WC_ALetter),
-        ('\u{c81}', '\u{c83}', WC_Extend), ('\u{c85}', '\u{c8c}', WC_ALetter), ('\u{c8e}',
-        '\u{c90}', WC_ALetter), ('\u{c92}', '\u{ca8}', WC_ALetter), ('\u{caa}', '\u{cb3}',
-        WC_ALetter), ('\u{cb5}', '\u{cb9}', WC_ALetter), ('\u{cbc}', '\u{cbc}', WC_Extend),
-        ('\u{cbd}', '\u{cbd}', WC_ALetter), ('\u{cbe}', '\u{cc4}', WC_Extend), ('\u{cc6}',
-        '\u{cc8}', WC_Extend), ('\u{cca}', '\u{ccd}', WC_Extend), ('\u{cd5}', '\u{cd6}', WC_Extend),
-        ('\u{cdd}', '\u{cde}', WC_ALetter), ('\u{ce0}', '\u{ce1}', WC_ALetter), ('\u{ce2}',
-        '\u{ce3}', WC_Extend), ('\u{ce6}', '\u{cef}', WC_Numeric), ('\u{cf1}', '\u{cf2}',
-        WC_ALetter), ('\u{cf3}', '\u{cf3}', WC_Extend), ('\u{d00}', '\u{d03}', WC_Extend),
-        ('\u{d04}', '\u{d0c}', WC_ALetter), ('\u{d0e}', '\u{d10}', WC_ALetter), ('\u{d12}',
-        '\u{d3a}', WC_ALetter), ('\u{d3b}', '\u{d3c}', WC_Extend), ('\u{d3d}', '\u{d3d}',
-        WC_ALetter), ('\u{d3e}', '\u{d44}', WC_Extend), ('\u{d46}', '\u{d48}', WC_Extend),
-        ('\u{d4a}', '\u{d4d}', WC_Extend), ('\u{d4e}', '\u{d4e}', WC_ALetter), ('\u{d54}',
-        '\u{d56}', WC_ALetter), ('\u{d57}', '\u{d57}', WC_Extend), ('\u{d5f}', '\u{d61}',
-        WC_ALetter), ('\u{d62}', '\u{d63}', WC_Extend), ('\u{d66}', '\u{d6f}', WC_Numeric),
-        ('\u{d7a}', '\u{d7f}', WC_ALetter), ('\u{d81}', '\u{d83}', WC_Extend), ('\u{d85}',
-        '\u{d96}', WC_ALetter), ('\u{d9a}', '\u{db1}', WC_ALetter), ('\u{db3}', '\u{dbb}',
-        WC_ALetter), ('\u{dbd}', '\u{dbd}', WC_ALetter), ('\u{dc0}', '\u{dc6}', WC_ALetter),
-        ('\u{dca}', '\u{dca}', WC_Extend), ('\u{dcf}', '\u{dd4}', WC_Extend), ('\u{dd6}', '\u{dd6}',
-        WC_Extend), ('\u{dd8}', '\u{ddf}', WC_Extend), ('\u{de6}', '\u{def}', WC_Numeric),
-        ('\u{df2}', '\u{df3}', WC_Extend), ('\u{e31}', '\u{e31}', WC_Extend), ('\u{e34}', '\u{e3a}',
-        WC_Extend), ('\u{e47}', '\u{e4e}', WC_Extend), ('\u{e50}', '\u{e59}', WC_Numeric),
-        ('\u{eb1}', '\u{eb1}', WC_Extend), ('\u{eb4}', '\u{ebc}', WC_Extend), ('\u{ec8}', '\u{ece}',
-        WC_Extend), ('\u{ed0}', '\u{ed9}', WC_Numeric), ('\u{f00}', '\u{f00}', WC_ALetter),
-        ('\u{f18}', '\u{f19}', WC_Extend), ('\u{f20}', '\u{f29}', WC_Numeric), ('\u{f35}',
-        '\u{f35}', WC_Extend), ('\u{f37}', '\u{f37}', WC_Extend), ('\u{f39}', '\u{f39}', WC_Extend),
-        ('\u{f3e}', '\u{f3f}', WC_Extend), ('\u{f40}', '\u{f47}', WC_ALetter), ('\u{f49}',
-        '\u{f6c}', WC_ALetter), ('\u{f71}', '\u{f84}', WC_Extend), ('\u{f86}', '\u{f87}',
-        WC_Extend), ('\u{f88}', '\u{f8c}', WC_ALetter), ('\u{f8d}', '\u{f97}', WC_Extend),
-        ('\u{f99}', '\u{fbc}', WC_Extend), ('\u{fc6}', '\u{fc6}', WC_Extend), ('\u{102b}',
-        '\u{103e}', WC_Extend), ('\u{1040}', '\u{1049}', WC_Numeric), ('\u{1056}', '\u{1059}',
-        WC_Extend), ('\u{105e}', '\u{1060}', WC_Extend), ('\u{1062}', '\u{1064}', WC_Extend),
-        ('\u{1067}', '\u{106d}', WC_Extend), ('\u{1071}', '\u{1074}', WC_Extend), ('\u{1082}',
-        '\u{108d}', WC_Extend), ('\u{108f}', '\u{108f}', WC_Extend), ('\u{1090}', '\u{1099}',
-        WC_Numeric), ('\u{109a}', '\u{109d}', WC_Extend), ('\u{10a0}', '\u{10c5}', WC_ALetter),
-        ('\u{10c7}', '\u{10c7}', WC_ALetter), ('\u{10cd}', '\u{10cd}', WC_ALetter), ('\u{10d0}',
-        '\u{10fa}', WC_ALetter), ('\u{10fc}', '\u{1248}', WC_ALetter), ('\u{124a}', '\u{124d}',
-        WC_ALetter), ('\u{1250}', '\u{1256}', WC_ALetter), ('\u{1258}', '\u{1258}', WC_ALetter),
-        ('\u{125a}', '\u{125d}', WC_ALetter), ('\u{1260}', '\u{1288}', WC_ALetter), ('\u{128a}',
-        '\u{128d}', WC_ALetter), ('\u{1290}', '\u{12b0}', WC_ALetter), ('\u{12b2}', '\u{12b5}',
-        WC_ALetter), ('\u{12b8}', '\u{12be}', WC_ALetter), ('\u{12c0}', '\u{12c0}', WC_ALetter),
-        ('\u{12c2}', '\u{12c5}', WC_ALetter), ('\u{12c8}', '\u{12d6}', WC_ALetter), ('\u{12d8}',
-        '\u{1310}', WC_ALetter), ('\u{1312}', '\u{1315}', WC_ALetter), ('\u{1318}', '\u{135a}',
-        WC_ALetter), ('\u{135d}', '\u{135f}', WC_Extend), ('\u{1380}', '\u{138f}', WC_ALetter),
-        ('\u{13a0}', '\u{13f5}', WC_ALetter), ('\u{13f8}', '\u{13fd}', WC_ALetter), ('\u{1401}',
-        '\u{166c}', WC_ALetter), ('\u{166f}', '\u{167f}', WC_ALetter), ('\u{1680}', '\u{1680}',
-        WC_WSegSpace), ('\u{1681}', '\u{169a}', WC_ALetter), ('\u{16a0}', '\u{16ea}', WC_ALetter),
-        ('\u{16ee}', '\u{16f8}', WC_ALetter), ('\u{1700}', '\u{1711}', WC_ALetter), ('\u{1712}',
-        '\u{1715}', WC_Extend), ('\u{171f}', '\u{1731}', WC_ALetter), ('\u{1732}', '\u{1734}',
-        WC_Extend), ('\u{1740}', '\u{1751}', WC_ALetter), ('\u{1752}', '\u{1753}', WC_Extend),
-        ('\u{1760}', '\u{176c}', WC_ALetter), ('\u{176e}', '\u{1770}', WC_ALetter), ('\u{1772}',
-        '\u{1773}', WC_Extend), ('\u{17b4}', '\u{17d3}', WC_Extend), ('\u{17dd}', '\u{17dd}',
-        WC_Extend), ('\u{17e0}', '\u{17e9}', WC_Numeric), ('\u{180b}', '\u{180d}', WC_Extend),
-        ('\u{180e}', '\u{180e}', WC_Format), ('\u{180f}', '\u{180f}', WC_Extend), ('\u{1810}',
-        '\u{1819}', WC_Numeric), ('\u{1820}', '\u{1878}', WC_ALetter), ('\u{1880}', '\u{1884}',
-        WC_ALetter), ('\u{1885}', '\u{1886}', WC_Extend), ('\u{1887}', '\u{18a8}', WC_ALetter),
-        ('\u{18a9}', '\u{18a9}', WC_Extend), ('\u{18aa}', '\u{18aa}', WC_ALetter), ('\u{18b0}',
-        '\u{18f5}', WC_ALetter), ('\u{1900}', '\u{191e}', WC_ALetter), ('\u{1920}', '\u{192b}',
-        WC_Extend), ('\u{1930}', '\u{193b}', WC_Extend), ('\u{1946}', '\u{194f}', WC_Numeric),
-        ('\u{19d0}', '\u{19d9}', WC_Numeric), ('\u{1a00}', '\u{1a16}', WC_ALetter), ('\u{1a17}',
-        '\u{1a1b}', WC_Extend), ('\u{1a55}', '\u{1a5e}', WC_Extend), ('\u{1a60}', '\u{1a7c}',
-        WC_Extend), ('\u{1a7f}', '\u{1a7f}', WC_Extend), ('\u{1a80}', '\u{1a89}', WC_Numeric),
-        ('\u{1a90}', '\u{1a99}', WC_Numeric), ('\u{1ab0}', '\u{1ace}', WC_Extend), ('\u{1b00}',
-        '\u{1b04}', WC_Extend), ('\u{1b05}', '\u{1b33}', WC_ALetter), ('\u{1b34}', '\u{1b44}',
-        WC_Extend), ('\u{1b45}', '\u{1b4c}', WC_ALetter), ('\u{1b50}', '\u{1b59}', WC_Numeric),
-        ('\u{1b6b}', '\u{1b73}', WC_Extend), ('\u{1b80}', '\u{1b82}', WC_Extend), ('\u{1b83}',
-        '\u{1ba0}', WC_ALetter), ('\u{1ba1}', '\u{1bad}', WC_Extend), ('\u{1bae}', '\u{1baf}',
-        WC_ALetter), ('\u{1bb0}', '\u{1bb9}', WC_Numeric), ('\u{1bba}', '\u{1be5}', WC_ALetter),
-        ('\u{1be6}', '\u{1bf3}', WC_Extend), ('\u{1c00}', '\u{1c23}', WC_ALetter), ('\u{1c24}',
-        '\u{1c37}', WC_Extend), ('\u{1c40}', '\u{1c49}', WC_Numeric), ('\u{1c4d}', '\u{1c4f}',
-        WC_ALetter), ('\u{1c50}', '\u{1c59}', WC_Numeric), ('\u{1c5a}', '\u{1c7d}', WC_ALetter),
-        ('\u{1c80}', '\u{1c88}', WC_ALetter), ('\u{1c90}', '\u{1cba}', WC_ALetter), ('\u{1cbd}',
-        '\u{1cbf}', WC_ALetter), ('\u{1cd0}', '\u{1cd2}', WC_Extend), ('\u{1cd4}', '\u{1ce8}',
-        WC_Extend), ('\u{1ce9}', '\u{1cec}', WC_ALetter), ('\u{1ced}', '\u{1ced}', WC_Extend),
-        ('\u{1cee}', '\u{1cf3}', WC_ALetter), ('\u{1cf4}', '\u{1cf4}', WC_Extend), ('\u{1cf5}',
-        '\u{1cf6}', WC_ALetter), ('\u{1cf7}', '\u{1cf9}', WC_Extend), ('\u{1cfa}', '\u{1cfa}',
-        WC_ALetter), ('\u{1d00}', '\u{1dbf}', WC_ALetter), ('\u{1dc0}', '\u{1dff}', WC_Extend),
-        ('\u{1e00}', '\u{1f15}', WC_ALetter), ('\u{1f18}', '\u{1f1d}', WC_ALetter), ('\u{1f20}',
-        '\u{1f45}', WC_ALetter), ('\u{1f48}', '\u{1f4d}', WC_ALetter), ('\u{1f50}', '\u{1f57}',
-        WC_ALetter), ('\u{1f59}', '\u{1f59}', WC_ALetter), ('\u{1f5b}', '\u{1f5b}', WC_ALetter),
-        ('\u{1f5d}', '\u{1f5d}', WC_ALetter), ('\u{1f5f}', '\u{1f7d}', WC_ALetter), ('\u{1f80}',
-        '\u{1fb4}', WC_ALetter), ('\u{1fb6}', '\u{1fbc}', WC_ALetter), ('\u{1fbe}', '\u{1fbe}',
-        WC_ALetter), ('\u{1fc2}', '\u{1fc4}', WC_ALetter), ('\u{1fc6}', '\u{1fcc}', WC_ALetter),
-        ('\u{1fd0}', '\u{1fd3}', WC_ALetter), ('\u{1fd6}', '\u{1fdb}', WC_ALetter), ('\u{1fe0}',
-        '\u{1fec}', WC_ALetter), ('\u{1ff2}', '\u{1ff4}', WC_ALetter), ('\u{1ff6}', '\u{1ffc}',
-        WC_ALetter), ('\u{2000}', '\u{2006}', WC_WSegSpace), ('\u{2008}', '\u{200a}', WC_WSegSpace),
-        ('\u{200c}', '\u{200c}', WC_Extend), ('\u{200d}', '\u{200d}', WC_ZWJ), ('\u{200e}',
-        '\u{200f}', WC_Format), ('\u{2018}', '\u{2019}', WC_MidNumLet), ('\u{2024}', '\u{2024}',
-        WC_MidNumLet), ('\u{2027}', '\u{2027}', WC_MidLetter), ('\u{2028}', '\u{2029}', WC_Newline),
-        ('\u{202a}', '\u{202e}', WC_Format), ('\u{202f}', '\u{202f}', WC_ExtendNumLet), ('\u{203f}',
-        '\u{2040}', WC_ExtendNumLet), ('\u{2044}', '\u{2044}', WC_MidNum), ('\u{2054}', '\u{2054}',
-        WC_ExtendNumLet), ('\u{205f}', '\u{205f}', WC_WSegSpace), ('\u{2060}', '\u{2064}',
-        WC_Format), ('\u{2066}', '\u{206f}', WC_Format), ('\u{2071}', '\u{2071}', WC_ALetter),
-        ('\u{207f}', '\u{207f}', WC_ALetter), ('\u{2090}', '\u{209c}', WC_ALetter), ('\u{20d0}',
-        '\u{20f0}', WC_Extend), ('\u{2102}', '\u{2102}', WC_ALetter), ('\u{2107}', '\u{2107}',
-        WC_ALetter), ('\u{210a}', '\u{2113}', WC_ALetter), ('\u{2115}', '\u{2115}', WC_ALetter),
-        ('\u{2119}', '\u{211d}', WC_ALetter), ('\u{2124}', '\u{2124}', WC_ALetter), ('\u{2126}',
-        '\u{2126}', WC_ALetter), ('\u{2128}', '\u{2128}', WC_ALetter), ('\u{212a}', '\u{212d}',
-        WC_ALetter), ('\u{212f}', '\u{2139}', WC_ALetter), ('\u{213c}', '\u{213f}', WC_ALetter),
-        ('\u{2145}', '\u{2149}', WC_ALetter), ('\u{214e}', '\u{214e}', WC_ALetter), ('\u{2160}',
-        '\u{2188}', WC_ALetter), ('\u{24b6}', '\u{24e9}', WC_ALetter), ('\u{2c00}', '\u{2ce4}',
-        WC_ALetter), ('\u{2ceb}', '\u{2cee}', WC_ALetter), ('\u{2cef}', '\u{2cf1}', WC_Extend),
-        ('\u{2cf2}', '\u{2cf3}', WC_ALetter), ('\u{2d00}', '\u{2d25}', WC_ALetter), ('\u{2d27}',
-        '\u{2d27}', WC_ALetter), ('\u{2d2d}', '\u{2d2d}', WC_ALetter), ('\u{2d30}', '\u{2d67}',
-        WC_ALetter), ('\u{2d6f}', '\u{2d6f}', WC_ALetter), ('\u{2d7f}', '\u{2d7f}', WC_Extend),
-        ('\u{2d80}', '\u{2d96}', WC_ALetter), ('\u{2da0}', '\u{2da6}', WC_ALetter), ('\u{2da8}',
-        '\u{2dae}', WC_ALetter), ('\u{2db0}', '\u{2db6}', WC_ALetter), ('\u{2db8}', '\u{2dbe}',
-        WC_ALetter), ('\u{2dc0}', '\u{2dc6}', WC_ALetter), ('\u{2dc8}', '\u{2dce}', WC_ALetter),
-        ('\u{2dd0}', '\u{2dd6}', WC_ALetter), ('\u{2dd8}', '\u{2dde}', WC_ALetter), ('\u{2de0}',
-        '\u{2dff}', WC_Extend), ('\u{2e2f}', '\u{2e2f}', WC_ALetter), ('\u{3000}', '\u{3000}',
-        WC_WSegSpace), ('\u{3005}', '\u{3005}', WC_ALetter), ('\u{302a}', '\u{302f}', WC_Extend),
-        ('\u{3031}', '\u{3035}', WC_Katakana), ('\u{303b}', '\u{303c}', WC_ALetter), ('\u{3099}',
-        '\u{309a}', WC_Extend), ('\u{309b}', '\u{309c}', WC_Katakana), ('\u{30a0}', '\u{30fa}',
-        WC_Katakana), ('\u{30fc}', '\u{30ff}', WC_Katakana), ('\u{3105}', '\u{312f}', WC_ALetter),
-        ('\u{3131}', '\u{318e}', WC_ALetter), ('\u{31a0}', '\u{31bf}', WC_ALetter), ('\u{31f0}',
-        '\u{31ff}', WC_Katakana), ('\u{32d0}', '\u{32fe}', WC_Katakana), ('\u{3300}', '\u{3357}',
-        WC_Katakana), ('\u{a000}', '\u{a48c}', WC_ALetter), ('\u{a4d0}', '\u{a4fd}', WC_ALetter),
-        ('\u{a500}', '\u{a60c}', WC_ALetter), ('\u{a610}', '\u{a61f}', WC_ALetter), ('\u{a620}',
-        '\u{a629}', WC_Numeric), ('\u{a62a}', '\u{a62b}', WC_ALetter), ('\u{a640}', '\u{a66e}',
-        WC_ALetter), ('\u{a66f}', '\u{a672}', WC_Extend), ('\u{a674}', '\u{a67d}', WC_Extend),
-        ('\u{a67f}', '\u{a69d}', WC_ALetter), ('\u{a69e}', '\u{a69f}', WC_Extend), ('\u{a6a0}',
-        '\u{a6ef}', WC_ALetter), ('\u{a6f0}', '\u{a6f1}', WC_Extend), ('\u{a708}', '\u{a7ca}',
-        WC_ALetter), ('\u{a7d0}', '\u{a7d1}', WC_ALetter), ('\u{a7d3}', '\u{a7d3}', WC_ALetter),
-        ('\u{a7d5}', '\u{a7d9}', WC_ALetter), ('\u{a7f2}', '\u{a801}', WC_ALetter), ('\u{a802}',
-        '\u{a802}', WC_Extend), ('\u{a803}', '\u{a805}', WC_ALetter), ('\u{a806}', '\u{a806}',
-        WC_Extend), ('\u{a807}', '\u{a80a}', WC_ALetter), ('\u{a80b}', '\u{a80b}', WC_Extend),
-        ('\u{a80c}', '\u{a822}', WC_ALetter), ('\u{a823}', '\u{a827}', WC_Extend), ('\u{a82c}',
-        '\u{a82c}', WC_Extend), ('\u{a840}', '\u{a873}', WC_ALetter), ('\u{a880}', '\u{a881}',
-        WC_Extend), ('\u{a882}', '\u{a8b3}', WC_ALetter), ('\u{a8b4}', '\u{a8c5}', WC_Extend),
-        ('\u{a8d0}', '\u{a8d9}', WC_Numeric), ('\u{a8e0}', '\u{a8f1}', WC_Extend), ('\u{a8f2}',
-        '\u{a8f7}', WC_ALetter), ('\u{a8fb}', '\u{a8fb}', WC_ALetter), ('\u{a8fd}', '\u{a8fe}',
-        WC_ALetter), ('\u{a8ff}', '\u{a8ff}', WC_Extend), ('\u{a900}', '\u{a909}', WC_Numeric),
-        ('\u{a90a}', '\u{a925}', WC_ALetter), ('\u{a926}', '\u{a92d}', WC_Extend), ('\u{a930}',
-        '\u{a946}', WC_ALetter), ('\u{a947}', '\u{a953}', WC_Extend), ('\u{a960}', '\u{a97c}',
-        WC_ALetter), ('\u{a980}', '\u{a983}', WC_Extend), ('\u{a984}', '\u{a9b2}', WC_ALetter),
-        ('\u{a9b3}', '\u{a9c0}', WC_Extend), ('\u{a9cf}', '\u{a9cf}', WC_ALetter), ('\u{a9d0}',
-        '\u{a9d9}', WC_Numeric), ('\u{a9e5}', '\u{a9e5}', WC_Extend), ('\u{a9f0}', '\u{a9f9}',
-        WC_Numeric), ('\u{aa00}', '\u{aa28}', WC_ALetter), ('\u{aa29}', '\u{aa36}', WC_Extend),
-        ('\u{aa40}', '\u{aa42}', WC_ALetter), ('\u{aa43}', '\u{aa43}', WC_Extend), ('\u{aa44}',
-        '\u{aa4b}', WC_ALetter), ('\u{aa4c}', '\u{aa4d}', WC_Extend), ('\u{aa50}', '\u{aa59}',
-        WC_Numeric), ('\u{aa7b}', '\u{aa7d}', WC_Extend), ('\u{aab0}', '\u{aab0}', WC_Extend),
-        ('\u{aab2}', '\u{aab4}', WC_Extend), ('\u{aab7}', '\u{aab8}', WC_Extend), ('\u{aabe}',
-        '\u{aabf}', WC_Extend), ('\u{aac1}', '\u{aac1}', WC_Extend), ('\u{aae0}', '\u{aaea}',
-        WC_ALetter), ('\u{aaeb}', '\u{aaef}', WC_Extend), ('\u{aaf2}', '\u{aaf4}', WC_ALetter),
-        ('\u{aaf5}', '\u{aaf6}', WC_Extend), ('\u{ab01}', '\u{ab06}', WC_ALetter), ('\u{ab09}',
-        '\u{ab0e}', WC_ALetter), ('\u{ab11}', '\u{ab16}', WC_ALetter), ('\u{ab20}', '\u{ab26}',
-        WC_ALetter), ('\u{ab28}', '\u{ab2e}', WC_ALetter), ('\u{ab30}', '\u{ab69}', WC_ALetter),
-        ('\u{ab70}', '\u{abe2}', WC_ALetter), ('\u{abe3}', '\u{abea}', WC_Extend), ('\u{abec}',
-        '\u{abed}', WC_Extend), ('\u{abf0}', '\u{abf9}', WC_Numeric), ('\u{ac00}', '\u{d7a3}',
-        WC_ALetter), ('\u{d7b0}', '\u{d7c6}', WC_ALetter), ('\u{d7cb}', '\u{d7fb}', WC_ALetter),
-        ('\u{fb00}', '\u{fb06}', WC_ALetter), ('\u{fb13}', '\u{fb17}', WC_ALetter), ('\u{fb1d}',
-        '\u{fb1d}', WC_Hebrew_Letter), ('\u{fb1e}', '\u{fb1e}', WC_Extend), ('\u{fb1f}', '\u{fb28}',
-        WC_Hebrew_Letter), ('\u{fb2a}', '\u{fb36}', WC_Hebrew_Letter), ('\u{fb38}', '\u{fb3c}',
-        WC_Hebrew_Letter), ('\u{fb3e}', '\u{fb3e}', WC_Hebrew_Letter), ('\u{fb40}', '\u{fb41}',
-        WC_Hebrew_Letter), ('\u{fb43}', '\u{fb44}', WC_Hebrew_Letter), ('\u{fb46}', '\u{fb4f}',
-        WC_Hebrew_Letter), ('\u{fb50}', '\u{fbb1}', WC_ALetter), ('\u{fbd3}', '\u{fd3d}',
-        WC_ALetter), ('\u{fd50}', '\u{fd8f}', WC_ALetter), ('\u{fd92}', '\u{fdc7}', WC_ALetter),
-        ('\u{fdf0}', '\u{fdfb}', WC_ALetter), ('\u{fe00}', '\u{fe0f}', WC_Extend), ('\u{fe10}',
-        '\u{fe10}', WC_MidNum), ('\u{fe13}', '\u{fe13}', WC_MidLetter), ('\u{fe14}', '\u{fe14}',
-        WC_MidNum), ('\u{fe20}', '\u{fe2f}', WC_Extend), ('\u{fe33}', '\u{fe34}', WC_ExtendNumLet),
-        ('\u{fe4d}', '\u{fe4f}', WC_ExtendNumLet), ('\u{fe50}', '\u{fe50}', WC_MidNum), ('\u{fe52}',
-        '\u{fe52}', WC_MidNumLet), ('\u{fe54}', '\u{fe54}', WC_MidNum), ('\u{fe55}', '\u{fe55}',
-        WC_MidLetter), ('\u{fe70}', '\u{fe74}', WC_ALetter), ('\u{fe76}', '\u{fefc}', WC_ALetter),
-        ('\u{feff}', '\u{feff}', WC_Format), ('\u{ff07}', '\u{ff07}', WC_MidNumLet), ('\u{ff0c}',
-        '\u{ff0c}', WC_MidNum), ('\u{ff0e}', '\u{ff0e}', WC_MidNumLet), ('\u{ff10}', '\u{ff19}',
-        WC_Numeric), ('\u{ff1a}', '\u{ff1a}', WC_MidLetter), ('\u{ff1b}', '\u{ff1b}', WC_MidNum),
-        ('\u{ff21}', '\u{ff3a}', WC_ALetter), ('\u{ff3f}', '\u{ff3f}', WC_ExtendNumLet),
-        ('\u{ff41}', '\u{ff5a}', WC_ALetter), ('\u{ff66}', '\u{ff9d}', WC_Katakana), ('\u{ff9e}',
-        '\u{ff9f}', WC_Extend), ('\u{ffa0}', '\u{ffbe}', WC_ALetter), ('\u{ffc2}', '\u{ffc7}',
-        WC_ALetter), ('\u{ffca}', '\u{ffcf}', WC_ALetter), ('\u{ffd2}', '\u{ffd7}', WC_ALetter),
-        ('\u{ffda}', '\u{ffdc}', WC_ALetter), ('\u{fff9}', '\u{fffb}', WC_Format), ('\u{10000}',
-        '\u{1000b}', WC_ALetter), ('\u{1000d}', '\u{10026}', WC_ALetter), ('\u{10028}', '\u{1003a}',
-        WC_ALetter), ('\u{1003c}', '\u{1003d}', WC_ALetter), ('\u{1003f}', '\u{1004d}', WC_ALetter),
+        '\u{605}', WC_Numeric), ('\u{60c}', '\u{60d}', WC_MidNum), ('\u{610}', '\u{61a}',
+        WC_Extend), ('\u{61c}', '\u{61c}', WC_Format), ('\u{620}', '\u{64a}', WC_ALetter),
+        ('\u{64b}', '\u{65f}', WC_Extend), ('\u{660}', '\u{669}', WC_Numeric), ('\u{66b}',
+        '\u{66b}', WC_Numeric), ('\u{66c}', '\u{66c}', WC_MidNum), ('\u{66e}', '\u{66f}',
+        WC_ALetter), ('\u{670}', '\u{670}', WC_Extend), ('\u{671}', '\u{6d3}', WC_ALetter),
+        ('\u{6d5}', '\u{6d5}', WC_ALetter), ('\u{6d6}', '\u{6dc}', WC_Extend), ('\u{6dd}',
+        '\u{6dd}', WC_Numeric), ('\u{6df}', '\u{6e4}', WC_Extend), ('\u{6e5}', '\u{6e6}',
+        WC_ALetter), ('\u{6e7}', '\u{6e8}', WC_Extend), ('\u{6ea}', '\u{6ed}', WC_Extend),
+        ('\u{6ee}', '\u{6ef}', WC_ALetter), ('\u{6f0}', '\u{6f9}', WC_Numeric), ('\u{6fa}',
+        '\u{6fc}', WC_ALetter), ('\u{6ff}', '\u{6ff}', WC_ALetter), ('\u{70f}', '\u{710}',
+        WC_ALetter), ('\u{711}', '\u{711}', WC_Extend), ('\u{712}', '\u{72f}', WC_ALetter),
+        ('\u{730}', '\u{74a}', WC_Extend), ('\u{74d}', '\u{7a5}', WC_ALetter), ('\u{7a6}',
+        '\u{7b0}', WC_Extend), ('\u{7b1}', '\u{7b1}', WC_ALetter), ('\u{7c0}', '\u{7c9}',
+        WC_Numeric), ('\u{7ca}', '\u{7ea}', WC_ALetter), ('\u{7eb}', '\u{7f3}', WC_Extend),
+        ('\u{7f4}', '\u{7f5}', WC_ALetter), ('\u{7f8}', '\u{7f8}', WC_MidNum), ('\u{7fa}',
+        '\u{7fa}', WC_ALetter), ('\u{7fd}', '\u{7fd}', WC_Extend), ('\u{800}', '\u{815}',
+        WC_ALetter), ('\u{816}', '\u{819}', WC_Extend), ('\u{81a}', '\u{81a}', WC_ALetter),
+        ('\u{81b}', '\u{823}', WC_Extend), ('\u{824}', '\u{824}', WC_ALetter), ('\u{825}',
+        '\u{827}', WC_Extend), ('\u{828}', '\u{828}', WC_ALetter), ('\u{829}', '\u{82d}',
+        WC_Extend), ('\u{840}', '\u{858}', WC_ALetter), ('\u{859}', '\u{85b}', WC_Extend),
+        ('\u{860}', '\u{86a}', WC_ALetter), ('\u{870}', '\u{887}', WC_ALetter), ('\u{889}',
+        '\u{88e}', WC_ALetter), ('\u{890}', '\u{891}', WC_Numeric), ('\u{897}', '\u{89f}',
+        WC_Extend), ('\u{8a0}', '\u{8c9}', WC_ALetter), ('\u{8ca}', '\u{8e1}', WC_Extend),
+        ('\u{8e2}', '\u{8e2}', WC_Numeric), ('\u{8e3}', '\u{903}', WC_Extend), ('\u{904}',
+        '\u{939}', WC_ALetter), ('\u{93a}', '\u{93c}', WC_Extend), ('\u{93d}', '\u{93d}',
+        WC_ALetter), ('\u{93e}', '\u{94f}', WC_Extend), ('\u{950}', '\u{950}', WC_ALetter),
+        ('\u{951}', '\u{957}', WC_Extend), ('\u{958}', '\u{961}', WC_ALetter), ('\u{962}',
+        '\u{963}', WC_Extend), ('\u{966}', '\u{96f}', WC_Numeric), ('\u{971}', '\u{980}',
+        WC_ALetter), ('\u{981}', '\u{983}', WC_Extend), ('\u{985}', '\u{98c}', WC_ALetter),
+        ('\u{98f}', '\u{990}', WC_ALetter), ('\u{993}', '\u{9a8}', WC_ALetter), ('\u{9aa}',
+        '\u{9b0}', WC_ALetter), ('\u{9b2}', '\u{9b2}', WC_ALetter), ('\u{9b6}', '\u{9b9}',
+        WC_ALetter), ('\u{9bc}', '\u{9bc}', WC_Extend), ('\u{9bd}', '\u{9bd}', WC_ALetter),
+        ('\u{9be}', '\u{9c4}', WC_Extend), ('\u{9c7}', '\u{9c8}', WC_Extend), ('\u{9cb}', '\u{9cd}',
+        WC_Extend), ('\u{9ce}', '\u{9ce}', WC_ALetter), ('\u{9d7}', '\u{9d7}', WC_Extend),
+        ('\u{9dc}', '\u{9dd}', WC_ALetter), ('\u{9df}', '\u{9e1}', WC_ALetter), ('\u{9e2}',
+        '\u{9e3}', WC_Extend), ('\u{9e6}', '\u{9ef}', WC_Numeric), ('\u{9f0}', '\u{9f1}',
+        WC_ALetter), ('\u{9fc}', '\u{9fc}', WC_ALetter), ('\u{9fe}', '\u{9fe}', WC_Extend),
+        ('\u{a01}', '\u{a03}', WC_Extend), ('\u{a05}', '\u{a0a}', WC_ALetter), ('\u{a0f}',
+        '\u{a10}', WC_ALetter), ('\u{a13}', '\u{a28}', WC_ALetter), ('\u{a2a}', '\u{a30}',
+        WC_ALetter), ('\u{a32}', '\u{a33}', WC_ALetter), ('\u{a35}', '\u{a36}', WC_ALetter),
+        ('\u{a38}', '\u{a39}', WC_ALetter), ('\u{a3c}', '\u{a3c}', WC_Extend), ('\u{a3e}',
+        '\u{a42}', WC_Extend), ('\u{a47}', '\u{a48}', WC_Extend), ('\u{a4b}', '\u{a4d}', WC_Extend),
+        ('\u{a51}', '\u{a51}', WC_Extend), ('\u{a59}', '\u{a5c}', WC_ALetter), ('\u{a5e}',
+        '\u{a5e}', WC_ALetter), ('\u{a66}', '\u{a6f}', WC_Numeric), ('\u{a70}', '\u{a71}',
+        WC_Extend), ('\u{a72}', '\u{a74}', WC_ALetter), ('\u{a75}', '\u{a75}', WC_Extend),
+        ('\u{a81}', '\u{a83}', WC_Extend), ('\u{a85}', '\u{a8d}', WC_ALetter), ('\u{a8f}',
+        '\u{a91}', WC_ALetter), ('\u{a93}', '\u{aa8}', WC_ALetter), ('\u{aaa}', '\u{ab0}',
+        WC_ALetter), ('\u{ab2}', '\u{ab3}', WC_ALetter), ('\u{ab5}', '\u{ab9}', WC_ALetter),
+        ('\u{abc}', '\u{abc}', WC_Extend), ('\u{abd}', '\u{abd}', WC_ALetter), ('\u{abe}',
+        '\u{ac5}', WC_Extend), ('\u{ac7}', '\u{ac9}', WC_Extend), ('\u{acb}', '\u{acd}', WC_Extend),
+        ('\u{ad0}', '\u{ad0}', WC_ALetter), ('\u{ae0}', '\u{ae1}', WC_ALetter), ('\u{ae2}',
+        '\u{ae3}', WC_Extend), ('\u{ae6}', '\u{aef}', WC_Numeric), ('\u{af9}', '\u{af9}',
+        WC_ALetter), ('\u{afa}', '\u{aff}', WC_Extend), ('\u{b01}', '\u{b03}', WC_Extend),
+        ('\u{b05}', '\u{b0c}', WC_ALetter), ('\u{b0f}', '\u{b10}', WC_ALetter), ('\u{b13}',
+        '\u{b28}', WC_ALetter), ('\u{b2a}', '\u{b30}', WC_ALetter), ('\u{b32}', '\u{b33}',
+        WC_ALetter), ('\u{b35}', '\u{b39}', WC_ALetter), ('\u{b3c}', '\u{b3c}', WC_Extend),
+        ('\u{b3d}', '\u{b3d}', WC_ALetter), ('\u{b3e}', '\u{b44}', WC_Extend), ('\u{b47}',
+        '\u{b48}', WC_Extend), ('\u{b4b}', '\u{b4d}', WC_Extend), ('\u{b55}', '\u{b57}', WC_Extend),
+        ('\u{b5c}', '\u{b5d}', WC_ALetter), ('\u{b5f}', '\u{b61}', WC_ALetter), ('\u{b62}',
+        '\u{b63}', WC_Extend), ('\u{b66}', '\u{b6f}', WC_Numeric), ('\u{b71}', '\u{b71}',
+        WC_ALetter), ('\u{b82}', '\u{b82}', WC_Extend), ('\u{b83}', '\u{b83}', WC_ALetter),
+        ('\u{b85}', '\u{b8a}', WC_ALetter), ('\u{b8e}', '\u{b90}', WC_ALetter), ('\u{b92}',
+        '\u{b95}', WC_ALetter), ('\u{b99}', '\u{b9a}', WC_ALetter), ('\u{b9c}', '\u{b9c}',
+        WC_ALetter), ('\u{b9e}', '\u{b9f}', WC_ALetter), ('\u{ba3}', '\u{ba4}', WC_ALetter),
+        ('\u{ba8}', '\u{baa}', WC_ALetter), ('\u{bae}', '\u{bb9}', WC_ALetter), ('\u{bbe}',
+        '\u{bc2}', WC_Extend), ('\u{bc6}', '\u{bc8}', WC_Extend), ('\u{bca}', '\u{bcd}', WC_Extend),
+        ('\u{bd0}', '\u{bd0}', WC_ALetter), ('\u{bd7}', '\u{bd7}', WC_Extend), ('\u{be6}',
+        '\u{bef}', WC_Numeric), ('\u{c00}', '\u{c04}', WC_Extend), ('\u{c05}', '\u{c0c}',
+        WC_ALetter), ('\u{c0e}', '\u{c10}', WC_ALetter), ('\u{c12}', '\u{c28}', WC_ALetter),
+        ('\u{c2a}', '\u{c39}', WC_ALetter), ('\u{c3c}', '\u{c3c}', WC_Extend), ('\u{c3d}',
+        '\u{c3d}', WC_ALetter), ('\u{c3e}', '\u{c44}', WC_Extend), ('\u{c46}', '\u{c48}',
+        WC_Extend), ('\u{c4a}', '\u{c4d}', WC_Extend), ('\u{c55}', '\u{c56}', WC_Extend),
+        ('\u{c58}', '\u{c5a}', WC_ALetter), ('\u{c5d}', '\u{c5d}', WC_ALetter), ('\u{c60}',
+        '\u{c61}', WC_ALetter), ('\u{c62}', '\u{c63}', WC_Extend), ('\u{c66}', '\u{c6f}',
+        WC_Numeric), ('\u{c80}', '\u{c80}', WC_ALetter), ('\u{c81}', '\u{c83}', WC_Extend),
+        ('\u{c85}', '\u{c8c}', WC_ALetter), ('\u{c8e}', '\u{c90}', WC_ALetter), ('\u{c92}',
+        '\u{ca8}', WC_ALetter), ('\u{caa}', '\u{cb3}', WC_ALetter), ('\u{cb5}', '\u{cb9}',
+        WC_ALetter), ('\u{cbc}', '\u{cbc}', WC_Extend), ('\u{cbd}', '\u{cbd}', WC_ALetter),
+        ('\u{cbe}', '\u{cc4}', WC_Extend), ('\u{cc6}', '\u{cc8}', WC_Extend), ('\u{cca}', '\u{ccd}',
+        WC_Extend), ('\u{cd5}', '\u{cd6}', WC_Extend), ('\u{cdd}', '\u{cde}', WC_ALetter),
+        ('\u{ce0}', '\u{ce1}', WC_ALetter), ('\u{ce2}', '\u{ce3}', WC_Extend), ('\u{ce6}',
+        '\u{cef}', WC_Numeric), ('\u{cf1}', '\u{cf2}', WC_ALetter), ('\u{cf3}', '\u{cf3}',
+        WC_Extend), ('\u{d00}', '\u{d03}', WC_Extend), ('\u{d04}', '\u{d0c}', WC_ALetter),
+        ('\u{d0e}', '\u{d10}', WC_ALetter), ('\u{d12}', '\u{d3a}', WC_ALetter), ('\u{d3b}',
+        '\u{d3c}', WC_Extend), ('\u{d3d}', '\u{d3d}', WC_ALetter), ('\u{d3e}', '\u{d44}',
+        WC_Extend), ('\u{d46}', '\u{d48}', WC_Extend), ('\u{d4a}', '\u{d4d}', WC_Extend),
+        ('\u{d4e}', '\u{d4e}', WC_ALetter), ('\u{d54}', '\u{d56}', WC_ALetter), ('\u{d57}',
+        '\u{d57}', WC_Extend), ('\u{d5f}', '\u{d61}', WC_ALetter), ('\u{d62}', '\u{d63}',
+        WC_Extend), ('\u{d66}', '\u{d6f}', WC_Numeric), ('\u{d7a}', '\u{d7f}', WC_ALetter),
+        ('\u{d81}', '\u{d83}', WC_Extend), ('\u{d85}', '\u{d96}', WC_ALetter), ('\u{d9a}',
+        '\u{db1}', WC_ALetter), ('\u{db3}', '\u{dbb}', WC_ALetter), ('\u{dbd}', '\u{dbd}',
+        WC_ALetter), ('\u{dc0}', '\u{dc6}', WC_ALetter), ('\u{dca}', '\u{dca}', WC_Extend),
+        ('\u{dcf}', '\u{dd4}', WC_Extend), ('\u{dd6}', '\u{dd6}', WC_Extend), ('\u{dd8}', '\u{ddf}',
+        WC_Extend), ('\u{de6}', '\u{def}', WC_Numeric), ('\u{df2}', '\u{df3}', WC_Extend),
+        ('\u{e31}', '\u{e31}', WC_Extend), ('\u{e34}', '\u{e3a}', WC_Extend), ('\u{e47}', '\u{e4e}',
+        WC_Extend), ('\u{e50}', '\u{e59}', WC_Numeric), ('\u{eb1}', '\u{eb1}', WC_Extend),
+        ('\u{eb4}', '\u{ebc}', WC_Extend), ('\u{ec8}', '\u{ece}', WC_Extend), ('\u{ed0}', '\u{ed9}',
+        WC_Numeric), ('\u{f00}', '\u{f00}', WC_ALetter), ('\u{f18}', '\u{f19}', WC_Extend),
+        ('\u{f20}', '\u{f29}', WC_Numeric), ('\u{f35}', '\u{f35}', WC_Extend), ('\u{f37}',
+        '\u{f37}', WC_Extend), ('\u{f39}', '\u{f39}', WC_Extend), ('\u{f3e}', '\u{f3f}', WC_Extend),
+        ('\u{f40}', '\u{f47}', WC_ALetter), ('\u{f49}', '\u{f6c}', WC_ALetter), ('\u{f71}',
+        '\u{f84}', WC_Extend), ('\u{f86}', '\u{f87}', WC_Extend), ('\u{f88}', '\u{f8c}',
+        WC_ALetter), ('\u{f8d}', '\u{f97}', WC_Extend), ('\u{f99}', '\u{fbc}', WC_Extend),
+        ('\u{fc6}', '\u{fc6}', WC_Extend), ('\u{102b}', '\u{103e}', WC_Extend), ('\u{1040}',
+        '\u{1049}', WC_Numeric), ('\u{1056}', '\u{1059}', WC_Extend), ('\u{105e}', '\u{1060}',
+        WC_Extend), ('\u{1062}', '\u{1064}', WC_Extend), ('\u{1067}', '\u{106d}', WC_Extend),
+        ('\u{1071}', '\u{1074}', WC_Extend), ('\u{1082}', '\u{108d}', WC_Extend), ('\u{108f}',
+        '\u{108f}', WC_Extend), ('\u{1090}', '\u{1099}', WC_Numeric), ('\u{109a}', '\u{109d}',
+        WC_Extend), ('\u{10a0}', '\u{10c5}', WC_ALetter), ('\u{10c7}', '\u{10c7}', WC_ALetter),
+        ('\u{10cd}', '\u{10cd}', WC_ALetter), ('\u{10d0}', '\u{10fa}', WC_ALetter), ('\u{10fc}',
+        '\u{1248}', WC_ALetter), ('\u{124a}', '\u{124d}', WC_ALetter), ('\u{1250}', '\u{1256}',
+        WC_ALetter), ('\u{1258}', '\u{1258}', WC_ALetter), ('\u{125a}', '\u{125d}', WC_ALetter),
+        ('\u{1260}', '\u{1288}', WC_ALetter), ('\u{128a}', '\u{128d}', WC_ALetter), ('\u{1290}',
+        '\u{12b0}', WC_ALetter), ('\u{12b2}', '\u{12b5}', WC_ALetter), ('\u{12b8}', '\u{12be}',
+        WC_ALetter), ('\u{12c0}', '\u{12c0}', WC_ALetter), ('\u{12c2}', '\u{12c5}', WC_ALetter),
+        ('\u{12c8}', '\u{12d6}', WC_ALetter), ('\u{12d8}', '\u{1310}', WC_ALetter), ('\u{1312}',
+        '\u{1315}', WC_ALetter), ('\u{1318}', '\u{135a}', WC_ALetter), ('\u{135d}', '\u{135f}',
+        WC_Extend), ('\u{1380}', '\u{138f}', WC_ALetter), ('\u{13a0}', '\u{13f5}', WC_ALetter),
+        ('\u{13f8}', '\u{13fd}', WC_ALetter), ('\u{1401}', '\u{166c}', WC_ALetter), ('\u{166f}',
+        '\u{167f}', WC_ALetter), ('\u{1680}', '\u{1680}', WC_WSegSpace), ('\u{1681}', '\u{169a}',
+        WC_ALetter), ('\u{16a0}', '\u{16ea}', WC_ALetter), ('\u{16ee}', '\u{16f8}', WC_ALetter),
+        ('\u{1700}', '\u{1711}', WC_ALetter), ('\u{1712}', '\u{1715}', WC_Extend), ('\u{171f}',
+        '\u{1731}', WC_ALetter), ('\u{1732}', '\u{1734}', WC_Extend), ('\u{1740}', '\u{1751}',
+        WC_ALetter), ('\u{1752}', '\u{1753}', WC_Extend), ('\u{1760}', '\u{176c}', WC_ALetter),
+        ('\u{176e}', '\u{1770}', WC_ALetter), ('\u{1772}', '\u{1773}', WC_Extend), ('\u{17b4}',
+        '\u{17d3}', WC_Extend), ('\u{17dd}', '\u{17dd}', WC_Extend), ('\u{17e0}', '\u{17e9}',
+        WC_Numeric), ('\u{180b}', '\u{180d}', WC_Extend), ('\u{180e}', '\u{180e}', WC_Format),
+        ('\u{180f}', '\u{180f}', WC_Extend), ('\u{1810}', '\u{1819}', WC_Numeric), ('\u{1820}',
+        '\u{1878}', WC_ALetter), ('\u{1880}', '\u{1884}', WC_ALetter), ('\u{1885}', '\u{1886}',
+        WC_Extend), ('\u{1887}', '\u{18a8}', WC_ALetter), ('\u{18a9}', '\u{18a9}', WC_Extend),
+        ('\u{18aa}', '\u{18aa}', WC_ALetter), ('\u{18b0}', '\u{18f5}', WC_ALetter), ('\u{1900}',
+        '\u{191e}', WC_ALetter), ('\u{1920}', '\u{192b}', WC_Extend), ('\u{1930}', '\u{193b}',
+        WC_Extend), ('\u{1946}', '\u{194f}', WC_Numeric), ('\u{19d0}', '\u{19da}', WC_Numeric),
+        ('\u{1a00}', '\u{1a16}', WC_ALetter), ('\u{1a17}', '\u{1a1b}', WC_Extend), ('\u{1a55}',
+        '\u{1a5e}', WC_Extend), ('\u{1a60}', '\u{1a7c}', WC_Extend), ('\u{1a7f}', '\u{1a7f}',
+        WC_Extend), ('\u{1a80}', '\u{1a89}', WC_Numeric), ('\u{1a90}', '\u{1a99}', WC_Numeric),
+        ('\u{1ab0}', '\u{1ace}', WC_Extend), ('\u{1b00}', '\u{1b04}', WC_Extend), ('\u{1b05}',
+        '\u{1b33}', WC_ALetter), ('\u{1b34}', '\u{1b44}', WC_Extend), ('\u{1b45}', '\u{1b4c}',
+        WC_ALetter), ('\u{1b50}', '\u{1b59}', WC_Numeric), ('\u{1b6b}', '\u{1b73}', WC_Extend),
+        ('\u{1b80}', '\u{1b82}', WC_Extend), ('\u{1b83}', '\u{1ba0}', WC_ALetter), ('\u{1ba1}',
+        '\u{1bad}', WC_Extend), ('\u{1bae}', '\u{1baf}', WC_ALetter), ('\u{1bb0}', '\u{1bb9}',
+        WC_Numeric), ('\u{1bba}', '\u{1be5}', WC_ALetter), ('\u{1be6}', '\u{1bf3}', WC_Extend),
+        ('\u{1c00}', '\u{1c23}', WC_ALetter), ('\u{1c24}', '\u{1c37}', WC_Extend), ('\u{1c40}',
+        '\u{1c49}', WC_Numeric), ('\u{1c4d}', '\u{1c4f}', WC_ALetter), ('\u{1c50}', '\u{1c59}',
+        WC_Numeric), ('\u{1c5a}', '\u{1c7d}', WC_ALetter), ('\u{1c80}', '\u{1c8a}', WC_ALetter),
+        ('\u{1c90}', '\u{1cba}', WC_ALetter), ('\u{1cbd}', '\u{1cbf}', WC_ALetter), ('\u{1cd0}',
+        '\u{1cd2}', WC_Extend), ('\u{1cd4}', '\u{1ce8}', WC_Extend), ('\u{1ce9}', '\u{1cec}',
+        WC_ALetter), ('\u{1ced}', '\u{1ced}', WC_Extend), ('\u{1cee}', '\u{1cf3}', WC_ALetter),
+        ('\u{1cf4}', '\u{1cf4}', WC_Extend), ('\u{1cf5}', '\u{1cf6}', WC_ALetter), ('\u{1cf7}',
+        '\u{1cf9}', WC_Extend), ('\u{1cfa}', '\u{1cfa}', WC_ALetter), ('\u{1d00}', '\u{1dbf}',
+        WC_ALetter), ('\u{1dc0}', '\u{1dff}', WC_Extend), ('\u{1e00}', '\u{1f15}', WC_ALetter),
+        ('\u{1f18}', '\u{1f1d}', WC_ALetter), ('\u{1f20}', '\u{1f45}', WC_ALetter), ('\u{1f48}',
+        '\u{1f4d}', WC_ALetter), ('\u{1f50}', '\u{1f57}', WC_ALetter), ('\u{1f59}', '\u{1f59}',
+        WC_ALetter), ('\u{1f5b}', '\u{1f5b}', WC_ALetter), ('\u{1f5d}', '\u{1f5d}', WC_ALetter),
+        ('\u{1f5f}', '\u{1f7d}', WC_ALetter), ('\u{1f80}', '\u{1fb4}', WC_ALetter), ('\u{1fb6}',
+        '\u{1fbc}', WC_ALetter), ('\u{1fbe}', '\u{1fbe}', WC_ALetter), ('\u{1fc2}', '\u{1fc4}',
+        WC_ALetter), ('\u{1fc6}', '\u{1fcc}', WC_ALetter), ('\u{1fd0}', '\u{1fd3}', WC_ALetter),
+        ('\u{1fd6}', '\u{1fdb}', WC_ALetter), ('\u{1fe0}', '\u{1fec}', WC_ALetter), ('\u{1ff2}',
+        '\u{1ff4}', WC_ALetter), ('\u{1ff6}', '\u{1ffc}', WC_ALetter), ('\u{2000}', '\u{2006}',
+        WC_WSegSpace), ('\u{2008}', '\u{200a}', WC_WSegSpace), ('\u{200c}', '\u{200c}', WC_Extend),
+        ('\u{200d}', '\u{200d}', WC_ZWJ), ('\u{200e}', '\u{200f}', WC_Format), ('\u{2018}',
+        '\u{2019}', WC_MidNumLet), ('\u{2024}', '\u{2024}', WC_MidNumLet), ('\u{2027}', '\u{2027}',
+        WC_MidLetter), ('\u{2028}', '\u{2029}', WC_Newline), ('\u{202a}', '\u{202e}', WC_Format),
+        ('\u{202f}', '\u{202f}', WC_ExtendNumLet), ('\u{203f}', '\u{2040}', WC_ExtendNumLet),
+        ('\u{2044}', '\u{2044}', WC_MidNum), ('\u{2054}', '\u{2054}', WC_ExtendNumLet), ('\u{205f}',
+        '\u{205f}', WC_WSegSpace), ('\u{2060}', '\u{2064}', WC_Format), ('\u{2066}', '\u{206f}',
+        WC_Format), ('\u{2071}', '\u{2071}', WC_ALetter), ('\u{207f}', '\u{207f}', WC_ALetter),
+        ('\u{2090}', '\u{209c}', WC_ALetter), ('\u{20d0}', '\u{20f0}', WC_Extend), ('\u{2102}',
+        '\u{2102}', WC_ALetter), ('\u{2107}', '\u{2107}', WC_ALetter), ('\u{210a}', '\u{2113}',
+        WC_ALetter), ('\u{2115}', '\u{2115}', WC_ALetter), ('\u{2119}', '\u{211d}', WC_ALetter),
+        ('\u{2124}', '\u{2124}', WC_ALetter), ('\u{2126}', '\u{2126}', WC_ALetter), ('\u{2128}',
+        '\u{2128}', WC_ALetter), ('\u{212a}', '\u{212d}', WC_ALetter), ('\u{212f}', '\u{2139}',
+        WC_ALetter), ('\u{213c}', '\u{213f}', WC_ALetter), ('\u{2145}', '\u{2149}', WC_ALetter),
+        ('\u{214e}', '\u{214e}', WC_ALetter), ('\u{2160}', '\u{2188}', WC_ALetter), ('\u{24b6}',
+        '\u{24e9}', WC_ALetter), ('\u{2c00}', '\u{2ce4}', WC_ALetter), ('\u{2ceb}', '\u{2cee}',
+        WC_ALetter), ('\u{2cef}', '\u{2cf1}', WC_Extend), ('\u{2cf2}', '\u{2cf3}', WC_ALetter),
+        ('\u{2d00}', '\u{2d25}', WC_ALetter), ('\u{2d27}', '\u{2d27}', WC_ALetter), ('\u{2d2d}',
+        '\u{2d2d}', WC_ALetter), ('\u{2d30}', '\u{2d67}', WC_ALetter), ('\u{2d6f}', '\u{2d6f}',
+        WC_ALetter), ('\u{2d7f}', '\u{2d7f}', WC_Extend), ('\u{2d80}', '\u{2d96}', WC_ALetter),
+        ('\u{2da0}', '\u{2da6}', WC_ALetter), ('\u{2da8}', '\u{2dae}', WC_ALetter), ('\u{2db0}',
+        '\u{2db6}', WC_ALetter), ('\u{2db8}', '\u{2dbe}', WC_ALetter), ('\u{2dc0}', '\u{2dc6}',
+        WC_ALetter), ('\u{2dc8}', '\u{2dce}', WC_ALetter), ('\u{2dd0}', '\u{2dd6}', WC_ALetter),
+        ('\u{2dd8}', '\u{2dde}', WC_ALetter), ('\u{2de0}', '\u{2dff}', WC_Extend), ('\u{2e2f}',
+        '\u{2e2f}', WC_ALetter), ('\u{3000}', '\u{3000}', WC_WSegSpace), ('\u{3005}', '\u{3005}',
+        WC_ALetter), ('\u{302a}', '\u{302f}', WC_Extend), ('\u{3031}', '\u{3035}', WC_Katakana),
+        ('\u{303b}', '\u{303c}', WC_ALetter), ('\u{3099}', '\u{309a}', WC_Extend), ('\u{309b}',
+        '\u{309c}', WC_Katakana), ('\u{30a0}', '\u{30fa}', WC_Katakana), ('\u{30fc}', '\u{30ff}',
+        WC_Katakana), ('\u{3105}', '\u{312f}', WC_ALetter), ('\u{3131}', '\u{318e}', WC_ALetter),
+        ('\u{31a0}', '\u{31bf}', WC_ALetter), ('\u{31f0}', '\u{31ff}', WC_Katakana), ('\u{32d0}',
+        '\u{32fe}', WC_Katakana), ('\u{3300}', '\u{3357}', WC_Katakana), ('\u{a000}', '\u{a48c}',
+        WC_ALetter), ('\u{a4d0}', '\u{a4fd}', WC_ALetter), ('\u{a500}', '\u{a60c}', WC_ALetter),
+        ('\u{a610}', '\u{a61f}', WC_ALetter), ('\u{a620}', '\u{a629}', WC_Numeric), ('\u{a62a}',
+        '\u{a62b}', WC_ALetter), ('\u{a640}', '\u{a66e}', WC_ALetter), ('\u{a66f}', '\u{a672}',
+        WC_Extend), ('\u{a674}', '\u{a67d}', WC_Extend), ('\u{a67f}', '\u{a69d}', WC_ALetter),
+        ('\u{a69e}', '\u{a69f}', WC_Extend), ('\u{a6a0}', '\u{a6ef}', WC_ALetter), ('\u{a6f0}',
+        '\u{a6f1}', WC_Extend), ('\u{a708}', '\u{a7cd}', WC_ALetter), ('\u{a7d0}', '\u{a7d1}',
+        WC_ALetter), ('\u{a7d3}', '\u{a7d3}', WC_ALetter), ('\u{a7d5}', '\u{a7dc}', WC_ALetter),
+        ('\u{a7f2}', '\u{a801}', WC_ALetter), ('\u{a802}', '\u{a802}', WC_Extend), ('\u{a803}',
+        '\u{a805}', WC_ALetter), ('\u{a806}', '\u{a806}', WC_Extend), ('\u{a807}', '\u{a80a}',
+        WC_ALetter), ('\u{a80b}', '\u{a80b}', WC_Extend), ('\u{a80c}', '\u{a822}', WC_ALetter),
+        ('\u{a823}', '\u{a827}', WC_Extend), ('\u{a82c}', '\u{a82c}', WC_Extend), ('\u{a840}',
+        '\u{a873}', WC_ALetter), ('\u{a880}', '\u{a881}', WC_Extend), ('\u{a882}', '\u{a8b3}',
+        WC_ALetter), ('\u{a8b4}', '\u{a8c5}', WC_Extend), ('\u{a8d0}', '\u{a8d9}', WC_Numeric),
+        ('\u{a8e0}', '\u{a8f1}', WC_Extend), ('\u{a8f2}', '\u{a8f7}', WC_ALetter), ('\u{a8fb}',
+        '\u{a8fb}', WC_ALetter), ('\u{a8fd}', '\u{a8fe}', WC_ALetter), ('\u{a8ff}', '\u{a8ff}',
+        WC_Extend), ('\u{a900}', '\u{a909}', WC_Numeric), ('\u{a90a}', '\u{a925}', WC_ALetter),
+        ('\u{a926}', '\u{a92d}', WC_Extend), ('\u{a930}', '\u{a946}', WC_ALetter), ('\u{a947}',
+        '\u{a953}', WC_Extend), ('\u{a960}', '\u{a97c}', WC_ALetter), ('\u{a980}', '\u{a983}',
+        WC_Extend), ('\u{a984}', '\u{a9b2}', WC_ALetter), ('\u{a9b3}', '\u{a9c0}', WC_Extend),
+        ('\u{a9cf}', '\u{a9cf}', WC_ALetter), ('\u{a9d0}', '\u{a9d9}', WC_Numeric), ('\u{a9e5}',
+        '\u{a9e5}', WC_Extend), ('\u{a9f0}', '\u{a9f9}', WC_Numeric), ('\u{aa00}', '\u{aa28}',
+        WC_ALetter), ('\u{aa29}', '\u{aa36}', WC_Extend), ('\u{aa40}', '\u{aa42}', WC_ALetter),
+        ('\u{aa43}', '\u{aa43}', WC_Extend), ('\u{aa44}', '\u{aa4b}', WC_ALetter), ('\u{aa4c}',
+        '\u{aa4d}', WC_Extend), ('\u{aa50}', '\u{aa59}', WC_Numeric), ('\u{aa7b}', '\u{aa7d}',
+        WC_Extend), ('\u{aab0}', '\u{aab0}', WC_Extend), ('\u{aab2}', '\u{aab4}', WC_Extend),
+        ('\u{aab7}', '\u{aab8}', WC_Extend), ('\u{aabe}', '\u{aabf}', WC_Extend), ('\u{aac1}',
+        '\u{aac1}', WC_Extend), ('\u{aae0}', '\u{aaea}', WC_ALetter), ('\u{aaeb}', '\u{aaef}',
+        WC_Extend), ('\u{aaf2}', '\u{aaf4}', WC_ALetter), ('\u{aaf5}', '\u{aaf6}', WC_Extend),
+        ('\u{ab01}', '\u{ab06}', WC_ALetter), ('\u{ab09}', '\u{ab0e}', WC_ALetter), ('\u{ab11}',
+        '\u{ab16}', WC_ALetter), ('\u{ab20}', '\u{ab26}', WC_ALetter), ('\u{ab28}', '\u{ab2e}',
+        WC_ALetter), ('\u{ab30}', '\u{ab69}', WC_ALetter), ('\u{ab70}', '\u{abe2}', WC_ALetter),
+        ('\u{abe3}', '\u{abea}', WC_Extend), ('\u{abec}', '\u{abed}', WC_Extend), ('\u{abf0}',
+        '\u{abf9}', WC_Numeric), ('\u{ac00}', '\u{d7a3}', WC_ALetter), ('\u{d7b0}', '\u{d7c6}',
+        WC_ALetter), ('\u{d7cb}', '\u{d7fb}', WC_ALetter), ('\u{fb00}', '\u{fb06}', WC_ALetter),
+        ('\u{fb13}', '\u{fb17}', WC_ALetter), ('\u{fb1d}', '\u{fb1d}', WC_Hebrew_Letter),
+        ('\u{fb1e}', '\u{fb1e}', WC_Extend), ('\u{fb1f}', '\u{fb28}', WC_Hebrew_Letter),
+        ('\u{fb2a}', '\u{fb36}', WC_Hebrew_Letter), ('\u{fb38}', '\u{fb3c}', WC_Hebrew_Letter),
+        ('\u{fb3e}', '\u{fb3e}', WC_Hebrew_Letter), ('\u{fb40}', '\u{fb41}', WC_Hebrew_Letter),
+        ('\u{fb43}', '\u{fb44}', WC_Hebrew_Letter), ('\u{fb46}', '\u{fb4f}', WC_Hebrew_Letter),
+        ('\u{fb50}', '\u{fbb1}', WC_ALetter), ('\u{fbd3}', '\u{fd3d}', WC_ALetter), ('\u{fd50}',
+        '\u{fd8f}', WC_ALetter), ('\u{fd92}', '\u{fdc7}', WC_ALetter), ('\u{fdf0}', '\u{fdfb}',
+        WC_ALetter), ('\u{fe00}', '\u{fe0f}', WC_Extend), ('\u{fe13}', '\u{fe13}', WC_MidLetter),
+        ('\u{fe20}', '\u{fe2f}', WC_Extend), ('\u{fe33}', '\u{fe34}', WC_ExtendNumLet), ('\u{fe4d}',
+        '\u{fe4f}', WC_ExtendNumLet), ('\u{fe50}', '\u{fe50}', WC_MidNum), ('\u{fe52}', '\u{fe52}',
+        WC_MidNumLet), ('\u{fe54}', '\u{fe54}', WC_MidNum), ('\u{fe55}', '\u{fe55}', WC_MidLetter),
+        ('\u{fe70}', '\u{fe74}', WC_ALetter), ('\u{fe76}', '\u{fefc}', WC_ALetter), ('\u{feff}',
+        '\u{feff}', WC_Format), ('\u{ff07}', '\u{ff07}', WC_MidNumLet), ('\u{ff0c}', '\u{ff0c}',
+        WC_MidNum), ('\u{ff0e}', '\u{ff0e}', WC_MidNumLet), ('\u{ff10}', '\u{ff19}', WC_Numeric),
+        ('\u{ff1a}', '\u{ff1a}', WC_MidLetter), ('\u{ff1b}', '\u{ff1b}', WC_MidNum), ('\u{ff21}',
+        '\u{ff3a}', WC_ALetter), ('\u{ff3f}', '\u{ff3f}', WC_ExtendNumLet), ('\u{ff41}', '\u{ff5a}',
+        WC_ALetter), ('\u{ff66}', '\u{ff9d}', WC_Katakana), ('\u{ff9e}', '\u{ff9f}', WC_Extend),
+        ('\u{ffa0}', '\u{ffbe}', WC_ALetter), ('\u{ffc2}', '\u{ffc7}', WC_ALetter), ('\u{ffca}',
+        '\u{ffcf}', WC_ALetter), ('\u{ffd2}', '\u{ffd7}', WC_ALetter), ('\u{ffda}', '\u{ffdc}',
+        WC_ALetter), ('\u{fff9}', '\u{fffb}', WC_Format), ('\u{10000}', '\u{1000b}', WC_ALetter),
+        ('\u{1000d}', '\u{10026}', WC_ALetter), ('\u{10028}', '\u{1003a}', WC_ALetter),
+        ('\u{1003c}', '\u{1003d}', WC_ALetter), ('\u{1003f}', '\u{1004d}', WC_ALetter),
         ('\u{10050}', '\u{1005d}', WC_ALetter), ('\u{10080}', '\u{100fa}', WC_ALetter),
         ('\u{10140}', '\u{10174}', WC_ALetter), ('\u{101fd}', '\u{101fd}', WC_Extend), ('\u{10280}',
         '\u{1029c}', WC_ALetter), ('\u{102a0}', '\u{102d0}', WC_ALetter), ('\u{102e0}', '\u{102e0}',
@@ -1499,133 +1659,146 @@
         ('\u{1057c}', '\u{1058a}', WC_ALetter), ('\u{1058c}', '\u{10592}', WC_ALetter),
         ('\u{10594}', '\u{10595}', WC_ALetter), ('\u{10597}', '\u{105a1}', WC_ALetter),
         ('\u{105a3}', '\u{105b1}', WC_ALetter), ('\u{105b3}', '\u{105b9}', WC_ALetter),
-        ('\u{105bb}', '\u{105bc}', WC_ALetter), ('\u{10600}', '\u{10736}', WC_ALetter),
-        ('\u{10740}', '\u{10755}', WC_ALetter), ('\u{10760}', '\u{10767}', WC_ALetter),
-        ('\u{10780}', '\u{10785}', WC_ALetter), ('\u{10787}', '\u{107b0}', WC_ALetter),
-        ('\u{107b2}', '\u{107ba}', WC_ALetter), ('\u{10800}', '\u{10805}', WC_ALetter),
-        ('\u{10808}', '\u{10808}', WC_ALetter), ('\u{1080a}', '\u{10835}', WC_ALetter),
-        ('\u{10837}', '\u{10838}', WC_ALetter), ('\u{1083c}', '\u{1083c}', WC_ALetter),
-        ('\u{1083f}', '\u{10855}', WC_ALetter), ('\u{10860}', '\u{10876}', WC_ALetter),
-        ('\u{10880}', '\u{1089e}', WC_ALetter), ('\u{108e0}', '\u{108f2}', WC_ALetter),
-        ('\u{108f4}', '\u{108f5}', WC_ALetter), ('\u{10900}', '\u{10915}', WC_ALetter),
-        ('\u{10920}', '\u{10939}', WC_ALetter), ('\u{10980}', '\u{109b7}', WC_ALetter),
-        ('\u{109be}', '\u{109bf}', WC_ALetter), ('\u{10a00}', '\u{10a00}', WC_ALetter),
-        ('\u{10a01}', '\u{10a03}', WC_Extend), ('\u{10a05}', '\u{10a06}', WC_Extend), ('\u{10a0c}',
-        '\u{10a0f}', WC_Extend), ('\u{10a10}', '\u{10a13}', WC_ALetter), ('\u{10a15}', '\u{10a17}',
-        WC_ALetter), ('\u{10a19}', '\u{10a35}', WC_ALetter), ('\u{10a38}', '\u{10a3a}', WC_Extend),
-        ('\u{10a3f}', '\u{10a3f}', WC_Extend), ('\u{10a60}', '\u{10a7c}', WC_ALetter), ('\u{10a80}',
-        '\u{10a9c}', WC_ALetter), ('\u{10ac0}', '\u{10ac7}', WC_ALetter), ('\u{10ac9}', '\u{10ae4}',
-        WC_ALetter), ('\u{10ae5}', '\u{10ae6}', WC_Extend), ('\u{10b00}', '\u{10b35}', WC_ALetter),
-        ('\u{10b40}', '\u{10b55}', WC_ALetter), ('\u{10b60}', '\u{10b72}', WC_ALetter),
-        ('\u{10b80}', '\u{10b91}', WC_ALetter), ('\u{10c00}', '\u{10c48}', WC_ALetter),
-        ('\u{10c80}', '\u{10cb2}', WC_ALetter), ('\u{10cc0}', '\u{10cf2}', WC_ALetter),
-        ('\u{10d00}', '\u{10d23}', WC_ALetter), ('\u{10d24}', '\u{10d27}', WC_Extend), ('\u{10d30}',
-        '\u{10d39}', WC_Numeric), ('\u{10e80}', '\u{10ea9}', WC_ALetter), ('\u{10eab}', '\u{10eac}',
-        WC_Extend), ('\u{10eb0}', '\u{10eb1}', WC_ALetter), ('\u{10efd}', '\u{10eff}', WC_Extend),
-        ('\u{10f00}', '\u{10f1c}', WC_ALetter), ('\u{10f27}', '\u{10f27}', WC_ALetter),
-        ('\u{10f30}', '\u{10f45}', WC_ALetter), ('\u{10f46}', '\u{10f50}', WC_Extend), ('\u{10f70}',
-        '\u{10f81}', WC_ALetter), ('\u{10f82}', '\u{10f85}', WC_Extend), ('\u{10fb0}', '\u{10fc4}',
-        WC_ALetter), ('\u{10fe0}', '\u{10ff6}', WC_ALetter), ('\u{11000}', '\u{11002}', WC_Extend),
-        ('\u{11003}', '\u{11037}', WC_ALetter), ('\u{11038}', '\u{11046}', WC_Extend), ('\u{11066}',
-        '\u{1106f}', WC_Numeric), ('\u{11070}', '\u{11070}', WC_Extend), ('\u{11071}', '\u{11072}',
-        WC_ALetter), ('\u{11073}', '\u{11074}', WC_Extend), ('\u{11075}', '\u{11075}', WC_ALetter),
-        ('\u{1107f}', '\u{11082}', WC_Extend), ('\u{11083}', '\u{110af}', WC_ALetter), ('\u{110b0}',
-        '\u{110ba}', WC_Extend), ('\u{110bd}', '\u{110bd}', WC_Format), ('\u{110c2}', '\u{110c2}',
-        WC_Extend), ('\u{110cd}', '\u{110cd}', WC_Format), ('\u{110d0}', '\u{110e8}', WC_ALetter),
-        ('\u{110f0}', '\u{110f9}', WC_Numeric), ('\u{11100}', '\u{11102}', WC_Extend), ('\u{11103}',
-        '\u{11126}', WC_ALetter), ('\u{11127}', '\u{11134}', WC_Extend), ('\u{11136}', '\u{1113f}',
-        WC_Numeric), ('\u{11144}', '\u{11144}', WC_ALetter), ('\u{11145}', '\u{11146}', WC_Extend),
-        ('\u{11147}', '\u{11147}', WC_ALetter), ('\u{11150}', '\u{11172}', WC_ALetter),
-        ('\u{11173}', '\u{11173}', WC_Extend), ('\u{11176}', '\u{11176}', WC_ALetter), ('\u{11180}',
-        '\u{11182}', WC_Extend), ('\u{11183}', '\u{111b2}', WC_ALetter), ('\u{111b3}', '\u{111c0}',
-        WC_Extend), ('\u{111c1}', '\u{111c4}', WC_ALetter), ('\u{111c9}', '\u{111cc}', WC_Extend),
-        ('\u{111ce}', '\u{111cf}', WC_Extend), ('\u{111d0}', '\u{111d9}', WC_Numeric), ('\u{111da}',
-        '\u{111da}', WC_ALetter), ('\u{111dc}', '\u{111dc}', WC_ALetter), ('\u{11200}', '\u{11211}',
-        WC_ALetter), ('\u{11213}', '\u{1122b}', WC_ALetter), ('\u{1122c}', '\u{11237}', WC_Extend),
-        ('\u{1123e}', '\u{1123e}', WC_Extend), ('\u{1123f}', '\u{11240}', WC_ALetter), ('\u{11241}',
-        '\u{11241}', WC_Extend), ('\u{11280}', '\u{11286}', WC_ALetter), ('\u{11288}', '\u{11288}',
-        WC_ALetter), ('\u{1128a}', '\u{1128d}', WC_ALetter), ('\u{1128f}', '\u{1129d}', WC_ALetter),
-        ('\u{1129f}', '\u{112a8}', WC_ALetter), ('\u{112b0}', '\u{112de}', WC_ALetter),
-        ('\u{112df}', '\u{112ea}', WC_Extend), ('\u{112f0}', '\u{112f9}', WC_Numeric), ('\u{11300}',
-        '\u{11303}', WC_Extend), ('\u{11305}', '\u{1130c}', WC_ALetter), ('\u{1130f}', '\u{11310}',
-        WC_ALetter), ('\u{11313}', '\u{11328}', WC_ALetter), ('\u{1132a}', '\u{11330}', WC_ALetter),
-        ('\u{11332}', '\u{11333}', WC_ALetter), ('\u{11335}', '\u{11339}', WC_ALetter),
-        ('\u{1133b}', '\u{1133c}', WC_Extend), ('\u{1133d}', '\u{1133d}', WC_ALetter), ('\u{1133e}',
-        '\u{11344}', WC_Extend), ('\u{11347}', '\u{11348}', WC_Extend), ('\u{1134b}', '\u{1134d}',
-        WC_Extend), ('\u{11350}', '\u{11350}', WC_ALetter), ('\u{11357}', '\u{11357}', WC_Extend),
-        ('\u{1135d}', '\u{11361}', WC_ALetter), ('\u{11362}', '\u{11363}', WC_Extend), ('\u{11366}',
-        '\u{1136c}', WC_Extend), ('\u{11370}', '\u{11374}', WC_Extend), ('\u{11400}', '\u{11434}',
-        WC_ALetter), ('\u{11435}', '\u{11446}', WC_Extend), ('\u{11447}', '\u{1144a}', WC_ALetter),
-        ('\u{11450}', '\u{11459}', WC_Numeric), ('\u{1145e}', '\u{1145e}', WC_Extend), ('\u{1145f}',
-        '\u{11461}', WC_ALetter), ('\u{11480}', '\u{114af}', WC_ALetter), ('\u{114b0}', '\u{114c3}',
-        WC_Extend), ('\u{114c4}', '\u{114c5}', WC_ALetter), ('\u{114c7}', '\u{114c7}', WC_ALetter),
-        ('\u{114d0}', '\u{114d9}', WC_Numeric), ('\u{11580}', '\u{115ae}', WC_ALetter),
-        ('\u{115af}', '\u{115b5}', WC_Extend), ('\u{115b8}', '\u{115c0}', WC_Extend), ('\u{115d8}',
-        '\u{115db}', WC_ALetter), ('\u{115dc}', '\u{115dd}', WC_Extend), ('\u{11600}', '\u{1162f}',
-        WC_ALetter), ('\u{11630}', '\u{11640}', WC_Extend), ('\u{11644}', '\u{11644}', WC_ALetter),
-        ('\u{11650}', '\u{11659}', WC_Numeric), ('\u{11680}', '\u{116aa}', WC_ALetter),
-        ('\u{116ab}', '\u{116b7}', WC_Extend), ('\u{116b8}', '\u{116b8}', WC_ALetter), ('\u{116c0}',
-        '\u{116c9}', WC_Numeric), ('\u{1171d}', '\u{1172b}', WC_Extend), ('\u{11730}', '\u{11739}',
-        WC_Numeric), ('\u{11800}', '\u{1182b}', WC_ALetter), ('\u{1182c}', '\u{1183a}', WC_Extend),
-        ('\u{118a0}', '\u{118df}', WC_ALetter), ('\u{118e0}', '\u{118e9}', WC_Numeric),
-        ('\u{118ff}', '\u{11906}', WC_ALetter), ('\u{11909}', '\u{11909}', WC_ALetter),
-        ('\u{1190c}', '\u{11913}', WC_ALetter), ('\u{11915}', '\u{11916}', WC_ALetter),
-        ('\u{11918}', '\u{1192f}', WC_ALetter), ('\u{11930}', '\u{11935}', WC_Extend), ('\u{11937}',
-        '\u{11938}', WC_Extend), ('\u{1193b}', '\u{1193e}', WC_Extend), ('\u{1193f}', '\u{1193f}',
-        WC_ALetter), ('\u{11940}', '\u{11940}', WC_Extend), ('\u{11941}', '\u{11941}', WC_ALetter),
-        ('\u{11942}', '\u{11943}', WC_Extend), ('\u{11950}', '\u{11959}', WC_Numeric), ('\u{119a0}',
-        '\u{119a7}', WC_ALetter), ('\u{119aa}', '\u{119d0}', WC_ALetter), ('\u{119d1}', '\u{119d7}',
-        WC_Extend), ('\u{119da}', '\u{119e0}', WC_Extend), ('\u{119e1}', '\u{119e1}', WC_ALetter),
-        ('\u{119e3}', '\u{119e3}', WC_ALetter), ('\u{119e4}', '\u{119e4}', WC_Extend), ('\u{11a00}',
-        '\u{11a00}', WC_ALetter), ('\u{11a01}', '\u{11a0a}', WC_Extend), ('\u{11a0b}', '\u{11a32}',
-        WC_ALetter), ('\u{11a33}', '\u{11a39}', WC_Extend), ('\u{11a3a}', '\u{11a3a}', WC_ALetter),
-        ('\u{11a3b}', '\u{11a3e}', WC_Extend), ('\u{11a47}', '\u{11a47}', WC_Extend), ('\u{11a50}',
-        '\u{11a50}', WC_ALetter), ('\u{11a51}', '\u{11a5b}', WC_Extend), ('\u{11a5c}', '\u{11a89}',
-        WC_ALetter), ('\u{11a8a}', '\u{11a99}', WC_Extend), ('\u{11a9d}', '\u{11a9d}', WC_ALetter),
-        ('\u{11ab0}', '\u{11af8}', WC_ALetter), ('\u{11c00}', '\u{11c08}', WC_ALetter),
-        ('\u{11c0a}', '\u{11c2e}', WC_ALetter), ('\u{11c2f}', '\u{11c36}', WC_Extend), ('\u{11c38}',
-        '\u{11c3f}', WC_Extend), ('\u{11c40}', '\u{11c40}', WC_ALetter), ('\u{11c50}', '\u{11c59}',
-        WC_Numeric), ('\u{11c72}', '\u{11c8f}', WC_ALetter), ('\u{11c92}', '\u{11ca7}', WC_Extend),
-        ('\u{11ca9}', '\u{11cb6}', WC_Extend), ('\u{11d00}', '\u{11d06}', WC_ALetter), ('\u{11d08}',
-        '\u{11d09}', WC_ALetter), ('\u{11d0b}', '\u{11d30}', WC_ALetter), ('\u{11d31}', '\u{11d36}',
-        WC_Extend), ('\u{11d3a}', '\u{11d3a}', WC_Extend), ('\u{11d3c}', '\u{11d3d}', WC_Extend),
-        ('\u{11d3f}', '\u{11d45}', WC_Extend), ('\u{11d46}', '\u{11d46}', WC_ALetter), ('\u{11d47}',
-        '\u{11d47}', WC_Extend), ('\u{11d50}', '\u{11d59}', WC_Numeric), ('\u{11d60}', '\u{11d65}',
-        WC_ALetter), ('\u{11d67}', '\u{11d68}', WC_ALetter), ('\u{11d6a}', '\u{11d89}', WC_ALetter),
+        ('\u{105bb}', '\u{105bc}', WC_ALetter), ('\u{105c0}', '\u{105f3}', WC_ALetter),
+        ('\u{10600}', '\u{10736}', WC_ALetter), ('\u{10740}', '\u{10755}', WC_ALetter),
+        ('\u{10760}', '\u{10767}', WC_ALetter), ('\u{10780}', '\u{10785}', WC_ALetter),
+        ('\u{10787}', '\u{107b0}', WC_ALetter), ('\u{107b2}', '\u{107ba}', WC_ALetter),
+        ('\u{10800}', '\u{10805}', WC_ALetter), ('\u{10808}', '\u{10808}', WC_ALetter),
+        ('\u{1080a}', '\u{10835}', WC_ALetter), ('\u{10837}', '\u{10838}', WC_ALetter),
+        ('\u{1083c}', '\u{1083c}', WC_ALetter), ('\u{1083f}', '\u{10855}', WC_ALetter),
+        ('\u{10860}', '\u{10876}', WC_ALetter), ('\u{10880}', '\u{1089e}', WC_ALetter),
+        ('\u{108e0}', '\u{108f2}', WC_ALetter), ('\u{108f4}', '\u{108f5}', WC_ALetter),
+        ('\u{10900}', '\u{10915}', WC_ALetter), ('\u{10920}', '\u{10939}', WC_ALetter),
+        ('\u{10980}', '\u{109b7}', WC_ALetter), ('\u{109be}', '\u{109bf}', WC_ALetter),
+        ('\u{10a00}', '\u{10a00}', WC_ALetter), ('\u{10a01}', '\u{10a03}', WC_Extend), ('\u{10a05}',
+        '\u{10a06}', WC_Extend), ('\u{10a0c}', '\u{10a0f}', WC_Extend), ('\u{10a10}', '\u{10a13}',
+        WC_ALetter), ('\u{10a15}', '\u{10a17}', WC_ALetter), ('\u{10a19}', '\u{10a35}', WC_ALetter),
+        ('\u{10a38}', '\u{10a3a}', WC_Extend), ('\u{10a3f}', '\u{10a3f}', WC_Extend), ('\u{10a60}',
+        '\u{10a7c}', WC_ALetter), ('\u{10a80}', '\u{10a9c}', WC_ALetter), ('\u{10ac0}', '\u{10ac7}',
+        WC_ALetter), ('\u{10ac9}', '\u{10ae4}', WC_ALetter), ('\u{10ae5}', '\u{10ae6}', WC_Extend),
+        ('\u{10b00}', '\u{10b35}', WC_ALetter), ('\u{10b40}', '\u{10b55}', WC_ALetter),
+        ('\u{10b60}', '\u{10b72}', WC_ALetter), ('\u{10b80}', '\u{10b91}', WC_ALetter),
+        ('\u{10c00}', '\u{10c48}', WC_ALetter), ('\u{10c80}', '\u{10cb2}', WC_ALetter),
+        ('\u{10cc0}', '\u{10cf2}', WC_ALetter), ('\u{10d00}', '\u{10d23}', WC_ALetter),
+        ('\u{10d24}', '\u{10d27}', WC_Extend), ('\u{10d30}', '\u{10d39}', WC_Numeric), ('\u{10d40}',
+        '\u{10d49}', WC_Numeric), ('\u{10d4a}', '\u{10d65}', WC_ALetter), ('\u{10d69}', '\u{10d6d}',
+        WC_Extend), ('\u{10d6f}', '\u{10d85}', WC_ALetter), ('\u{10e80}', '\u{10ea9}', WC_ALetter),
+        ('\u{10eab}', '\u{10eac}', WC_Extend), ('\u{10eb0}', '\u{10eb1}', WC_ALetter), ('\u{10ec2}',
+        '\u{10ec4}', WC_ALetter), ('\u{10efc}', '\u{10eff}', WC_Extend), ('\u{10f00}', '\u{10f1c}',
+        WC_ALetter), ('\u{10f27}', '\u{10f27}', WC_ALetter), ('\u{10f30}', '\u{10f45}', WC_ALetter),
+        ('\u{10f46}', '\u{10f50}', WC_Extend), ('\u{10f70}', '\u{10f81}', WC_ALetter), ('\u{10f82}',
+        '\u{10f85}', WC_Extend), ('\u{10fb0}', '\u{10fc4}', WC_ALetter), ('\u{10fe0}', '\u{10ff6}',
+        WC_ALetter), ('\u{11000}', '\u{11002}', WC_Extend), ('\u{11003}', '\u{11037}', WC_ALetter),
+        ('\u{11038}', '\u{11046}', WC_Extend), ('\u{11066}', '\u{1106f}', WC_Numeric), ('\u{11070}',
+        '\u{11070}', WC_Extend), ('\u{11071}', '\u{11072}', WC_ALetter), ('\u{11073}', '\u{11074}',
+        WC_Extend), ('\u{11075}', '\u{11075}', WC_ALetter), ('\u{1107f}', '\u{11082}', WC_Extend),
+        ('\u{11083}', '\u{110af}', WC_ALetter), ('\u{110b0}', '\u{110ba}', WC_Extend), ('\u{110bd}',
+        '\u{110bd}', WC_Numeric), ('\u{110c2}', '\u{110c2}', WC_Extend), ('\u{110cd}', '\u{110cd}',
+        WC_Numeric), ('\u{110d0}', '\u{110e8}', WC_ALetter), ('\u{110f0}', '\u{110f9}', WC_Numeric),
+        ('\u{11100}', '\u{11102}', WC_Extend), ('\u{11103}', '\u{11126}', WC_ALetter), ('\u{11127}',
+        '\u{11134}', WC_Extend), ('\u{11136}', '\u{1113f}', WC_Numeric), ('\u{11144}', '\u{11144}',
+        WC_ALetter), ('\u{11145}', '\u{11146}', WC_Extend), ('\u{11147}', '\u{11147}', WC_ALetter),
+        ('\u{11150}', '\u{11172}', WC_ALetter), ('\u{11173}', '\u{11173}', WC_Extend), ('\u{11176}',
+        '\u{11176}', WC_ALetter), ('\u{11180}', '\u{11182}', WC_Extend), ('\u{11183}', '\u{111b2}',
+        WC_ALetter), ('\u{111b3}', '\u{111c0}', WC_Extend), ('\u{111c1}', '\u{111c4}', WC_ALetter),
+        ('\u{111c9}', '\u{111cc}', WC_Extend), ('\u{111ce}', '\u{111cf}', WC_Extend), ('\u{111d0}',
+        '\u{111d9}', WC_Numeric), ('\u{111da}', '\u{111da}', WC_ALetter), ('\u{111dc}', '\u{111dc}',
+        WC_ALetter), ('\u{11200}', '\u{11211}', WC_ALetter), ('\u{11213}', '\u{1122b}', WC_ALetter),
+        ('\u{1122c}', '\u{11237}', WC_Extend), ('\u{1123e}', '\u{1123e}', WC_Extend), ('\u{1123f}',
+        '\u{11240}', WC_ALetter), ('\u{11241}', '\u{11241}', WC_Extend), ('\u{11280}', '\u{11286}',
+        WC_ALetter), ('\u{11288}', '\u{11288}', WC_ALetter), ('\u{1128a}', '\u{1128d}', WC_ALetter),
+        ('\u{1128f}', '\u{1129d}', WC_ALetter), ('\u{1129f}', '\u{112a8}', WC_ALetter),
+        ('\u{112b0}', '\u{112de}', WC_ALetter), ('\u{112df}', '\u{112ea}', WC_Extend), ('\u{112f0}',
+        '\u{112f9}', WC_Numeric), ('\u{11300}', '\u{11303}', WC_Extend), ('\u{11305}', '\u{1130c}',
+        WC_ALetter), ('\u{1130f}', '\u{11310}', WC_ALetter), ('\u{11313}', '\u{11328}', WC_ALetter),
+        ('\u{1132a}', '\u{11330}', WC_ALetter), ('\u{11332}', '\u{11333}', WC_ALetter),
+        ('\u{11335}', '\u{11339}', WC_ALetter), ('\u{1133b}', '\u{1133c}', WC_Extend), ('\u{1133d}',
+        '\u{1133d}', WC_ALetter), ('\u{1133e}', '\u{11344}', WC_Extend), ('\u{11347}', '\u{11348}',
+        WC_Extend), ('\u{1134b}', '\u{1134d}', WC_Extend), ('\u{11350}', '\u{11350}', WC_ALetter),
+        ('\u{11357}', '\u{11357}', WC_Extend), ('\u{1135d}', '\u{11361}', WC_ALetter), ('\u{11362}',
+        '\u{11363}', WC_Extend), ('\u{11366}', '\u{1136c}', WC_Extend), ('\u{11370}', '\u{11374}',
+        WC_Extend), ('\u{11380}', '\u{11389}', WC_ALetter), ('\u{1138b}', '\u{1138b}', WC_ALetter),
+        ('\u{1138e}', '\u{1138e}', WC_ALetter), ('\u{11390}', '\u{113b5}', WC_ALetter),
+        ('\u{113b7}', '\u{113b7}', WC_ALetter), ('\u{113b8}', '\u{113c0}', WC_Extend), ('\u{113c2}',
+        '\u{113c2}', WC_Extend), ('\u{113c5}', '\u{113c5}', WC_Extend), ('\u{113c7}', '\u{113ca}',
+        WC_Extend), ('\u{113cc}', '\u{113d0}', WC_Extend), ('\u{113d1}', '\u{113d1}', WC_ALetter),
+        ('\u{113d2}', '\u{113d2}', WC_Extend), ('\u{113d3}', '\u{113d3}', WC_ALetter), ('\u{113e1}',
+        '\u{113e2}', WC_Extend), ('\u{11400}', '\u{11434}', WC_ALetter), ('\u{11435}', '\u{11446}',
+        WC_Extend), ('\u{11447}', '\u{1144a}', WC_ALetter), ('\u{11450}', '\u{11459}', WC_Numeric),
+        ('\u{1145e}', '\u{1145e}', WC_Extend), ('\u{1145f}', '\u{11461}', WC_ALetter), ('\u{11480}',
+        '\u{114af}', WC_ALetter), ('\u{114b0}', '\u{114c3}', WC_Extend), ('\u{114c4}', '\u{114c5}',
+        WC_ALetter), ('\u{114c7}', '\u{114c7}', WC_ALetter), ('\u{114d0}', '\u{114d9}', WC_Numeric),
+        ('\u{11580}', '\u{115ae}', WC_ALetter), ('\u{115af}', '\u{115b5}', WC_Extend), ('\u{115b8}',
+        '\u{115c0}', WC_Extend), ('\u{115d8}', '\u{115db}', WC_ALetter), ('\u{115dc}', '\u{115dd}',
+        WC_Extend), ('\u{11600}', '\u{1162f}', WC_ALetter), ('\u{11630}', '\u{11640}', WC_Extend),
+        ('\u{11644}', '\u{11644}', WC_ALetter), ('\u{11650}', '\u{11659}', WC_Numeric),
+        ('\u{11680}', '\u{116aa}', WC_ALetter), ('\u{116ab}', '\u{116b7}', WC_Extend), ('\u{116b8}',
+        '\u{116b8}', WC_ALetter), ('\u{116c0}', '\u{116c9}', WC_Numeric), ('\u{116d0}', '\u{116e3}',
+        WC_Numeric), ('\u{1171d}', '\u{1172b}', WC_Extend), ('\u{11730}', '\u{11739}', WC_Numeric),
+        ('\u{11800}', '\u{1182b}', WC_ALetter), ('\u{1182c}', '\u{1183a}', WC_Extend), ('\u{118a0}',
+        '\u{118df}', WC_ALetter), ('\u{118e0}', '\u{118e9}', WC_Numeric), ('\u{118ff}', '\u{11906}',
+        WC_ALetter), ('\u{11909}', '\u{11909}', WC_ALetter), ('\u{1190c}', '\u{11913}', WC_ALetter),
+        ('\u{11915}', '\u{11916}', WC_ALetter), ('\u{11918}', '\u{1192f}', WC_ALetter),
+        ('\u{11930}', '\u{11935}', WC_Extend), ('\u{11937}', '\u{11938}', WC_Extend), ('\u{1193b}',
+        '\u{1193e}', WC_Extend), ('\u{1193f}', '\u{1193f}', WC_ALetter), ('\u{11940}', '\u{11940}',
+        WC_Extend), ('\u{11941}', '\u{11941}', WC_ALetter), ('\u{11942}', '\u{11943}', WC_Extend),
+        ('\u{11950}', '\u{11959}', WC_Numeric), ('\u{119a0}', '\u{119a7}', WC_ALetter),
+        ('\u{119aa}', '\u{119d0}', WC_ALetter), ('\u{119d1}', '\u{119d7}', WC_Extend), ('\u{119da}',
+        '\u{119e0}', WC_Extend), ('\u{119e1}', '\u{119e1}', WC_ALetter), ('\u{119e3}', '\u{119e3}',
+        WC_ALetter), ('\u{119e4}', '\u{119e4}', WC_Extend), ('\u{11a00}', '\u{11a00}', WC_ALetter),
+        ('\u{11a01}', '\u{11a0a}', WC_Extend), ('\u{11a0b}', '\u{11a32}', WC_ALetter), ('\u{11a33}',
+        '\u{11a39}', WC_Extend), ('\u{11a3a}', '\u{11a3a}', WC_ALetter), ('\u{11a3b}', '\u{11a3e}',
+        WC_Extend), ('\u{11a47}', '\u{11a47}', WC_Extend), ('\u{11a50}', '\u{11a50}', WC_ALetter),
+        ('\u{11a51}', '\u{11a5b}', WC_Extend), ('\u{11a5c}', '\u{11a89}', WC_ALetter), ('\u{11a8a}',
+        '\u{11a99}', WC_Extend), ('\u{11a9d}', '\u{11a9d}', WC_ALetter), ('\u{11ab0}', '\u{11af8}',
+        WC_ALetter), ('\u{11bc0}', '\u{11be0}', WC_ALetter), ('\u{11bf0}', '\u{11bf9}', WC_Numeric),
+        ('\u{11c00}', '\u{11c08}', WC_ALetter), ('\u{11c0a}', '\u{11c2e}', WC_ALetter),
+        ('\u{11c2f}', '\u{11c36}', WC_Extend), ('\u{11c38}', '\u{11c3f}', WC_Extend), ('\u{11c40}',
+        '\u{11c40}', WC_ALetter), ('\u{11c50}', '\u{11c59}', WC_Numeric), ('\u{11c72}', '\u{11c8f}',
+        WC_ALetter), ('\u{11c92}', '\u{11ca7}', WC_Extend), ('\u{11ca9}', '\u{11cb6}', WC_Extend),
+        ('\u{11d00}', '\u{11d06}', WC_ALetter), ('\u{11d08}', '\u{11d09}', WC_ALetter),
+        ('\u{11d0b}', '\u{11d30}', WC_ALetter), ('\u{11d31}', '\u{11d36}', WC_Extend), ('\u{11d3a}',
+        '\u{11d3a}', WC_Extend), ('\u{11d3c}', '\u{11d3d}', WC_Extend), ('\u{11d3f}', '\u{11d45}',
+        WC_Extend), ('\u{11d46}', '\u{11d46}', WC_ALetter), ('\u{11d47}', '\u{11d47}', WC_Extend),
+        ('\u{11d50}', '\u{11d59}', WC_Numeric), ('\u{11d60}', '\u{11d65}', WC_ALetter),
+        ('\u{11d67}', '\u{11d68}', WC_ALetter), ('\u{11d6a}', '\u{11d89}', WC_ALetter),
         ('\u{11d8a}', '\u{11d8e}', WC_Extend), ('\u{11d90}', '\u{11d91}', WC_Extend), ('\u{11d93}',
         '\u{11d97}', WC_Extend), ('\u{11d98}', '\u{11d98}', WC_ALetter), ('\u{11da0}', '\u{11da9}',
         WC_Numeric), ('\u{11ee0}', '\u{11ef2}', WC_ALetter), ('\u{11ef3}', '\u{11ef6}', WC_Extend),
         ('\u{11f00}', '\u{11f01}', WC_Extend), ('\u{11f02}', '\u{11f02}', WC_ALetter), ('\u{11f03}',
         '\u{11f03}', WC_Extend), ('\u{11f04}', '\u{11f10}', WC_ALetter), ('\u{11f12}', '\u{11f33}',
         WC_ALetter), ('\u{11f34}', '\u{11f3a}', WC_Extend), ('\u{11f3e}', '\u{11f42}', WC_Extend),
-        ('\u{11f50}', '\u{11f59}', WC_Numeric), ('\u{11fb0}', '\u{11fb0}', WC_ALetter),
-        ('\u{12000}', '\u{12399}', WC_ALetter), ('\u{12400}', '\u{1246e}', WC_ALetter),
-        ('\u{12480}', '\u{12543}', WC_ALetter), ('\u{12f90}', '\u{12ff0}', WC_ALetter),
+        ('\u{11f50}', '\u{11f59}', WC_Numeric), ('\u{11f5a}', '\u{11f5a}', WC_Extend), ('\u{11fb0}',
+        '\u{11fb0}', WC_ALetter), ('\u{12000}', '\u{12399}', WC_ALetter), ('\u{12400}', '\u{1246e}',
+        WC_ALetter), ('\u{12480}', '\u{12543}', WC_ALetter), ('\u{12f90}', '\u{12ff0}', WC_ALetter),
         ('\u{13000}', '\u{1342f}', WC_ALetter), ('\u{13430}', '\u{1343f}', WC_Format), ('\u{13440}',
         '\u{13440}', WC_Extend), ('\u{13441}', '\u{13446}', WC_ALetter), ('\u{13447}', '\u{13455}',
-        WC_Extend), ('\u{14400}', '\u{14646}', WC_ALetter), ('\u{16800}', '\u{16a38}', WC_ALetter),
-        ('\u{16a40}', '\u{16a5e}', WC_ALetter), ('\u{16a60}', '\u{16a69}', WC_Numeric),
-        ('\u{16a70}', '\u{16abe}', WC_ALetter), ('\u{16ac0}', '\u{16ac9}', WC_Numeric),
-        ('\u{16ad0}', '\u{16aed}', WC_ALetter), ('\u{16af0}', '\u{16af4}', WC_Extend), ('\u{16b00}',
-        '\u{16b2f}', WC_ALetter), ('\u{16b30}', '\u{16b36}', WC_Extend), ('\u{16b40}', '\u{16b43}',
-        WC_ALetter), ('\u{16b50}', '\u{16b59}', WC_Numeric), ('\u{16b63}', '\u{16b77}', WC_ALetter),
-        ('\u{16b7d}', '\u{16b8f}', WC_ALetter), ('\u{16e40}', '\u{16e7f}', WC_ALetter),
-        ('\u{16f00}', '\u{16f4a}', WC_ALetter), ('\u{16f4f}', '\u{16f4f}', WC_Extend), ('\u{16f50}',
-        '\u{16f50}', WC_ALetter), ('\u{16f51}', '\u{16f87}', WC_Extend), ('\u{16f8f}', '\u{16f92}',
-        WC_Extend), ('\u{16f93}', '\u{16f9f}', WC_ALetter), ('\u{16fe0}', '\u{16fe1}', WC_ALetter),
-        ('\u{16fe3}', '\u{16fe3}', WC_ALetter), ('\u{16fe4}', '\u{16fe4}', WC_Extend), ('\u{16ff0}',
-        '\u{16ff1}', WC_Extend), ('\u{1aff0}', '\u{1aff3}', WC_Katakana), ('\u{1aff5}', '\u{1affb}',
-        WC_Katakana), ('\u{1affd}', '\u{1affe}', WC_Katakana), ('\u{1b000}', '\u{1b000}',
-        WC_Katakana), ('\u{1b120}', '\u{1b122}', WC_Katakana), ('\u{1b155}', '\u{1b155}',
-        WC_Katakana), ('\u{1b164}', '\u{1b167}', WC_Katakana), ('\u{1bc00}', '\u{1bc6a}',
-        WC_ALetter), ('\u{1bc70}', '\u{1bc7c}', WC_ALetter), ('\u{1bc80}', '\u{1bc88}', WC_ALetter),
-        ('\u{1bc90}', '\u{1bc99}', WC_ALetter), ('\u{1bc9d}', '\u{1bc9e}', WC_Extend), ('\u{1bca0}',
-        '\u{1bca3}', WC_Format), ('\u{1cf00}', '\u{1cf2d}', WC_Extend), ('\u{1cf30}', '\u{1cf46}',
-        WC_Extend), ('\u{1d165}', '\u{1d169}', WC_Extend), ('\u{1d16d}', '\u{1d172}', WC_Extend),
-        ('\u{1d173}', '\u{1d17a}', WC_Format), ('\u{1d17b}', '\u{1d182}', WC_Extend), ('\u{1d185}',
-        '\u{1d18b}', WC_Extend), ('\u{1d1aa}', '\u{1d1ad}', WC_Extend), ('\u{1d242}', '\u{1d244}',
-        WC_Extend), ('\u{1d400}', '\u{1d454}', WC_ALetter), ('\u{1d456}', '\u{1d49c}', WC_ALetter),
-        ('\u{1d49e}', '\u{1d49f}', WC_ALetter), ('\u{1d4a2}', '\u{1d4a2}', WC_ALetter),
+        WC_Extend), ('\u{13460}', '\u{143fa}', WC_ALetter), ('\u{14400}', '\u{14646}', WC_ALetter),
+        ('\u{16100}', '\u{1611d}', WC_ALetter), ('\u{1611e}', '\u{1612f}', WC_Extend), ('\u{16130}',
+        '\u{16139}', WC_Numeric), ('\u{16800}', '\u{16a38}', WC_ALetter), ('\u{16a40}', '\u{16a5e}',
+        WC_ALetter), ('\u{16a60}', '\u{16a69}', WC_Numeric), ('\u{16a70}', '\u{16abe}', WC_ALetter),
+        ('\u{16ac0}', '\u{16ac9}', WC_Numeric), ('\u{16ad0}', '\u{16aed}', WC_ALetter),
+        ('\u{16af0}', '\u{16af4}', WC_Extend), ('\u{16b00}', '\u{16b2f}', WC_ALetter), ('\u{16b30}',
+        '\u{16b36}', WC_Extend), ('\u{16b40}', '\u{16b43}', WC_ALetter), ('\u{16b50}', '\u{16b59}',
+        WC_Numeric), ('\u{16b63}', '\u{16b77}', WC_ALetter), ('\u{16b7d}', '\u{16b8f}', WC_ALetter),
+        ('\u{16d40}', '\u{16d6c}', WC_ALetter), ('\u{16d70}', '\u{16d79}', WC_Numeric),
+        ('\u{16e40}', '\u{16e7f}', WC_ALetter), ('\u{16f00}', '\u{16f4a}', WC_ALetter),
+        ('\u{16f4f}', '\u{16f4f}', WC_Extend), ('\u{16f50}', '\u{16f50}', WC_ALetter), ('\u{16f51}',
+        '\u{16f87}', WC_Extend), ('\u{16f8f}', '\u{16f92}', WC_Extend), ('\u{16f93}', '\u{16f9f}',
+        WC_ALetter), ('\u{16fe0}', '\u{16fe1}', WC_ALetter), ('\u{16fe3}', '\u{16fe3}', WC_ALetter),
+        ('\u{16fe4}', '\u{16fe4}', WC_Extend), ('\u{16ff0}', '\u{16ff1}', WC_Extend), ('\u{1aff0}',
+        '\u{1aff3}', WC_Katakana), ('\u{1aff5}', '\u{1affb}', WC_Katakana), ('\u{1affd}',
+        '\u{1affe}', WC_Katakana), ('\u{1b000}', '\u{1b000}', WC_Katakana), ('\u{1b120}',
+        '\u{1b122}', WC_Katakana), ('\u{1b155}', '\u{1b155}', WC_Katakana), ('\u{1b164}',
+        '\u{1b167}', WC_Katakana), ('\u{1bc00}', '\u{1bc6a}', WC_ALetter), ('\u{1bc70}',
+        '\u{1bc7c}', WC_ALetter), ('\u{1bc80}', '\u{1bc88}', WC_ALetter), ('\u{1bc90}', '\u{1bc99}',
+        WC_ALetter), ('\u{1bc9d}', '\u{1bc9e}', WC_Extend), ('\u{1bca0}', '\u{1bca3}', WC_Format),
+        ('\u{1ccf0}', '\u{1ccf9}', WC_Numeric), ('\u{1cf00}', '\u{1cf2d}', WC_Extend), ('\u{1cf30}',
+        '\u{1cf46}', WC_Extend), ('\u{1d165}', '\u{1d169}', WC_Extend), ('\u{1d16d}', '\u{1d172}',
+        WC_Extend), ('\u{1d173}', '\u{1d17a}', WC_Format), ('\u{1d17b}', '\u{1d182}', WC_Extend),
+        ('\u{1d185}', '\u{1d18b}', WC_Extend), ('\u{1d1aa}', '\u{1d1ad}', WC_Extend), ('\u{1d242}',
+        '\u{1d244}', WC_Extend), ('\u{1d400}', '\u{1d454}', WC_ALetter), ('\u{1d456}', '\u{1d49c}',
+        WC_ALetter), ('\u{1d49e}', '\u{1d49f}', WC_ALetter), ('\u{1d4a2}', '\u{1d4a2}', WC_ALetter),
         ('\u{1d4a5}', '\u{1d4a6}', WC_ALetter), ('\u{1d4a9}', '\u{1d4ac}', WC_ALetter),
         ('\u{1d4ae}', '\u{1d4b9}', WC_ALetter), ('\u{1d4bb}', '\u{1d4bb}', WC_ALetter),
         ('\u{1d4bd}', '\u{1d4c3}', WC_ALetter), ('\u{1d4c5}', '\u{1d505}', WC_ALetter),
@@ -1651,32 +1824,34 @@
         WC_ALetter), ('\u{1e290}', '\u{1e2ad}', WC_ALetter), ('\u{1e2ae}', '\u{1e2ae}', WC_Extend),
         ('\u{1e2c0}', '\u{1e2eb}', WC_ALetter), ('\u{1e2ec}', '\u{1e2ef}', WC_Extend), ('\u{1e2f0}',
         '\u{1e2f9}', WC_Numeric), ('\u{1e4d0}', '\u{1e4eb}', WC_ALetter), ('\u{1e4ec}', '\u{1e4ef}',
-        WC_Extend), ('\u{1e4f0}', '\u{1e4f9}', WC_Numeric), ('\u{1e7e0}', '\u{1e7e6}', WC_ALetter),
-        ('\u{1e7e8}', '\u{1e7eb}', WC_ALetter), ('\u{1e7ed}', '\u{1e7ee}', WC_ALetter),
-        ('\u{1e7f0}', '\u{1e7fe}', WC_ALetter), ('\u{1e800}', '\u{1e8c4}', WC_ALetter),
-        ('\u{1e8d0}', '\u{1e8d6}', WC_Extend), ('\u{1e900}', '\u{1e943}', WC_ALetter), ('\u{1e944}',
-        '\u{1e94a}', WC_Extend), ('\u{1e94b}', '\u{1e94b}', WC_ALetter), ('\u{1e950}', '\u{1e959}',
-        WC_Numeric), ('\u{1ee00}', '\u{1ee03}', WC_ALetter), ('\u{1ee05}', '\u{1ee1f}', WC_ALetter),
-        ('\u{1ee21}', '\u{1ee22}', WC_ALetter), ('\u{1ee24}', '\u{1ee24}', WC_ALetter),
-        ('\u{1ee27}', '\u{1ee27}', WC_ALetter), ('\u{1ee29}', '\u{1ee32}', WC_ALetter),
-        ('\u{1ee34}', '\u{1ee37}', WC_ALetter), ('\u{1ee39}', '\u{1ee39}', WC_ALetter),
-        ('\u{1ee3b}', '\u{1ee3b}', WC_ALetter), ('\u{1ee42}', '\u{1ee42}', WC_ALetter),
-        ('\u{1ee47}', '\u{1ee47}', WC_ALetter), ('\u{1ee49}', '\u{1ee49}', WC_ALetter),
-        ('\u{1ee4b}', '\u{1ee4b}', WC_ALetter), ('\u{1ee4d}', '\u{1ee4f}', WC_ALetter),
-        ('\u{1ee51}', '\u{1ee52}', WC_ALetter), ('\u{1ee54}', '\u{1ee54}', WC_ALetter),
-        ('\u{1ee57}', '\u{1ee57}', WC_ALetter), ('\u{1ee59}', '\u{1ee59}', WC_ALetter),
-        ('\u{1ee5b}', '\u{1ee5b}', WC_ALetter), ('\u{1ee5d}', '\u{1ee5d}', WC_ALetter),
-        ('\u{1ee5f}', '\u{1ee5f}', WC_ALetter), ('\u{1ee61}', '\u{1ee62}', WC_ALetter),
-        ('\u{1ee64}', '\u{1ee64}', WC_ALetter), ('\u{1ee67}', '\u{1ee6a}', WC_ALetter),
-        ('\u{1ee6c}', '\u{1ee72}', WC_ALetter), ('\u{1ee74}', '\u{1ee77}', WC_ALetter),
-        ('\u{1ee79}', '\u{1ee7c}', WC_ALetter), ('\u{1ee7e}', '\u{1ee7e}', WC_ALetter),
-        ('\u{1ee80}', '\u{1ee89}', WC_ALetter), ('\u{1ee8b}', '\u{1ee9b}', WC_ALetter),
-        ('\u{1eea1}', '\u{1eea3}', WC_ALetter), ('\u{1eea5}', '\u{1eea9}', WC_ALetter),
-        ('\u{1eeab}', '\u{1eebb}', WC_ALetter), ('\u{1f130}', '\u{1f149}', WC_ALetter),
-        ('\u{1f150}', '\u{1f169}', WC_ALetter), ('\u{1f170}', '\u{1f189}', WC_ALetter),
-        ('\u{1f1e6}', '\u{1f1ff}', WC_Regional_Indicator), ('\u{1f3fb}', '\u{1f3ff}', WC_Extend),
-        ('\u{1fbf0}', '\u{1fbf9}', WC_Numeric), ('\u{e0001}', '\u{e0001}', WC_Format), ('\u{e0020}',
-        '\u{e007f}', WC_Extend), ('\u{e0100}', '\u{e01ef}', WC_Extend)
+        WC_Extend), ('\u{1e4f0}', '\u{1e4f9}', WC_Numeric), ('\u{1e5d0}', '\u{1e5ed}', WC_ALetter),
+        ('\u{1e5ee}', '\u{1e5ef}', WC_Extend), ('\u{1e5f0}', '\u{1e5f0}', WC_ALetter), ('\u{1e5f1}',
+        '\u{1e5fa}', WC_Numeric), ('\u{1e7e0}', '\u{1e7e6}', WC_ALetter), ('\u{1e7e8}', '\u{1e7eb}',
+        WC_ALetter), ('\u{1e7ed}', '\u{1e7ee}', WC_ALetter), ('\u{1e7f0}', '\u{1e7fe}', WC_ALetter),
+        ('\u{1e800}', '\u{1e8c4}', WC_ALetter), ('\u{1e8d0}', '\u{1e8d6}', WC_Extend), ('\u{1e900}',
+        '\u{1e943}', WC_ALetter), ('\u{1e944}', '\u{1e94a}', WC_Extend), ('\u{1e94b}', '\u{1e94b}',
+        WC_ALetter), ('\u{1e950}', '\u{1e959}', WC_Numeric), ('\u{1ee00}', '\u{1ee03}', WC_ALetter),
+        ('\u{1ee05}', '\u{1ee1f}', WC_ALetter), ('\u{1ee21}', '\u{1ee22}', WC_ALetter),
+        ('\u{1ee24}', '\u{1ee24}', WC_ALetter), ('\u{1ee27}', '\u{1ee27}', WC_ALetter),
+        ('\u{1ee29}', '\u{1ee32}', WC_ALetter), ('\u{1ee34}', '\u{1ee37}', WC_ALetter),
+        ('\u{1ee39}', '\u{1ee39}', WC_ALetter), ('\u{1ee3b}', '\u{1ee3b}', WC_ALetter),
+        ('\u{1ee42}', '\u{1ee42}', WC_ALetter), ('\u{1ee47}', '\u{1ee47}', WC_ALetter),
+        ('\u{1ee49}', '\u{1ee49}', WC_ALetter), ('\u{1ee4b}', '\u{1ee4b}', WC_ALetter),
+        ('\u{1ee4d}', '\u{1ee4f}', WC_ALetter), ('\u{1ee51}', '\u{1ee52}', WC_ALetter),
+        ('\u{1ee54}', '\u{1ee54}', WC_ALetter), ('\u{1ee57}', '\u{1ee57}', WC_ALetter),
+        ('\u{1ee59}', '\u{1ee59}', WC_ALetter), ('\u{1ee5b}', '\u{1ee5b}', WC_ALetter),
+        ('\u{1ee5d}', '\u{1ee5d}', WC_ALetter), ('\u{1ee5f}', '\u{1ee5f}', WC_ALetter),
+        ('\u{1ee61}', '\u{1ee62}', WC_ALetter), ('\u{1ee64}', '\u{1ee64}', WC_ALetter),
+        ('\u{1ee67}', '\u{1ee6a}', WC_ALetter), ('\u{1ee6c}', '\u{1ee72}', WC_ALetter),
+        ('\u{1ee74}', '\u{1ee77}', WC_ALetter), ('\u{1ee79}', '\u{1ee7c}', WC_ALetter),
+        ('\u{1ee7e}', '\u{1ee7e}', WC_ALetter), ('\u{1ee80}', '\u{1ee89}', WC_ALetter),
+        ('\u{1ee8b}', '\u{1ee9b}', WC_ALetter), ('\u{1eea1}', '\u{1eea3}', WC_ALetter),
+        ('\u{1eea5}', '\u{1eea9}', WC_ALetter), ('\u{1eeab}', '\u{1eebb}', WC_ALetter),
+        ('\u{1f130}', '\u{1f149}', WC_ALetter), ('\u{1f150}', '\u{1f169}', WC_ALetter),
+        ('\u{1f170}', '\u{1f189}', WC_ALetter), ('\u{1f1e6}', '\u{1f1ff}', WC_Regional_Indicator),
+        ('\u{1f3fb}', '\u{1f3ff}', WC_Extend), ('\u{1fbf0}', '\u{1fbf9}', WC_Numeric), ('\u{e0001}',
+        '\u{e0001}', WC_Format), ('\u{e0020}', '\u{e007f}', WC_Extend), ('\u{e0100}', '\u{e01ef}',
+        WC_Extend)
     ];
 
 }
@@ -1692,7 +1867,7 @@
         EC_Extended_Pictographic,
     }
 
-    fn bsearch_range_value_table(c: char, r: &'static [(char, char, EmojiCat)], default_lower: u32, default_upper: u32) -> (u32, u32, EmojiCat) {
+    fn bsearch_range_value_table(c: char, r: &[(char, char, EmojiCat)], default_lower: u32, default_upper: u32) -> (u32, u32, EmojiCat) {
         use core::cmp::Ordering::{Equal, Less, Greater};
         match r.binary_search_by(|&(lo, hi, _)| {
             if lo <= c && c <= hi { Equal }
@@ -1734,7 +1909,7 @@
         bsearch_range_value_table(c, &emoji_cat_table[range], lower, upper)
     }
 
-    const emoji_cat_lookup: &'static [u8] = &[
+    const emoji_cat_lookup: &[u8] = &[
         0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
         2, 2, 2, 4, 4, 6, 8, 8, 8, 10, 14, 14, 15, 15, 19, 21, 22, 37, 41, 41, 41, 42, 42, 42, 42,
@@ -1781,7 +1956,7 @@
         68, 69, 72, 74, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
     ];
 
-    const emoji_cat_table: &'static [(char, char, EmojiCat)] = &[
+    const emoji_cat_table: &[(char, char, EmojiCat)] = &[
         ('\u{a9}', '\u{a9}', EC_Extended_Pictographic), ('\u{ae}', '\u{ae}',
         EC_Extended_Pictographic), ('\u{203c}', '\u{203c}', EC_Extended_Pictographic), ('\u{2049}',
         '\u{2049}', EC_Extended_Pictographic), ('\u{2122}', '\u{2122}', EC_Extended_Pictographic),
@@ -1859,7 +2034,7 @@
         SC_Upper,
     }
 
-    fn bsearch_range_value_table(c: char, r: &'static [(char, char, SentenceCat)], default_lower: u32, default_upper: u32) -> (u32, u32, SentenceCat) {
+    fn bsearch_range_value_table(c: char, r: &[(char, char, SentenceCat)], default_lower: u32, default_upper: u32) -> (u32, u32, SentenceCat) {
         use core::cmp::Ordering::{Equal, Less, Greater};
         match r.binary_search_by(|&(lo, hi, _)| {
             if lo <= c && c <= hi { Equal }
@@ -1889,7 +2064,7 @@
           // If the `idx` is outside of the precomputed table - use the slice
           // starting from the last covered index in the precomputed table and
           // ending with the length of the range table.
-          2410..2421,
+          2462..2474,
           |r| (r[0] as usize)..((r[1] + 1) as usize)
         );
 
@@ -1901,82 +2076,82 @@
         bsearch_range_value_table(c, &sentence_cat_table[range], lower, upper)
     }
 
-    const sentence_cat_lookup: &'static [u16] = &[
-        0, 19, 31, 154, 247, 314, 323, 333, 375, 409, 528, 579, 588, 599, 612, 618, 629, 643, 650,
-        661, 683, 702, 720, 738, 755, 771, 790, 806, 818, 825, 840, 850, 856, 871, 882, 882, 882,
-        887, 895, 901, 904, 904, 904, 904, 904, 907, 912, 922, 928, 937, 943, 950, 953, 959, 964,
-        973, 980, 988, 1000, 1000, 1002, 1130, 1249, 1267, 1288, 1308, 1311, 1336, 1340, 1340, 1340,
-        1342, 1342, 1342, 1344, 1344, 1344, 1344, 1344, 1346, 1348, 1348, 1348, 1348, 1351, 1351,
-        1351, 1351, 1351, 1369, 1476, 1482, 1492, 1501, 1501, 1501, 1501, 1512, 1517, 1518, 1521,
-        1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
-        1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
-        1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
-        1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
-        1522, 1522, 1522, 1522, 1525, 1525, 1525, 1580, 1613, 1696, 1769, 1780, 1790, 1797, 1808,
-        1819, 1836, 1843, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
-        1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
-        1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
-        1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
-        1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
-        1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
-        1849, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
-        1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
-        1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
-        1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
-        1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1853, 1854, 1864, 1865, 1865,
-        1865, 1867, 1870, 1886, 1888, 1905, 1913, 1919, 1920, 1921, 1922, 1922, 1925, 1929, 1933,
-        1935, 1939, 1942, 1949, 1949, 1949, 1952, 1957, 1964, 1967, 1969, 1971, 1982, 1986, 1989,
-        1990, 1991, 1993, 1996, 1996, 1996, 2000, 2005, 2010, 2019, 2028, 2039, 2051, 2059, 2068,
-        2086, 2086, 2093, 2098, 2098, 2105, 2110, 2114, 2119, 2119, 2121, 2124, 2139, 2146, 2156,
-        2161, 2161, 2161, 2168, 2171, 2183, 2189, 2189, 2192, 2201, 2202, 2202, 2202, 2202, 2202,
-        2202, 2202, 2202, 2203, 2204, 2204, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205,
-        2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2206, 2206, 2206,
-        2206, 2206, 2206, 2206, 2206, 2206, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
-        2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
-        2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2212, 2212, 2212,
-        2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212,
-        2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212,
-        2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212,
-        2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212,
-        2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2216, 2221, 2228, 2229, 2229, 2229,
-        2229, 2229, 2231, 2232, 2235, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
-        2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
-        2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242,
-        2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
-        2243, 2243, 2243, 2244, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
-        2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
-        2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
-        2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
-        2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2248, 2248,
-        2248, 2253, 2253, 2253, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254,
-        2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2256, 2261, 2261, 2261, 2261, 2261, 2261,
-        2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261,
-        2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261,
-        2261, 2263, 2263, 2263, 2263, 2266, 2269, 2270, 2270, 2270, 2270, 2275, 2288, 2300, 2305,
-        2310, 2316, 2322, 2330, 2330, 2330, 2330, 2330, 2333, 2337, 2337, 2337, 2337, 2337, 2337,
-        2337, 2337, 2337, 2341, 2341, 2347, 2348, 2353, 2353, 2353, 2358, 2358, 2358, 2358, 2361,
-        2361, 2361, 2361, 2361, 2361, 2365, 2365, 2367, 2372, 2372, 2372, 2372, 2372, 2372, 2372,
-        2372, 2372, 2372, 2400, 2405, 2405, 2405, 2405, 2405, 2407, 2408, 2408, 2408, 2408, 2408,
-        2408, 2408, 2408, 2408, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409,
-        2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410
+    const sentence_cat_lookup: &[u16] = &[
+        0, 19, 31, 154, 247, 314, 323, 334, 376, 410, 529, 580, 589, 600, 613, 619, 630, 644, 651,
+        662, 684, 703, 721, 739, 756, 772, 791, 807, 819, 826, 841, 851, 857, 872, 883, 883, 883,
+        888, 896, 902, 905, 905, 905, 905, 905, 908, 913, 923, 930, 939, 945, 952, 955, 961, 966,
+        976, 983, 991, 1005, 1005, 1007, 1135, 1254, 1272, 1293, 1313, 1316, 1341, 1345, 1345, 1345,
+        1347, 1347, 1347, 1349, 1349, 1349, 1349, 1349, 1351, 1353, 1353, 1353, 1353, 1356, 1356,
+        1356, 1356, 1356, 1374, 1482, 1488, 1498, 1507, 1507, 1507, 1507, 1518, 1523, 1524, 1527,
+        1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527,
+        1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527,
+        1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527,
+        1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+        1528, 1528, 1528, 1528, 1531, 1531, 1531, 1586, 1619, 1702, 1780, 1791, 1801, 1808, 1819,
+        1830, 1847, 1854, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+        1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+        1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+        1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+        1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+        1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+        1860, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863,
+        1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863,
+        1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863,
+        1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863,
+        1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1864, 1865, 1875, 1876, 1876,
+        1876, 1878, 1881, 1899, 1901, 1918, 1926, 1932, 1933, 1934, 1935, 1935, 1938, 1942, 1946,
+        1948, 1952, 1955, 1963, 1963, 1963, 1966, 1971, 1978, 1981, 1983, 1985, 1996, 2000, 2003,
+        2004, 2005, 2007, 2015, 2016, 2016, 2021, 2026, 2031, 2040, 2049, 2060, 2072, 2080, 2089,
+        2107, 2122, 2129, 2134, 2134, 2141, 2146, 2151, 2156, 2156, 2158, 2161, 2176, 2183, 2193,
+        2198, 2198, 2200, 2207, 2210, 2222, 2228, 2228, 2231, 2241, 2242, 2242, 2242, 2242, 2242,
+        2242, 2242, 2242, 2243, 2244, 2244, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
+        2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2246, 2246, 2246,
+        2246, 2246, 2246, 2246, 2246, 2246, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
+        2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
+        2251, 2251, 2251, 2251, 2251, 2251, 2251, 2252, 2252, 2252, 2252, 2252, 2253, 2253, 2253,
+        2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253,
+        2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253,
+        2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253,
+        2253, 2253, 2253, 2253, 2253, 2253, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256,
+        2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2260, 2265, 2272, 2273, 2273, 2273,
+        2276, 2276, 2278, 2279, 2282, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289,
+        2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289,
+        2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289,
+        2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2290, 2290, 2290, 2290, 2290, 2290, 2290,
+        2290, 2290, 2290, 2291, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+        2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+        2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+        2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+        2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2295, 2295,
+        2295, 2300, 2300, 2300, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301,
+        2301, 2301, 2301, 2301, 2301, 2301, 2301, 2301, 2303, 2308, 2308, 2308, 2308, 2308, 2308,
+        2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308,
+        2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2308, 2309, 2309, 2309, 2309,
+        2309, 2311, 2311, 2311, 2311, 2314, 2317, 2318, 2318, 2318, 2318, 2323, 2336, 2348, 2353,
+        2358, 2364, 2370, 2378, 2378, 2378, 2378, 2378, 2381, 2385, 2385, 2385, 2385, 2385, 2385,
+        2385, 2385, 2385, 2389, 2389, 2395, 2396, 2401, 2401, 2401, 2406, 2406, 2406, 2406, 2409,
+        2409, 2413, 2413, 2413, 2413, 2417, 2417, 2419, 2424, 2424, 2424, 2424, 2424, 2424, 2424,
+        2424, 2424, 2424, 2452, 2457, 2457, 2457, 2457, 2457, 2459, 2460, 2460, 2460, 2460, 2460,
+        2460, 2460, 2460, 2460, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+        2462, 2462, 2462, 2462, 2462, 2462, 2462, 2462
     ];
 
-    const sentence_cat_table: &'static [(char, char, SentenceCat)] = &[
+    const sentence_cat_table: &[(char, char, SentenceCat)] = &[
         ('\u{9}', '\u{9}', SC_Sp), ('\u{a}', '\u{a}', SC_LF), ('\u{b}', '\u{c}', SC_Sp), ('\u{d}',
         '\u{d}', SC_CR), ('\u{20}', '\u{20}', SC_Sp), ('\u{21}', '\u{21}', SC_STerm), ('\u{22}',
         '\u{22}', SC_Close), ('\u{27}', '\u{29}', SC_Close), ('\u{2c}', '\u{2d}', SC_SContinue),
-        ('\u{2e}', '\u{2e}', SC_ATerm), ('\u{30}', '\u{39}', SC_Numeric), ('\u{3a}', '\u{3a}',
+        ('\u{2e}', '\u{2e}', SC_ATerm), ('\u{30}', '\u{39}', SC_Numeric), ('\u{3a}', '\u{3b}',
         SC_SContinue), ('\u{3f}', '\u{3f}', SC_STerm), ('\u{41}', '\u{5a}', SC_Upper), ('\u{5b}',
         '\u{5b}', SC_Close), ('\u{5d}', '\u{5d}', SC_Close), ('\u{61}', '\u{7a}', SC_Lower),
         ('\u{7b}', '\u{7b}', SC_Close), ('\u{7d}', '\u{7d}', SC_Close), ('\u{85}', '\u{85}',
@@ -2097,114 +2272,114 @@
         SC_Extend), ('\u{370}', '\u{370}', SC_Upper), ('\u{371}', '\u{371}', SC_Lower), ('\u{372}',
         '\u{372}', SC_Upper), ('\u{373}', '\u{373}', SC_Lower), ('\u{374}', '\u{374}', SC_OLetter),
         ('\u{376}', '\u{376}', SC_Upper), ('\u{377}', '\u{377}', SC_Lower), ('\u{37a}', '\u{37d}',
-        SC_Lower), ('\u{37f}', '\u{37f}', SC_Upper), ('\u{386}', '\u{386}', SC_Upper), ('\u{388}',
-        '\u{38a}', SC_Upper), ('\u{38c}', '\u{38c}', SC_Upper), ('\u{38e}', '\u{38f}', SC_Upper),
-        ('\u{390}', '\u{390}', SC_Lower), ('\u{391}', '\u{3a1}', SC_Upper), ('\u{3a3}', '\u{3ab}',
-        SC_Upper), ('\u{3ac}', '\u{3ce}', SC_Lower), ('\u{3cf}', '\u{3cf}', SC_Upper), ('\u{3d0}',
-        '\u{3d1}', SC_Lower), ('\u{3d2}', '\u{3d4}', SC_Upper), ('\u{3d5}', '\u{3d7}', SC_Lower),
-        ('\u{3d8}', '\u{3d8}', SC_Upper), ('\u{3d9}', '\u{3d9}', SC_Lower), ('\u{3da}', '\u{3da}',
-        SC_Upper), ('\u{3db}', '\u{3db}', SC_Lower), ('\u{3dc}', '\u{3dc}', SC_Upper), ('\u{3dd}',
-        '\u{3dd}', SC_Lower), ('\u{3de}', '\u{3de}', SC_Upper), ('\u{3df}', '\u{3df}', SC_Lower),
-        ('\u{3e0}', '\u{3e0}', SC_Upper), ('\u{3e1}', '\u{3e1}', SC_Lower), ('\u{3e2}', '\u{3e2}',
-        SC_Upper), ('\u{3e3}', '\u{3e3}', SC_Lower), ('\u{3e4}', '\u{3e4}', SC_Upper), ('\u{3e5}',
-        '\u{3e5}', SC_Lower), ('\u{3e6}', '\u{3e6}', SC_Upper), ('\u{3e7}', '\u{3e7}', SC_Lower),
-        ('\u{3e8}', '\u{3e8}', SC_Upper), ('\u{3e9}', '\u{3e9}', SC_Lower), ('\u{3ea}', '\u{3ea}',
-        SC_Upper), ('\u{3eb}', '\u{3eb}', SC_Lower), ('\u{3ec}', '\u{3ec}', SC_Upper), ('\u{3ed}',
-        '\u{3ed}', SC_Lower), ('\u{3ee}', '\u{3ee}', SC_Upper), ('\u{3ef}', '\u{3f3}', SC_Lower),
-        ('\u{3f4}', '\u{3f4}', SC_Upper), ('\u{3f5}', '\u{3f5}', SC_Lower), ('\u{3f7}', '\u{3f7}',
-        SC_Upper), ('\u{3f8}', '\u{3f8}', SC_Lower), ('\u{3f9}', '\u{3fa}', SC_Upper), ('\u{3fb}',
-        '\u{3fc}', SC_Lower), ('\u{3fd}', '\u{42f}', SC_Upper), ('\u{430}', '\u{45f}', SC_Lower),
-        ('\u{460}', '\u{460}', SC_Upper), ('\u{461}', '\u{461}', SC_Lower), ('\u{462}', '\u{462}',
-        SC_Upper), ('\u{463}', '\u{463}', SC_Lower), ('\u{464}', '\u{464}', SC_Upper), ('\u{465}',
-        '\u{465}', SC_Lower), ('\u{466}', '\u{466}', SC_Upper), ('\u{467}', '\u{467}', SC_Lower),
-        ('\u{468}', '\u{468}', SC_Upper), ('\u{469}', '\u{469}', SC_Lower), ('\u{46a}', '\u{46a}',
-        SC_Upper), ('\u{46b}', '\u{46b}', SC_Lower), ('\u{46c}', '\u{46c}', SC_Upper), ('\u{46d}',
-        '\u{46d}', SC_Lower), ('\u{46e}', '\u{46e}', SC_Upper), ('\u{46f}', '\u{46f}', SC_Lower),
-        ('\u{470}', '\u{470}', SC_Upper), ('\u{471}', '\u{471}', SC_Lower), ('\u{472}', '\u{472}',
-        SC_Upper), ('\u{473}', '\u{473}', SC_Lower), ('\u{474}', '\u{474}', SC_Upper), ('\u{475}',
-        '\u{475}', SC_Lower), ('\u{476}', '\u{476}', SC_Upper), ('\u{477}', '\u{477}', SC_Lower),
-        ('\u{478}', '\u{478}', SC_Upper), ('\u{479}', '\u{479}', SC_Lower), ('\u{47a}', '\u{47a}',
-        SC_Upper), ('\u{47b}', '\u{47b}', SC_Lower), ('\u{47c}', '\u{47c}', SC_Upper), ('\u{47d}',
-        '\u{47d}', SC_Lower), ('\u{47e}', '\u{47e}', SC_Upper), ('\u{47f}', '\u{47f}', SC_Lower),
-        ('\u{480}', '\u{480}', SC_Upper), ('\u{481}', '\u{481}', SC_Lower), ('\u{483}', '\u{489}',
-        SC_Extend), ('\u{48a}', '\u{48a}', SC_Upper), ('\u{48b}', '\u{48b}', SC_Lower), ('\u{48c}',
-        '\u{48c}', SC_Upper), ('\u{48d}', '\u{48d}', SC_Lower), ('\u{48e}', '\u{48e}', SC_Upper),
-        ('\u{48f}', '\u{48f}', SC_Lower), ('\u{490}', '\u{490}', SC_Upper), ('\u{491}', '\u{491}',
-        SC_Lower), ('\u{492}', '\u{492}', SC_Upper), ('\u{493}', '\u{493}', SC_Lower), ('\u{494}',
-        '\u{494}', SC_Upper), ('\u{495}', '\u{495}', SC_Lower), ('\u{496}', '\u{496}', SC_Upper),
-        ('\u{497}', '\u{497}', SC_Lower), ('\u{498}', '\u{498}', SC_Upper), ('\u{499}', '\u{499}',
-        SC_Lower), ('\u{49a}', '\u{49a}', SC_Upper), ('\u{49b}', '\u{49b}', SC_Lower), ('\u{49c}',
-        '\u{49c}', SC_Upper), ('\u{49d}', '\u{49d}', SC_Lower), ('\u{49e}', '\u{49e}', SC_Upper),
-        ('\u{49f}', '\u{49f}', SC_Lower), ('\u{4a0}', '\u{4a0}', SC_Upper), ('\u{4a1}', '\u{4a1}',
-        SC_Lower), ('\u{4a2}', '\u{4a2}', SC_Upper), ('\u{4a3}', '\u{4a3}', SC_Lower), ('\u{4a4}',
-        '\u{4a4}', SC_Upper), ('\u{4a5}', '\u{4a5}', SC_Lower), ('\u{4a6}', '\u{4a6}', SC_Upper),
-        ('\u{4a7}', '\u{4a7}', SC_Lower), ('\u{4a8}', '\u{4a8}', SC_Upper), ('\u{4a9}', '\u{4a9}',
-        SC_Lower), ('\u{4aa}', '\u{4aa}', SC_Upper), ('\u{4ab}', '\u{4ab}', SC_Lower), ('\u{4ac}',
-        '\u{4ac}', SC_Upper), ('\u{4ad}', '\u{4ad}', SC_Lower), ('\u{4ae}', '\u{4ae}', SC_Upper),
-        ('\u{4af}', '\u{4af}', SC_Lower), ('\u{4b0}', '\u{4b0}', SC_Upper), ('\u{4b1}', '\u{4b1}',
-        SC_Lower), ('\u{4b2}', '\u{4b2}', SC_Upper), ('\u{4b3}', '\u{4b3}', SC_Lower), ('\u{4b4}',
-        '\u{4b4}', SC_Upper), ('\u{4b5}', '\u{4b5}', SC_Lower), ('\u{4b6}', '\u{4b6}', SC_Upper),
-        ('\u{4b7}', '\u{4b7}', SC_Lower), ('\u{4b8}', '\u{4b8}', SC_Upper), ('\u{4b9}', '\u{4b9}',
-        SC_Lower), ('\u{4ba}', '\u{4ba}', SC_Upper), ('\u{4bb}', '\u{4bb}', SC_Lower), ('\u{4bc}',
-        '\u{4bc}', SC_Upper), ('\u{4bd}', '\u{4bd}', SC_Lower), ('\u{4be}', '\u{4be}', SC_Upper),
-        ('\u{4bf}', '\u{4bf}', SC_Lower), ('\u{4c0}', '\u{4c1}', SC_Upper), ('\u{4c2}', '\u{4c2}',
-        SC_Lower), ('\u{4c3}', '\u{4c3}', SC_Upper), ('\u{4c4}', '\u{4c4}', SC_Lower), ('\u{4c5}',
-        '\u{4c5}', SC_Upper), ('\u{4c6}', '\u{4c6}', SC_Lower), ('\u{4c7}', '\u{4c7}', SC_Upper),
-        ('\u{4c8}', '\u{4c8}', SC_Lower), ('\u{4c9}', '\u{4c9}', SC_Upper), ('\u{4ca}', '\u{4ca}',
-        SC_Lower), ('\u{4cb}', '\u{4cb}', SC_Upper), ('\u{4cc}', '\u{4cc}', SC_Lower), ('\u{4cd}',
-        '\u{4cd}', SC_Upper), ('\u{4ce}', '\u{4cf}', SC_Lower), ('\u{4d0}', '\u{4d0}', SC_Upper),
-        ('\u{4d1}', '\u{4d1}', SC_Lower), ('\u{4d2}', '\u{4d2}', SC_Upper), ('\u{4d3}', '\u{4d3}',
-        SC_Lower), ('\u{4d4}', '\u{4d4}', SC_Upper), ('\u{4d5}', '\u{4d5}', SC_Lower), ('\u{4d6}',
-        '\u{4d6}', SC_Upper), ('\u{4d7}', '\u{4d7}', SC_Lower), ('\u{4d8}', '\u{4d8}', SC_Upper),
-        ('\u{4d9}', '\u{4d9}', SC_Lower), ('\u{4da}', '\u{4da}', SC_Upper), ('\u{4db}', '\u{4db}',
-        SC_Lower), ('\u{4dc}', '\u{4dc}', SC_Upper), ('\u{4dd}', '\u{4dd}', SC_Lower), ('\u{4de}',
-        '\u{4de}', SC_Upper), ('\u{4df}', '\u{4df}', SC_Lower), ('\u{4e0}', '\u{4e0}', SC_Upper),
-        ('\u{4e1}', '\u{4e1}', SC_Lower), ('\u{4e2}', '\u{4e2}', SC_Upper), ('\u{4e3}', '\u{4e3}',
-        SC_Lower), ('\u{4e4}', '\u{4e4}', SC_Upper), ('\u{4e5}', '\u{4e5}', SC_Lower), ('\u{4e6}',
-        '\u{4e6}', SC_Upper), ('\u{4e7}', '\u{4e7}', SC_Lower), ('\u{4e8}', '\u{4e8}', SC_Upper),
-        ('\u{4e9}', '\u{4e9}', SC_Lower), ('\u{4ea}', '\u{4ea}', SC_Upper), ('\u{4eb}', '\u{4eb}',
-        SC_Lower), ('\u{4ec}', '\u{4ec}', SC_Upper), ('\u{4ed}', '\u{4ed}', SC_Lower), ('\u{4ee}',
-        '\u{4ee}', SC_Upper), ('\u{4ef}', '\u{4ef}', SC_Lower), ('\u{4f0}', '\u{4f0}', SC_Upper),
-        ('\u{4f1}', '\u{4f1}', SC_Lower), ('\u{4f2}', '\u{4f2}', SC_Upper), ('\u{4f3}', '\u{4f3}',
-        SC_Lower), ('\u{4f4}', '\u{4f4}', SC_Upper), ('\u{4f5}', '\u{4f5}', SC_Lower), ('\u{4f6}',
-        '\u{4f6}', SC_Upper), ('\u{4f7}', '\u{4f7}', SC_Lower), ('\u{4f8}', '\u{4f8}', SC_Upper),
-        ('\u{4f9}', '\u{4f9}', SC_Lower), ('\u{4fa}', '\u{4fa}', SC_Upper), ('\u{4fb}', '\u{4fb}',
-        SC_Lower), ('\u{4fc}', '\u{4fc}', SC_Upper), ('\u{4fd}', '\u{4fd}', SC_Lower), ('\u{4fe}',
-        '\u{4fe}', SC_Upper), ('\u{4ff}', '\u{4ff}', SC_Lower), ('\u{500}', '\u{500}', SC_Upper),
-        ('\u{501}', '\u{501}', SC_Lower), ('\u{502}', '\u{502}', SC_Upper), ('\u{503}', '\u{503}',
-        SC_Lower), ('\u{504}', '\u{504}', SC_Upper), ('\u{505}', '\u{505}', SC_Lower), ('\u{506}',
-        '\u{506}', SC_Upper), ('\u{507}', '\u{507}', SC_Lower), ('\u{508}', '\u{508}', SC_Upper),
-        ('\u{509}', '\u{509}', SC_Lower), ('\u{50a}', '\u{50a}', SC_Upper), ('\u{50b}', '\u{50b}',
-        SC_Lower), ('\u{50c}', '\u{50c}', SC_Upper), ('\u{50d}', '\u{50d}', SC_Lower), ('\u{50e}',
-        '\u{50e}', SC_Upper), ('\u{50f}', '\u{50f}', SC_Lower), ('\u{510}', '\u{510}', SC_Upper),
-        ('\u{511}', '\u{511}', SC_Lower), ('\u{512}', '\u{512}', SC_Upper), ('\u{513}', '\u{513}',
-        SC_Lower), ('\u{514}', '\u{514}', SC_Upper), ('\u{515}', '\u{515}', SC_Lower), ('\u{516}',
-        '\u{516}', SC_Upper), ('\u{517}', '\u{517}', SC_Lower), ('\u{518}', '\u{518}', SC_Upper),
-        ('\u{519}', '\u{519}', SC_Lower), ('\u{51a}', '\u{51a}', SC_Upper), ('\u{51b}', '\u{51b}',
-        SC_Lower), ('\u{51c}', '\u{51c}', SC_Upper), ('\u{51d}', '\u{51d}', SC_Lower), ('\u{51e}',
-        '\u{51e}', SC_Upper), ('\u{51f}', '\u{51f}', SC_Lower), ('\u{520}', '\u{520}', SC_Upper),
-        ('\u{521}', '\u{521}', SC_Lower), ('\u{522}', '\u{522}', SC_Upper), ('\u{523}', '\u{523}',
-        SC_Lower), ('\u{524}', '\u{524}', SC_Upper), ('\u{525}', '\u{525}', SC_Lower), ('\u{526}',
-        '\u{526}', SC_Upper), ('\u{527}', '\u{527}', SC_Lower), ('\u{528}', '\u{528}', SC_Upper),
-        ('\u{529}', '\u{529}', SC_Lower), ('\u{52a}', '\u{52a}', SC_Upper), ('\u{52b}', '\u{52b}',
-        SC_Lower), ('\u{52c}', '\u{52c}', SC_Upper), ('\u{52d}', '\u{52d}', SC_Lower), ('\u{52e}',
-        '\u{52e}', SC_Upper), ('\u{52f}', '\u{52f}', SC_Lower), ('\u{531}', '\u{556}', SC_Upper),
-        ('\u{559}', '\u{559}', SC_OLetter), ('\u{55d}', '\u{55d}', SC_SContinue), ('\u{560}',
-        '\u{588}', SC_Lower), ('\u{589}', '\u{589}', SC_STerm), ('\u{591}', '\u{5bd}', SC_Extend),
-        ('\u{5bf}', '\u{5bf}', SC_Extend), ('\u{5c1}', '\u{5c2}', SC_Extend), ('\u{5c4}', '\u{5c5}',
-        SC_Extend), ('\u{5c7}', '\u{5c7}', SC_Extend), ('\u{5d0}', '\u{5ea}', SC_OLetter),
-        ('\u{5ef}', '\u{5f3}', SC_OLetter), ('\u{600}', '\u{605}', SC_Format), ('\u{60c}',
-        '\u{60d}', SC_SContinue), ('\u{610}', '\u{61a}', SC_Extend), ('\u{61c}', '\u{61c}',
-        SC_Format), ('\u{61d}', '\u{61f}', SC_STerm), ('\u{620}', '\u{64a}', SC_OLetter),
-        ('\u{64b}', '\u{65f}', SC_Extend), ('\u{660}', '\u{669}', SC_Numeric), ('\u{66b}',
-        '\u{66c}', SC_Numeric), ('\u{66e}', '\u{66f}', SC_OLetter), ('\u{670}', '\u{670}',
-        SC_Extend), ('\u{671}', '\u{6d3}', SC_OLetter), ('\u{6d4}', '\u{6d4}', SC_STerm),
-        ('\u{6d5}', '\u{6d5}', SC_OLetter), ('\u{6d6}', '\u{6dc}', SC_Extend), ('\u{6dd}',
-        '\u{6dd}', SC_Format), ('\u{6df}', '\u{6e4}', SC_Extend), ('\u{6e5}', '\u{6e6}',
-        SC_OLetter), ('\u{6e7}', '\u{6e8}', SC_Extend), ('\u{6ea}', '\u{6ed}', SC_Extend),
-        ('\u{6ee}', '\u{6ef}', SC_OLetter), ('\u{6f0}', '\u{6f9}', SC_Numeric), ('\u{6fa}',
-        '\u{6fc}', SC_OLetter), ('\u{6ff}', '\u{6ff}', SC_OLetter), ('\u{700}', '\u{702}',
-        SC_STerm), ('\u{70f}', '\u{70f}', SC_Format), ('\u{710}', '\u{710}', SC_OLetter),
+        SC_Lower), ('\u{37e}', '\u{37e}', SC_SContinue), ('\u{37f}', '\u{37f}', SC_Upper),
+        ('\u{386}', '\u{386}', SC_Upper), ('\u{388}', '\u{38a}', SC_Upper), ('\u{38c}', '\u{38c}',
+        SC_Upper), ('\u{38e}', '\u{38f}', SC_Upper), ('\u{390}', '\u{390}', SC_Lower), ('\u{391}',
+        '\u{3a1}', SC_Upper), ('\u{3a3}', '\u{3ab}', SC_Upper), ('\u{3ac}', '\u{3ce}', SC_Lower),
+        ('\u{3cf}', '\u{3cf}', SC_Upper), ('\u{3d0}', '\u{3d1}', SC_Lower), ('\u{3d2}', '\u{3d4}',
+        SC_Upper), ('\u{3d5}', '\u{3d7}', SC_Lower), ('\u{3d8}', '\u{3d8}', SC_Upper), ('\u{3d9}',
+        '\u{3d9}', SC_Lower), ('\u{3da}', '\u{3da}', SC_Upper), ('\u{3db}', '\u{3db}', SC_Lower),
+        ('\u{3dc}', '\u{3dc}', SC_Upper), ('\u{3dd}', '\u{3dd}', SC_Lower), ('\u{3de}', '\u{3de}',
+        SC_Upper), ('\u{3df}', '\u{3df}', SC_Lower), ('\u{3e0}', '\u{3e0}', SC_Upper), ('\u{3e1}',
+        '\u{3e1}', SC_Lower), ('\u{3e2}', '\u{3e2}', SC_Upper), ('\u{3e3}', '\u{3e3}', SC_Lower),
+        ('\u{3e4}', '\u{3e4}', SC_Upper), ('\u{3e5}', '\u{3e5}', SC_Lower), ('\u{3e6}', '\u{3e6}',
+        SC_Upper), ('\u{3e7}', '\u{3e7}', SC_Lower), ('\u{3e8}', '\u{3e8}', SC_Upper), ('\u{3e9}',
+        '\u{3e9}', SC_Lower), ('\u{3ea}', '\u{3ea}', SC_Upper), ('\u{3eb}', '\u{3eb}', SC_Lower),
+        ('\u{3ec}', '\u{3ec}', SC_Upper), ('\u{3ed}', '\u{3ed}', SC_Lower), ('\u{3ee}', '\u{3ee}',
+        SC_Upper), ('\u{3ef}', '\u{3f3}', SC_Lower), ('\u{3f4}', '\u{3f4}', SC_Upper), ('\u{3f5}',
+        '\u{3f5}', SC_Lower), ('\u{3f7}', '\u{3f7}', SC_Upper), ('\u{3f8}', '\u{3f8}', SC_Lower),
+        ('\u{3f9}', '\u{3fa}', SC_Upper), ('\u{3fb}', '\u{3fc}', SC_Lower), ('\u{3fd}', '\u{42f}',
+        SC_Upper), ('\u{430}', '\u{45f}', SC_Lower), ('\u{460}', '\u{460}', SC_Upper), ('\u{461}',
+        '\u{461}', SC_Lower), ('\u{462}', '\u{462}', SC_Upper), ('\u{463}', '\u{463}', SC_Lower),
+        ('\u{464}', '\u{464}', SC_Upper), ('\u{465}', '\u{465}', SC_Lower), ('\u{466}', '\u{466}',
+        SC_Upper), ('\u{467}', '\u{467}', SC_Lower), ('\u{468}', '\u{468}', SC_Upper), ('\u{469}',
+        '\u{469}', SC_Lower), ('\u{46a}', '\u{46a}', SC_Upper), ('\u{46b}', '\u{46b}', SC_Lower),
+        ('\u{46c}', '\u{46c}', SC_Upper), ('\u{46d}', '\u{46d}', SC_Lower), ('\u{46e}', '\u{46e}',
+        SC_Upper), ('\u{46f}', '\u{46f}', SC_Lower), ('\u{470}', '\u{470}', SC_Upper), ('\u{471}',
+        '\u{471}', SC_Lower), ('\u{472}', '\u{472}', SC_Upper), ('\u{473}', '\u{473}', SC_Lower),
+        ('\u{474}', '\u{474}', SC_Upper), ('\u{475}', '\u{475}', SC_Lower), ('\u{476}', '\u{476}',
+        SC_Upper), ('\u{477}', '\u{477}', SC_Lower), ('\u{478}', '\u{478}', SC_Upper), ('\u{479}',
+        '\u{479}', SC_Lower), ('\u{47a}', '\u{47a}', SC_Upper), ('\u{47b}', '\u{47b}', SC_Lower),
+        ('\u{47c}', '\u{47c}', SC_Upper), ('\u{47d}', '\u{47d}', SC_Lower), ('\u{47e}', '\u{47e}',
+        SC_Upper), ('\u{47f}', '\u{47f}', SC_Lower), ('\u{480}', '\u{480}', SC_Upper), ('\u{481}',
+        '\u{481}', SC_Lower), ('\u{483}', '\u{489}', SC_Extend), ('\u{48a}', '\u{48a}', SC_Upper),
+        ('\u{48b}', '\u{48b}', SC_Lower), ('\u{48c}', '\u{48c}', SC_Upper), ('\u{48d}', '\u{48d}',
+        SC_Lower), ('\u{48e}', '\u{48e}', SC_Upper), ('\u{48f}', '\u{48f}', SC_Lower), ('\u{490}',
+        '\u{490}', SC_Upper), ('\u{491}', '\u{491}', SC_Lower), ('\u{492}', '\u{492}', SC_Upper),
+        ('\u{493}', '\u{493}', SC_Lower), ('\u{494}', '\u{494}', SC_Upper), ('\u{495}', '\u{495}',
+        SC_Lower), ('\u{496}', '\u{496}', SC_Upper), ('\u{497}', '\u{497}', SC_Lower), ('\u{498}',
+        '\u{498}', SC_Upper), ('\u{499}', '\u{499}', SC_Lower), ('\u{49a}', '\u{49a}', SC_Upper),
+        ('\u{49b}', '\u{49b}', SC_Lower), ('\u{49c}', '\u{49c}', SC_Upper), ('\u{49d}', '\u{49d}',
+        SC_Lower), ('\u{49e}', '\u{49e}', SC_Upper), ('\u{49f}', '\u{49f}', SC_Lower), ('\u{4a0}',
+        '\u{4a0}', SC_Upper), ('\u{4a1}', '\u{4a1}', SC_Lower), ('\u{4a2}', '\u{4a2}', SC_Upper),
+        ('\u{4a3}', '\u{4a3}', SC_Lower), ('\u{4a4}', '\u{4a4}', SC_Upper), ('\u{4a5}', '\u{4a5}',
+        SC_Lower), ('\u{4a6}', '\u{4a6}', SC_Upper), ('\u{4a7}', '\u{4a7}', SC_Lower), ('\u{4a8}',
+        '\u{4a8}', SC_Upper), ('\u{4a9}', '\u{4a9}', SC_Lower), ('\u{4aa}', '\u{4aa}', SC_Upper),
+        ('\u{4ab}', '\u{4ab}', SC_Lower), ('\u{4ac}', '\u{4ac}', SC_Upper), ('\u{4ad}', '\u{4ad}',
+        SC_Lower), ('\u{4ae}', '\u{4ae}', SC_Upper), ('\u{4af}', '\u{4af}', SC_Lower), ('\u{4b0}',
+        '\u{4b0}', SC_Upper), ('\u{4b1}', '\u{4b1}', SC_Lower), ('\u{4b2}', '\u{4b2}', SC_Upper),
+        ('\u{4b3}', '\u{4b3}', SC_Lower), ('\u{4b4}', '\u{4b4}', SC_Upper), ('\u{4b5}', '\u{4b5}',
+        SC_Lower), ('\u{4b6}', '\u{4b6}', SC_Upper), ('\u{4b7}', '\u{4b7}', SC_Lower), ('\u{4b8}',
+        '\u{4b8}', SC_Upper), ('\u{4b9}', '\u{4b9}', SC_Lower), ('\u{4ba}', '\u{4ba}', SC_Upper),
+        ('\u{4bb}', '\u{4bb}', SC_Lower), ('\u{4bc}', '\u{4bc}', SC_Upper), ('\u{4bd}', '\u{4bd}',
+        SC_Lower), ('\u{4be}', '\u{4be}', SC_Upper), ('\u{4bf}', '\u{4bf}', SC_Lower), ('\u{4c0}',
+        '\u{4c1}', SC_Upper), ('\u{4c2}', '\u{4c2}', SC_Lower), ('\u{4c3}', '\u{4c3}', SC_Upper),
+        ('\u{4c4}', '\u{4c4}', SC_Lower), ('\u{4c5}', '\u{4c5}', SC_Upper), ('\u{4c6}', '\u{4c6}',
+        SC_Lower), ('\u{4c7}', '\u{4c7}', SC_Upper), ('\u{4c8}', '\u{4c8}', SC_Lower), ('\u{4c9}',
+        '\u{4c9}', SC_Upper), ('\u{4ca}', '\u{4ca}', SC_Lower), ('\u{4cb}', '\u{4cb}', SC_Upper),
+        ('\u{4cc}', '\u{4cc}', SC_Lower), ('\u{4cd}', '\u{4cd}', SC_Upper), ('\u{4ce}', '\u{4cf}',
+        SC_Lower), ('\u{4d0}', '\u{4d0}', SC_Upper), ('\u{4d1}', '\u{4d1}', SC_Lower), ('\u{4d2}',
+        '\u{4d2}', SC_Upper), ('\u{4d3}', '\u{4d3}', SC_Lower), ('\u{4d4}', '\u{4d4}', SC_Upper),
+        ('\u{4d5}', '\u{4d5}', SC_Lower), ('\u{4d6}', '\u{4d6}', SC_Upper), ('\u{4d7}', '\u{4d7}',
+        SC_Lower), ('\u{4d8}', '\u{4d8}', SC_Upper), ('\u{4d9}', '\u{4d9}', SC_Lower), ('\u{4da}',
+        '\u{4da}', SC_Upper), ('\u{4db}', '\u{4db}', SC_Lower), ('\u{4dc}', '\u{4dc}', SC_Upper),
+        ('\u{4dd}', '\u{4dd}', SC_Lower), ('\u{4de}', '\u{4de}', SC_Upper), ('\u{4df}', '\u{4df}',
+        SC_Lower), ('\u{4e0}', '\u{4e0}', SC_Upper), ('\u{4e1}', '\u{4e1}', SC_Lower), ('\u{4e2}',
+        '\u{4e2}', SC_Upper), ('\u{4e3}', '\u{4e3}', SC_Lower), ('\u{4e4}', '\u{4e4}', SC_Upper),
+        ('\u{4e5}', '\u{4e5}', SC_Lower), ('\u{4e6}', '\u{4e6}', SC_Upper), ('\u{4e7}', '\u{4e7}',
+        SC_Lower), ('\u{4e8}', '\u{4e8}', SC_Upper), ('\u{4e9}', '\u{4e9}', SC_Lower), ('\u{4ea}',
+        '\u{4ea}', SC_Upper), ('\u{4eb}', '\u{4eb}', SC_Lower), ('\u{4ec}', '\u{4ec}', SC_Upper),
+        ('\u{4ed}', '\u{4ed}', SC_Lower), ('\u{4ee}', '\u{4ee}', SC_Upper), ('\u{4ef}', '\u{4ef}',
+        SC_Lower), ('\u{4f0}', '\u{4f0}', SC_Upper), ('\u{4f1}', '\u{4f1}', SC_Lower), ('\u{4f2}',
+        '\u{4f2}', SC_Upper), ('\u{4f3}', '\u{4f3}', SC_Lower), ('\u{4f4}', '\u{4f4}', SC_Upper),
+        ('\u{4f5}', '\u{4f5}', SC_Lower), ('\u{4f6}', '\u{4f6}', SC_Upper), ('\u{4f7}', '\u{4f7}',
+        SC_Lower), ('\u{4f8}', '\u{4f8}', SC_Upper), ('\u{4f9}', '\u{4f9}', SC_Lower), ('\u{4fa}',
+        '\u{4fa}', SC_Upper), ('\u{4fb}', '\u{4fb}', SC_Lower), ('\u{4fc}', '\u{4fc}', SC_Upper),
+        ('\u{4fd}', '\u{4fd}', SC_Lower), ('\u{4fe}', '\u{4fe}', SC_Upper), ('\u{4ff}', '\u{4ff}',
+        SC_Lower), ('\u{500}', '\u{500}', SC_Upper), ('\u{501}', '\u{501}', SC_Lower), ('\u{502}',
+        '\u{502}', SC_Upper), ('\u{503}', '\u{503}', SC_Lower), ('\u{504}', '\u{504}', SC_Upper),
+        ('\u{505}', '\u{505}', SC_Lower), ('\u{506}', '\u{506}', SC_Upper), ('\u{507}', '\u{507}',
+        SC_Lower), ('\u{508}', '\u{508}', SC_Upper), ('\u{509}', '\u{509}', SC_Lower), ('\u{50a}',
+        '\u{50a}', SC_Upper), ('\u{50b}', '\u{50b}', SC_Lower), ('\u{50c}', '\u{50c}', SC_Upper),
+        ('\u{50d}', '\u{50d}', SC_Lower), ('\u{50e}', '\u{50e}', SC_Upper), ('\u{50f}', '\u{50f}',
+        SC_Lower), ('\u{510}', '\u{510}', SC_Upper), ('\u{511}', '\u{511}', SC_Lower), ('\u{512}',
+        '\u{512}', SC_Upper), ('\u{513}', '\u{513}', SC_Lower), ('\u{514}', '\u{514}', SC_Upper),
+        ('\u{515}', '\u{515}', SC_Lower), ('\u{516}', '\u{516}', SC_Upper), ('\u{517}', '\u{517}',
+        SC_Lower), ('\u{518}', '\u{518}', SC_Upper), ('\u{519}', '\u{519}', SC_Lower), ('\u{51a}',
+        '\u{51a}', SC_Upper), ('\u{51b}', '\u{51b}', SC_Lower), ('\u{51c}', '\u{51c}', SC_Upper),
+        ('\u{51d}', '\u{51d}', SC_Lower), ('\u{51e}', '\u{51e}', SC_Upper), ('\u{51f}', '\u{51f}',
+        SC_Lower), ('\u{520}', '\u{520}', SC_Upper), ('\u{521}', '\u{521}', SC_Lower), ('\u{522}',
+        '\u{522}', SC_Upper), ('\u{523}', '\u{523}', SC_Lower), ('\u{524}', '\u{524}', SC_Upper),
+        ('\u{525}', '\u{525}', SC_Lower), ('\u{526}', '\u{526}', SC_Upper), ('\u{527}', '\u{527}',
+        SC_Lower), ('\u{528}', '\u{528}', SC_Upper), ('\u{529}', '\u{529}', SC_Lower), ('\u{52a}',
+        '\u{52a}', SC_Upper), ('\u{52b}', '\u{52b}', SC_Lower), ('\u{52c}', '\u{52c}', SC_Upper),
+        ('\u{52d}', '\u{52d}', SC_Lower), ('\u{52e}', '\u{52e}', SC_Upper), ('\u{52f}', '\u{52f}',
+        SC_Lower), ('\u{531}', '\u{556}', SC_Upper), ('\u{559}', '\u{559}', SC_OLetter), ('\u{55d}',
+        '\u{55d}', SC_SContinue), ('\u{560}', '\u{588}', SC_Lower), ('\u{589}', '\u{589}',
+        SC_STerm), ('\u{591}', '\u{5bd}', SC_Extend), ('\u{5bf}', '\u{5bf}', SC_Extend), ('\u{5c1}',
+        '\u{5c2}', SC_Extend), ('\u{5c4}', '\u{5c5}', SC_Extend), ('\u{5c7}', '\u{5c7}', SC_Extend),
+        ('\u{5d0}', '\u{5ea}', SC_OLetter), ('\u{5ef}', '\u{5f3}', SC_OLetter), ('\u{600}',
+        '\u{605}', SC_Numeric), ('\u{60c}', '\u{60d}', SC_SContinue), ('\u{610}', '\u{61a}',
+        SC_Extend), ('\u{61c}', '\u{61c}', SC_Format), ('\u{61d}', '\u{61f}', SC_STerm), ('\u{620}',
+        '\u{64a}', SC_OLetter), ('\u{64b}', '\u{65f}', SC_Extend), ('\u{660}', '\u{669}',
+        SC_Numeric), ('\u{66b}', '\u{66c}', SC_Numeric), ('\u{66e}', '\u{66f}', SC_OLetter),
+        ('\u{670}', '\u{670}', SC_Extend), ('\u{671}', '\u{6d3}', SC_OLetter), ('\u{6d4}',
+        '\u{6d4}', SC_STerm), ('\u{6d5}', '\u{6d5}', SC_OLetter), ('\u{6d6}', '\u{6dc}', SC_Extend),
+        ('\u{6dd}', '\u{6dd}', SC_Numeric), ('\u{6df}', '\u{6e4}', SC_Extend), ('\u{6e5}',
+        '\u{6e6}', SC_OLetter), ('\u{6e7}', '\u{6e8}', SC_Extend), ('\u{6ea}', '\u{6ed}',
+        SC_Extend), ('\u{6ee}', '\u{6ef}', SC_OLetter), ('\u{6f0}', '\u{6f9}', SC_Numeric),
+        ('\u{6fa}', '\u{6fc}', SC_OLetter), ('\u{6ff}', '\u{6ff}', SC_OLetter), ('\u{700}',
+        '\u{702}', SC_STerm), ('\u{70f}', '\u{70f}', SC_Format), ('\u{710}', '\u{710}', SC_OLetter),
         ('\u{711}', '\u{711}', SC_Extend), ('\u{712}', '\u{72f}', SC_OLetter), ('\u{730}',
         '\u{74a}', SC_Extend), ('\u{74d}', '\u{7a5}', SC_OLetter), ('\u{7a6}', '\u{7b0}',
         SC_Extend), ('\u{7b1}', '\u{7b1}', SC_OLetter), ('\u{7c0}', '\u{7c9}', SC_Numeric),
@@ -2217,153 +2392,155 @@
         ('\u{829}', '\u{82d}', SC_Extend), ('\u{837}', '\u{837}', SC_STerm), ('\u{839}', '\u{839}',
         SC_STerm), ('\u{83d}', '\u{83e}', SC_STerm), ('\u{840}', '\u{858}', SC_OLetter), ('\u{859}',
         '\u{85b}', SC_Extend), ('\u{860}', '\u{86a}', SC_OLetter), ('\u{870}', '\u{887}',
-        SC_OLetter), ('\u{889}', '\u{88e}', SC_OLetter), ('\u{890}', '\u{891}', SC_Format),
-        ('\u{898}', '\u{89f}', SC_Extend), ('\u{8a0}', '\u{8c9}', SC_OLetter), ('\u{8ca}',
-        '\u{8e1}', SC_Extend), ('\u{8e2}', '\u{8e2}', SC_Format), ('\u{8e3}', '\u{903}', SC_Extend),
-        ('\u{904}', '\u{939}', SC_OLetter), ('\u{93a}', '\u{93c}', SC_Extend), ('\u{93d}',
-        '\u{93d}', SC_OLetter), ('\u{93e}', '\u{94f}', SC_Extend), ('\u{950}', '\u{950}',
-        SC_OLetter), ('\u{951}', '\u{957}', SC_Extend), ('\u{958}', '\u{961}', SC_OLetter),
-        ('\u{962}', '\u{963}', SC_Extend), ('\u{964}', '\u{965}', SC_STerm), ('\u{966}', '\u{96f}',
-        SC_Numeric), ('\u{971}', '\u{980}', SC_OLetter), ('\u{981}', '\u{983}', SC_Extend),
-        ('\u{985}', '\u{98c}', SC_OLetter), ('\u{98f}', '\u{990}', SC_OLetter), ('\u{993}',
-        '\u{9a8}', SC_OLetter), ('\u{9aa}', '\u{9b0}', SC_OLetter), ('\u{9b2}', '\u{9b2}',
-        SC_OLetter), ('\u{9b6}', '\u{9b9}', SC_OLetter), ('\u{9bc}', '\u{9bc}', SC_Extend),
-        ('\u{9bd}', '\u{9bd}', SC_OLetter), ('\u{9be}', '\u{9c4}', SC_Extend), ('\u{9c7}',
-        '\u{9c8}', SC_Extend), ('\u{9cb}', '\u{9cd}', SC_Extend), ('\u{9ce}', '\u{9ce}',
-        SC_OLetter), ('\u{9d7}', '\u{9d7}', SC_Extend), ('\u{9dc}', '\u{9dd}', SC_OLetter),
-        ('\u{9df}', '\u{9e1}', SC_OLetter), ('\u{9e2}', '\u{9e3}', SC_Extend), ('\u{9e6}',
-        '\u{9ef}', SC_Numeric), ('\u{9f0}', '\u{9f1}', SC_OLetter), ('\u{9fc}', '\u{9fc}',
-        SC_OLetter), ('\u{9fe}', '\u{9fe}', SC_Extend), ('\u{a01}', '\u{a03}', SC_Extend),
-        ('\u{a05}', '\u{a0a}', SC_OLetter), ('\u{a0f}', '\u{a10}', SC_OLetter), ('\u{a13}',
-        '\u{a28}', SC_OLetter), ('\u{a2a}', '\u{a30}', SC_OLetter), ('\u{a32}', '\u{a33}',
-        SC_OLetter), ('\u{a35}', '\u{a36}', SC_OLetter), ('\u{a38}', '\u{a39}', SC_OLetter),
-        ('\u{a3c}', '\u{a3c}', SC_Extend), ('\u{a3e}', '\u{a42}', SC_Extend), ('\u{a47}', '\u{a48}',
-        SC_Extend), ('\u{a4b}', '\u{a4d}', SC_Extend), ('\u{a51}', '\u{a51}', SC_Extend),
-        ('\u{a59}', '\u{a5c}', SC_OLetter), ('\u{a5e}', '\u{a5e}', SC_OLetter), ('\u{a66}',
-        '\u{a6f}', SC_Numeric), ('\u{a70}', '\u{a71}', SC_Extend), ('\u{a72}', '\u{a74}',
-        SC_OLetter), ('\u{a75}', '\u{a75}', SC_Extend), ('\u{a81}', '\u{a83}', SC_Extend),
-        ('\u{a85}', '\u{a8d}', SC_OLetter), ('\u{a8f}', '\u{a91}', SC_OLetter), ('\u{a93}',
-        '\u{aa8}', SC_OLetter), ('\u{aaa}', '\u{ab0}', SC_OLetter), ('\u{ab2}', '\u{ab3}',
-        SC_OLetter), ('\u{ab5}', '\u{ab9}', SC_OLetter), ('\u{abc}', '\u{abc}', SC_Extend),
-        ('\u{abd}', '\u{abd}', SC_OLetter), ('\u{abe}', '\u{ac5}', SC_Extend), ('\u{ac7}',
-        '\u{ac9}', SC_Extend), ('\u{acb}', '\u{acd}', SC_Extend), ('\u{ad0}', '\u{ad0}',
-        SC_OLetter), ('\u{ae0}', '\u{ae1}', SC_OLetter), ('\u{ae2}', '\u{ae3}', SC_Extend),
-        ('\u{ae6}', '\u{aef}', SC_Numeric), ('\u{af9}', '\u{af9}', SC_OLetter), ('\u{afa}',
-        '\u{aff}', SC_Extend), ('\u{b01}', '\u{b03}', SC_Extend), ('\u{b05}', '\u{b0c}',
-        SC_OLetter), ('\u{b0f}', '\u{b10}', SC_OLetter), ('\u{b13}', '\u{b28}', SC_OLetter),
-        ('\u{b2a}', '\u{b30}', SC_OLetter), ('\u{b32}', '\u{b33}', SC_OLetter), ('\u{b35}',
-        '\u{b39}', SC_OLetter), ('\u{b3c}', '\u{b3c}', SC_Extend), ('\u{b3d}', '\u{b3d}',
-        SC_OLetter), ('\u{b3e}', '\u{b44}', SC_Extend), ('\u{b47}', '\u{b48}', SC_Extend),
-        ('\u{b4b}', '\u{b4d}', SC_Extend), ('\u{b55}', '\u{b57}', SC_Extend), ('\u{b5c}', '\u{b5d}',
-        SC_OLetter), ('\u{b5f}', '\u{b61}', SC_OLetter), ('\u{b62}', '\u{b63}', SC_Extend),
-        ('\u{b66}', '\u{b6f}', SC_Numeric), ('\u{b71}', '\u{b71}', SC_OLetter), ('\u{b82}',
-        '\u{b82}', SC_Extend), ('\u{b83}', '\u{b83}', SC_OLetter), ('\u{b85}', '\u{b8a}',
-        SC_OLetter), ('\u{b8e}', '\u{b90}', SC_OLetter), ('\u{b92}', '\u{b95}', SC_OLetter),
-        ('\u{b99}', '\u{b9a}', SC_OLetter), ('\u{b9c}', '\u{b9c}', SC_OLetter), ('\u{b9e}',
-        '\u{b9f}', SC_OLetter), ('\u{ba3}', '\u{ba4}', SC_OLetter), ('\u{ba8}', '\u{baa}',
-        SC_OLetter), ('\u{bae}', '\u{bb9}', SC_OLetter), ('\u{bbe}', '\u{bc2}', SC_Extend),
-        ('\u{bc6}', '\u{bc8}', SC_Extend), ('\u{bca}', '\u{bcd}', SC_Extend), ('\u{bd0}', '\u{bd0}',
-        SC_OLetter), ('\u{bd7}', '\u{bd7}', SC_Extend), ('\u{be6}', '\u{bef}', SC_Numeric),
-        ('\u{c00}', '\u{c04}', SC_Extend), ('\u{c05}', '\u{c0c}', SC_OLetter), ('\u{c0e}',
-        '\u{c10}', SC_OLetter), ('\u{c12}', '\u{c28}', SC_OLetter), ('\u{c2a}', '\u{c39}',
-        SC_OLetter), ('\u{c3c}', '\u{c3c}', SC_Extend), ('\u{c3d}', '\u{c3d}', SC_OLetter),
-        ('\u{c3e}', '\u{c44}', SC_Extend), ('\u{c46}', '\u{c48}', SC_Extend), ('\u{c4a}', '\u{c4d}',
-        SC_Extend), ('\u{c55}', '\u{c56}', SC_Extend), ('\u{c58}', '\u{c5a}', SC_OLetter),
-        ('\u{c5d}', '\u{c5d}', SC_OLetter), ('\u{c60}', '\u{c61}', SC_OLetter), ('\u{c62}',
-        '\u{c63}', SC_Extend), ('\u{c66}', '\u{c6f}', SC_Numeric), ('\u{c80}', '\u{c80}',
-        SC_OLetter), ('\u{c81}', '\u{c83}', SC_Extend), ('\u{c85}', '\u{c8c}', SC_OLetter),
-        ('\u{c8e}', '\u{c90}', SC_OLetter), ('\u{c92}', '\u{ca8}', SC_OLetter), ('\u{caa}',
-        '\u{cb3}', SC_OLetter), ('\u{cb5}', '\u{cb9}', SC_OLetter), ('\u{cbc}', '\u{cbc}',
-        SC_Extend), ('\u{cbd}', '\u{cbd}', SC_OLetter), ('\u{cbe}', '\u{cc4}', SC_Extend),
-        ('\u{cc6}', '\u{cc8}', SC_Extend), ('\u{cca}', '\u{ccd}', SC_Extend), ('\u{cd5}', '\u{cd6}',
-        SC_Extend), ('\u{cdd}', '\u{cde}', SC_OLetter), ('\u{ce0}', '\u{ce1}', SC_OLetter),
-        ('\u{ce2}', '\u{ce3}', SC_Extend), ('\u{ce6}', '\u{cef}', SC_Numeric), ('\u{cf1}',
-        '\u{cf2}', SC_OLetter), ('\u{cf3}', '\u{cf3}', SC_Extend), ('\u{d00}', '\u{d03}',
-        SC_Extend), ('\u{d04}', '\u{d0c}', SC_OLetter), ('\u{d0e}', '\u{d10}', SC_OLetter),
-        ('\u{d12}', '\u{d3a}', SC_OLetter), ('\u{d3b}', '\u{d3c}', SC_Extend), ('\u{d3d}',
-        '\u{d3d}', SC_OLetter), ('\u{d3e}', '\u{d44}', SC_Extend), ('\u{d46}', '\u{d48}',
-        SC_Extend), ('\u{d4a}', '\u{d4d}', SC_Extend), ('\u{d4e}', '\u{d4e}', SC_OLetter),
-        ('\u{d54}', '\u{d56}', SC_OLetter), ('\u{d57}', '\u{d57}', SC_Extend), ('\u{d5f}',
-        '\u{d61}', SC_OLetter), ('\u{d62}', '\u{d63}', SC_Extend), ('\u{d66}', '\u{d6f}',
-        SC_Numeric), ('\u{d7a}', '\u{d7f}', SC_OLetter), ('\u{d81}', '\u{d83}', SC_Extend),
-        ('\u{d85}', '\u{d96}', SC_OLetter), ('\u{d9a}', '\u{db1}', SC_OLetter), ('\u{db3}',
-        '\u{dbb}', SC_OLetter), ('\u{dbd}', '\u{dbd}', SC_OLetter), ('\u{dc0}', '\u{dc6}',
-        SC_OLetter), ('\u{dca}', '\u{dca}', SC_Extend), ('\u{dcf}', '\u{dd4}', SC_Extend),
-        ('\u{dd6}', '\u{dd6}', SC_Extend), ('\u{dd8}', '\u{ddf}', SC_Extend), ('\u{de6}', '\u{def}',
-        SC_Numeric), ('\u{df2}', '\u{df3}', SC_Extend), ('\u{e01}', '\u{e30}', SC_OLetter),
-        ('\u{e31}', '\u{e31}', SC_Extend), ('\u{e32}', '\u{e33}', SC_OLetter), ('\u{e34}',
-        '\u{e3a}', SC_Extend), ('\u{e40}', '\u{e46}', SC_OLetter), ('\u{e47}', '\u{e4e}',
-        SC_Extend), ('\u{e50}', '\u{e59}', SC_Numeric), ('\u{e81}', '\u{e82}', SC_OLetter),
-        ('\u{e84}', '\u{e84}', SC_OLetter), ('\u{e86}', '\u{e8a}', SC_OLetter), ('\u{e8c}',
-        '\u{ea3}', SC_OLetter), ('\u{ea5}', '\u{ea5}', SC_OLetter), ('\u{ea7}', '\u{eb0}',
-        SC_OLetter), ('\u{eb1}', '\u{eb1}', SC_Extend), ('\u{eb2}', '\u{eb3}', SC_OLetter),
-        ('\u{eb4}', '\u{ebc}', SC_Extend), ('\u{ebd}', '\u{ebd}', SC_OLetter), ('\u{ec0}',
-        '\u{ec4}', SC_OLetter), ('\u{ec6}', '\u{ec6}', SC_OLetter), ('\u{ec8}', '\u{ece}',
-        SC_Extend), ('\u{ed0}', '\u{ed9}', SC_Numeric), ('\u{edc}', '\u{edf}', SC_OLetter),
-        ('\u{f00}', '\u{f00}', SC_OLetter), ('\u{f18}', '\u{f19}', SC_Extend), ('\u{f20}',
-        '\u{f29}', SC_Numeric), ('\u{f35}', '\u{f35}', SC_Extend), ('\u{f37}', '\u{f37}',
-        SC_Extend), ('\u{f39}', '\u{f39}', SC_Extend), ('\u{f3a}', '\u{f3d}', SC_Close), ('\u{f3e}',
-        '\u{f3f}', SC_Extend), ('\u{f40}', '\u{f47}', SC_OLetter), ('\u{f49}', '\u{f6c}',
-        SC_OLetter), ('\u{f71}', '\u{f84}', SC_Extend), ('\u{f86}', '\u{f87}', SC_Extend),
-        ('\u{f88}', '\u{f8c}', SC_OLetter), ('\u{f8d}', '\u{f97}', SC_Extend), ('\u{f99}',
-        '\u{fbc}', SC_Extend), ('\u{fc6}', '\u{fc6}', SC_Extend), ('\u{1000}', '\u{102a}',
-        SC_OLetter), ('\u{102b}', '\u{103e}', SC_Extend), ('\u{103f}', '\u{103f}', SC_OLetter),
-        ('\u{1040}', '\u{1049}', SC_Numeric), ('\u{104a}', '\u{104b}', SC_STerm), ('\u{1050}',
-        '\u{1055}', SC_OLetter), ('\u{1056}', '\u{1059}', SC_Extend), ('\u{105a}', '\u{105d}',
-        SC_OLetter), ('\u{105e}', '\u{1060}', SC_Extend), ('\u{1061}', '\u{1061}', SC_OLetter),
-        ('\u{1062}', '\u{1064}', SC_Extend), ('\u{1065}', '\u{1066}', SC_OLetter), ('\u{1067}',
-        '\u{106d}', SC_Extend), ('\u{106e}', '\u{1070}', SC_OLetter), ('\u{1071}', '\u{1074}',
-        SC_Extend), ('\u{1075}', '\u{1081}', SC_OLetter), ('\u{1082}', '\u{108d}', SC_Extend),
-        ('\u{108e}', '\u{108e}', SC_OLetter), ('\u{108f}', '\u{108f}', SC_Extend), ('\u{1090}',
-        '\u{1099}', SC_Numeric), ('\u{109a}', '\u{109d}', SC_Extend), ('\u{10a0}', '\u{10c5}',
-        SC_Upper), ('\u{10c7}', '\u{10c7}', SC_Upper), ('\u{10cd}', '\u{10cd}', SC_Upper),
-        ('\u{10d0}', '\u{10fa}', SC_OLetter), ('\u{10fc}', '\u{10fc}', SC_Lower), ('\u{10fd}',
-        '\u{1248}', SC_OLetter), ('\u{124a}', '\u{124d}', SC_OLetter), ('\u{1250}', '\u{1256}',
-        SC_OLetter), ('\u{1258}', '\u{1258}', SC_OLetter), ('\u{125a}', '\u{125d}', SC_OLetter),
-        ('\u{1260}', '\u{1288}', SC_OLetter), ('\u{128a}', '\u{128d}', SC_OLetter), ('\u{1290}',
-        '\u{12b0}', SC_OLetter), ('\u{12b2}', '\u{12b5}', SC_OLetter), ('\u{12b8}', '\u{12be}',
-        SC_OLetter), ('\u{12c0}', '\u{12c0}', SC_OLetter), ('\u{12c2}', '\u{12c5}', SC_OLetter),
-        ('\u{12c8}', '\u{12d6}', SC_OLetter), ('\u{12d8}', '\u{1310}', SC_OLetter), ('\u{1312}',
-        '\u{1315}', SC_OLetter), ('\u{1318}', '\u{135a}', SC_OLetter), ('\u{135d}', '\u{135f}',
-        SC_Extend), ('\u{1362}', '\u{1362}', SC_STerm), ('\u{1367}', '\u{1368}', SC_STerm),
-        ('\u{1380}', '\u{138f}', SC_OLetter), ('\u{13a0}', '\u{13f5}', SC_Upper), ('\u{13f8}',
-        '\u{13fd}', SC_Lower), ('\u{1401}', '\u{166c}', SC_OLetter), ('\u{166e}', '\u{166e}',
-        SC_STerm), ('\u{166f}', '\u{167f}', SC_OLetter), ('\u{1680}', '\u{1680}', SC_Sp),
-        ('\u{1681}', '\u{169a}', SC_OLetter), ('\u{169b}', '\u{169c}', SC_Close), ('\u{16a0}',
-        '\u{16ea}', SC_OLetter), ('\u{16ee}', '\u{16f8}', SC_OLetter), ('\u{1700}', '\u{1711}',
-        SC_OLetter), ('\u{1712}', '\u{1715}', SC_Extend), ('\u{171f}', '\u{1731}', SC_OLetter),
-        ('\u{1732}', '\u{1734}', SC_Extend), ('\u{1735}', '\u{1736}', SC_STerm), ('\u{1740}',
-        '\u{1751}', SC_OLetter), ('\u{1752}', '\u{1753}', SC_Extend), ('\u{1760}', '\u{176c}',
-        SC_OLetter), ('\u{176e}', '\u{1770}', SC_OLetter), ('\u{1772}', '\u{1773}', SC_Extend),
-        ('\u{1780}', '\u{17b3}', SC_OLetter), ('\u{17b4}', '\u{17d3}', SC_Extend), ('\u{17d7}',
-        '\u{17d7}', SC_OLetter), ('\u{17dc}', '\u{17dc}', SC_OLetter), ('\u{17dd}', '\u{17dd}',
-        SC_Extend), ('\u{17e0}', '\u{17e9}', SC_Numeric), ('\u{1802}', '\u{1802}', SC_SContinue),
-        ('\u{1803}', '\u{1803}', SC_STerm), ('\u{1808}', '\u{1808}', SC_SContinue), ('\u{1809}',
-        '\u{1809}', SC_STerm), ('\u{180b}', '\u{180d}', SC_Extend), ('\u{180e}', '\u{180e}',
-        SC_Format), ('\u{180f}', '\u{180f}', SC_Extend), ('\u{1810}', '\u{1819}', SC_Numeric),
-        ('\u{1820}', '\u{1878}', SC_OLetter), ('\u{1880}', '\u{1884}', SC_OLetter), ('\u{1885}',
-        '\u{1886}', SC_Extend), ('\u{1887}', '\u{18a8}', SC_OLetter), ('\u{18a9}', '\u{18a9}',
-        SC_Extend), ('\u{18aa}', '\u{18aa}', SC_OLetter), ('\u{18b0}', '\u{18f5}', SC_OLetter),
-        ('\u{1900}', '\u{191e}', SC_OLetter), ('\u{1920}', '\u{192b}', SC_Extend), ('\u{1930}',
-        '\u{193b}', SC_Extend), ('\u{1944}', '\u{1945}', SC_STerm), ('\u{1946}', '\u{194f}',
-        SC_Numeric), ('\u{1950}', '\u{196d}', SC_OLetter), ('\u{1970}', '\u{1974}', SC_OLetter),
-        ('\u{1980}', '\u{19ab}', SC_OLetter), ('\u{19b0}', '\u{19c9}', SC_OLetter), ('\u{19d0}',
-        '\u{19d9}', SC_Numeric), ('\u{1a00}', '\u{1a16}', SC_OLetter), ('\u{1a17}', '\u{1a1b}',
-        SC_Extend), ('\u{1a20}', '\u{1a54}', SC_OLetter), ('\u{1a55}', '\u{1a5e}', SC_Extend),
-        ('\u{1a60}', '\u{1a7c}', SC_Extend), ('\u{1a7f}', '\u{1a7f}', SC_Extend), ('\u{1a80}',
-        '\u{1a89}', SC_Numeric), ('\u{1a90}', '\u{1a99}', SC_Numeric), ('\u{1aa7}', '\u{1aa7}',
-        SC_OLetter), ('\u{1aa8}', '\u{1aab}', SC_STerm), ('\u{1ab0}', '\u{1ace}', SC_Extend),
-        ('\u{1b00}', '\u{1b04}', SC_Extend), ('\u{1b05}', '\u{1b33}', SC_OLetter), ('\u{1b34}',
-        '\u{1b44}', SC_Extend), ('\u{1b45}', '\u{1b4c}', SC_OLetter), ('\u{1b50}', '\u{1b59}',
-        SC_Numeric), ('\u{1b5a}', '\u{1b5b}', SC_STerm), ('\u{1b5e}', '\u{1b5f}', SC_STerm),
-        ('\u{1b6b}', '\u{1b73}', SC_Extend), ('\u{1b7d}', '\u{1b7e}', SC_STerm), ('\u{1b80}',
-        '\u{1b82}', SC_Extend), ('\u{1b83}', '\u{1ba0}', SC_OLetter), ('\u{1ba1}', '\u{1bad}',
-        SC_Extend), ('\u{1bae}', '\u{1baf}', SC_OLetter), ('\u{1bb0}', '\u{1bb9}', SC_Numeric),
-        ('\u{1bba}', '\u{1be5}', SC_OLetter), ('\u{1be6}', '\u{1bf3}', SC_Extend), ('\u{1c00}',
-        '\u{1c23}', SC_OLetter), ('\u{1c24}', '\u{1c37}', SC_Extend), ('\u{1c3b}', '\u{1c3c}',
-        SC_STerm), ('\u{1c40}', '\u{1c49}', SC_Numeric), ('\u{1c4d}', '\u{1c4f}', SC_OLetter),
-        ('\u{1c50}', '\u{1c59}', SC_Numeric), ('\u{1c5a}', '\u{1c7d}', SC_OLetter), ('\u{1c7e}',
-        '\u{1c7f}', SC_STerm), ('\u{1c80}', '\u{1c88}', SC_Lower), ('\u{1c90}', '\u{1cba}',
+        SC_OLetter), ('\u{889}', '\u{88e}', SC_OLetter), ('\u{890}', '\u{891}', SC_Numeric),
+        ('\u{897}', '\u{89f}', SC_Extend), ('\u{8a0}', '\u{8c9}', SC_OLetter), ('\u{8ca}',
+        '\u{8e1}', SC_Extend), ('\u{8e2}', '\u{8e2}', SC_Numeric), ('\u{8e3}', '\u{903}',
+        SC_Extend), ('\u{904}', '\u{939}', SC_OLetter), ('\u{93a}', '\u{93c}', SC_Extend),
+        ('\u{93d}', '\u{93d}', SC_OLetter), ('\u{93e}', '\u{94f}', SC_Extend), ('\u{950}',
+        '\u{950}', SC_OLetter), ('\u{951}', '\u{957}', SC_Extend), ('\u{958}', '\u{961}',
+        SC_OLetter), ('\u{962}', '\u{963}', SC_Extend), ('\u{964}', '\u{965}', SC_STerm),
+        ('\u{966}', '\u{96f}', SC_Numeric), ('\u{971}', '\u{980}', SC_OLetter), ('\u{981}',
+        '\u{983}', SC_Extend), ('\u{985}', '\u{98c}', SC_OLetter), ('\u{98f}', '\u{990}',
+        SC_OLetter), ('\u{993}', '\u{9a8}', SC_OLetter), ('\u{9aa}', '\u{9b0}', SC_OLetter),
+        ('\u{9b2}', '\u{9b2}', SC_OLetter), ('\u{9b6}', '\u{9b9}', SC_OLetter), ('\u{9bc}',
+        '\u{9bc}', SC_Extend), ('\u{9bd}', '\u{9bd}', SC_OLetter), ('\u{9be}', '\u{9c4}',
+        SC_Extend), ('\u{9c7}', '\u{9c8}', SC_Extend), ('\u{9cb}', '\u{9cd}', SC_Extend),
+        ('\u{9ce}', '\u{9ce}', SC_OLetter), ('\u{9d7}', '\u{9d7}', SC_Extend), ('\u{9dc}',
+        '\u{9dd}', SC_OLetter), ('\u{9df}', '\u{9e1}', SC_OLetter), ('\u{9e2}', '\u{9e3}',
+        SC_Extend), ('\u{9e6}', '\u{9ef}', SC_Numeric), ('\u{9f0}', '\u{9f1}', SC_OLetter),
+        ('\u{9fc}', '\u{9fc}', SC_OLetter), ('\u{9fe}', '\u{9fe}', SC_Extend), ('\u{a01}',
+        '\u{a03}', SC_Extend), ('\u{a05}', '\u{a0a}', SC_OLetter), ('\u{a0f}', '\u{a10}',
+        SC_OLetter), ('\u{a13}', '\u{a28}', SC_OLetter), ('\u{a2a}', '\u{a30}', SC_OLetter),
+        ('\u{a32}', '\u{a33}', SC_OLetter), ('\u{a35}', '\u{a36}', SC_OLetter), ('\u{a38}',
+        '\u{a39}', SC_OLetter), ('\u{a3c}', '\u{a3c}', SC_Extend), ('\u{a3e}', '\u{a42}',
+        SC_Extend), ('\u{a47}', '\u{a48}', SC_Extend), ('\u{a4b}', '\u{a4d}', SC_Extend),
+        ('\u{a51}', '\u{a51}', SC_Extend), ('\u{a59}', '\u{a5c}', SC_OLetter), ('\u{a5e}',
+        '\u{a5e}', SC_OLetter), ('\u{a66}', '\u{a6f}', SC_Numeric), ('\u{a70}', '\u{a71}',
+        SC_Extend), ('\u{a72}', '\u{a74}', SC_OLetter), ('\u{a75}', '\u{a75}', SC_Extend),
+        ('\u{a81}', '\u{a83}', SC_Extend), ('\u{a85}', '\u{a8d}', SC_OLetter), ('\u{a8f}',
+        '\u{a91}', SC_OLetter), ('\u{a93}', '\u{aa8}', SC_OLetter), ('\u{aaa}', '\u{ab0}',
+        SC_OLetter), ('\u{ab2}', '\u{ab3}', SC_OLetter), ('\u{ab5}', '\u{ab9}', SC_OLetter),
+        ('\u{abc}', '\u{abc}', SC_Extend), ('\u{abd}', '\u{abd}', SC_OLetter), ('\u{abe}',
+        '\u{ac5}', SC_Extend), ('\u{ac7}', '\u{ac9}', SC_Extend), ('\u{acb}', '\u{acd}', SC_Extend),
+        ('\u{ad0}', '\u{ad0}', SC_OLetter), ('\u{ae0}', '\u{ae1}', SC_OLetter), ('\u{ae2}',
+        '\u{ae3}', SC_Extend), ('\u{ae6}', '\u{aef}', SC_Numeric), ('\u{af9}', '\u{af9}',
+        SC_OLetter), ('\u{afa}', '\u{aff}', SC_Extend), ('\u{b01}', '\u{b03}', SC_Extend),
+        ('\u{b05}', '\u{b0c}', SC_OLetter), ('\u{b0f}', '\u{b10}', SC_OLetter), ('\u{b13}',
+        '\u{b28}', SC_OLetter), ('\u{b2a}', '\u{b30}', SC_OLetter), ('\u{b32}', '\u{b33}',
+        SC_OLetter), ('\u{b35}', '\u{b39}', SC_OLetter), ('\u{b3c}', '\u{b3c}', SC_Extend),
+        ('\u{b3d}', '\u{b3d}', SC_OLetter), ('\u{b3e}', '\u{b44}', SC_Extend), ('\u{b47}',
+        '\u{b48}', SC_Extend), ('\u{b4b}', '\u{b4d}', SC_Extend), ('\u{b55}', '\u{b57}', SC_Extend),
+        ('\u{b5c}', '\u{b5d}', SC_OLetter), ('\u{b5f}', '\u{b61}', SC_OLetter), ('\u{b62}',
+        '\u{b63}', SC_Extend), ('\u{b66}', '\u{b6f}', SC_Numeric), ('\u{b71}', '\u{b71}',
+        SC_OLetter), ('\u{b82}', '\u{b82}', SC_Extend), ('\u{b83}', '\u{b83}', SC_OLetter),
+        ('\u{b85}', '\u{b8a}', SC_OLetter), ('\u{b8e}', '\u{b90}', SC_OLetter), ('\u{b92}',
+        '\u{b95}', SC_OLetter), ('\u{b99}', '\u{b9a}', SC_OLetter), ('\u{b9c}', '\u{b9c}',
+        SC_OLetter), ('\u{b9e}', '\u{b9f}', SC_OLetter), ('\u{ba3}', '\u{ba4}', SC_OLetter),
+        ('\u{ba8}', '\u{baa}', SC_OLetter), ('\u{bae}', '\u{bb9}', SC_OLetter), ('\u{bbe}',
+        '\u{bc2}', SC_Extend), ('\u{bc6}', '\u{bc8}', SC_Extend), ('\u{bca}', '\u{bcd}', SC_Extend),
+        ('\u{bd0}', '\u{bd0}', SC_OLetter), ('\u{bd7}', '\u{bd7}', SC_Extend), ('\u{be6}',
+        '\u{bef}', SC_Numeric), ('\u{c00}', '\u{c04}', SC_Extend), ('\u{c05}', '\u{c0c}',
+        SC_OLetter), ('\u{c0e}', '\u{c10}', SC_OLetter), ('\u{c12}', '\u{c28}', SC_OLetter),
+        ('\u{c2a}', '\u{c39}', SC_OLetter), ('\u{c3c}', '\u{c3c}', SC_Extend), ('\u{c3d}',
+        '\u{c3d}', SC_OLetter), ('\u{c3e}', '\u{c44}', SC_Extend), ('\u{c46}', '\u{c48}',
+        SC_Extend), ('\u{c4a}', '\u{c4d}', SC_Extend), ('\u{c55}', '\u{c56}', SC_Extend),
+        ('\u{c58}', '\u{c5a}', SC_OLetter), ('\u{c5d}', '\u{c5d}', SC_OLetter), ('\u{c60}',
+        '\u{c61}', SC_OLetter), ('\u{c62}', '\u{c63}', SC_Extend), ('\u{c66}', '\u{c6f}',
+        SC_Numeric), ('\u{c80}', '\u{c80}', SC_OLetter), ('\u{c81}', '\u{c83}', SC_Extend),
+        ('\u{c85}', '\u{c8c}', SC_OLetter), ('\u{c8e}', '\u{c90}', SC_OLetter), ('\u{c92}',
+        '\u{ca8}', SC_OLetter), ('\u{caa}', '\u{cb3}', SC_OLetter), ('\u{cb5}', '\u{cb9}',
+        SC_OLetter), ('\u{cbc}', '\u{cbc}', SC_Extend), ('\u{cbd}', '\u{cbd}', SC_OLetter),
+        ('\u{cbe}', '\u{cc4}', SC_Extend), ('\u{cc6}', '\u{cc8}', SC_Extend), ('\u{cca}', '\u{ccd}',
+        SC_Extend), ('\u{cd5}', '\u{cd6}', SC_Extend), ('\u{cdd}', '\u{cde}', SC_OLetter),
+        ('\u{ce0}', '\u{ce1}', SC_OLetter), ('\u{ce2}', '\u{ce3}', SC_Extend), ('\u{ce6}',
+        '\u{cef}', SC_Numeric), ('\u{cf1}', '\u{cf2}', SC_OLetter), ('\u{cf3}', '\u{cf3}',
+        SC_Extend), ('\u{d00}', '\u{d03}', SC_Extend), ('\u{d04}', '\u{d0c}', SC_OLetter),
+        ('\u{d0e}', '\u{d10}', SC_OLetter), ('\u{d12}', '\u{d3a}', SC_OLetter), ('\u{d3b}',
+        '\u{d3c}', SC_Extend), ('\u{d3d}', '\u{d3d}', SC_OLetter), ('\u{d3e}', '\u{d44}',
+        SC_Extend), ('\u{d46}', '\u{d48}', SC_Extend), ('\u{d4a}', '\u{d4d}', SC_Extend),
+        ('\u{d4e}', '\u{d4e}', SC_OLetter), ('\u{d54}', '\u{d56}', SC_OLetter), ('\u{d57}',
+        '\u{d57}', SC_Extend), ('\u{d5f}', '\u{d61}', SC_OLetter), ('\u{d62}', '\u{d63}',
+        SC_Extend), ('\u{d66}', '\u{d6f}', SC_Numeric), ('\u{d7a}', '\u{d7f}', SC_OLetter),
+        ('\u{d81}', '\u{d83}', SC_Extend), ('\u{d85}', '\u{d96}', SC_OLetter), ('\u{d9a}',
+        '\u{db1}', SC_OLetter), ('\u{db3}', '\u{dbb}', SC_OLetter), ('\u{dbd}', '\u{dbd}',
+        SC_OLetter), ('\u{dc0}', '\u{dc6}', SC_OLetter), ('\u{dca}', '\u{dca}', SC_Extend),
+        ('\u{dcf}', '\u{dd4}', SC_Extend), ('\u{dd6}', '\u{dd6}', SC_Extend), ('\u{dd8}', '\u{ddf}',
+        SC_Extend), ('\u{de6}', '\u{def}', SC_Numeric), ('\u{df2}', '\u{df3}', SC_Extend),
+        ('\u{e01}', '\u{e30}', SC_OLetter), ('\u{e31}', '\u{e31}', SC_Extend), ('\u{e32}',
+        '\u{e33}', SC_OLetter), ('\u{e34}', '\u{e3a}', SC_Extend), ('\u{e40}', '\u{e46}',
+        SC_OLetter), ('\u{e47}', '\u{e4e}', SC_Extend), ('\u{e50}', '\u{e59}', SC_Numeric),
+        ('\u{e81}', '\u{e82}', SC_OLetter), ('\u{e84}', '\u{e84}', SC_OLetter), ('\u{e86}',
+        '\u{e8a}', SC_OLetter), ('\u{e8c}', '\u{ea3}', SC_OLetter), ('\u{ea5}', '\u{ea5}',
+        SC_OLetter), ('\u{ea7}', '\u{eb0}', SC_OLetter), ('\u{eb1}', '\u{eb1}', SC_Extend),
+        ('\u{eb2}', '\u{eb3}', SC_OLetter), ('\u{eb4}', '\u{ebc}', SC_Extend), ('\u{ebd}',
+        '\u{ebd}', SC_OLetter), ('\u{ec0}', '\u{ec4}', SC_OLetter), ('\u{ec6}', '\u{ec6}',
+        SC_OLetter), ('\u{ec8}', '\u{ece}', SC_Extend), ('\u{ed0}', '\u{ed9}', SC_Numeric),
+        ('\u{edc}', '\u{edf}', SC_OLetter), ('\u{f00}', '\u{f00}', SC_OLetter), ('\u{f18}',
+        '\u{f19}', SC_Extend), ('\u{f20}', '\u{f29}', SC_Numeric), ('\u{f35}', '\u{f35}',
+        SC_Extend), ('\u{f37}', '\u{f37}', SC_Extend), ('\u{f39}', '\u{f39}', SC_Extend),
+        ('\u{f3a}', '\u{f3d}', SC_Close), ('\u{f3e}', '\u{f3f}', SC_Extend), ('\u{f40}', '\u{f47}',
+        SC_OLetter), ('\u{f49}', '\u{f6c}', SC_OLetter), ('\u{f71}', '\u{f84}', SC_Extend),
+        ('\u{f86}', '\u{f87}', SC_Extend), ('\u{f88}', '\u{f8c}', SC_OLetter), ('\u{f8d}',
+        '\u{f97}', SC_Extend), ('\u{f99}', '\u{fbc}', SC_Extend), ('\u{fc6}', '\u{fc6}', SC_Extend),
+        ('\u{1000}', '\u{102a}', SC_OLetter), ('\u{102b}', '\u{103e}', SC_Extend), ('\u{103f}',
+        '\u{103f}', SC_OLetter), ('\u{1040}', '\u{1049}', SC_Numeric), ('\u{104a}', '\u{104b}',
+        SC_STerm), ('\u{1050}', '\u{1055}', SC_OLetter), ('\u{1056}', '\u{1059}', SC_Extend),
+        ('\u{105a}', '\u{105d}', SC_OLetter), ('\u{105e}', '\u{1060}', SC_Extend), ('\u{1061}',
+        '\u{1061}', SC_OLetter), ('\u{1062}', '\u{1064}', SC_Extend), ('\u{1065}', '\u{1066}',
+        SC_OLetter), ('\u{1067}', '\u{106d}', SC_Extend), ('\u{106e}', '\u{1070}', SC_OLetter),
+        ('\u{1071}', '\u{1074}', SC_Extend), ('\u{1075}', '\u{1081}', SC_OLetter), ('\u{1082}',
+        '\u{108d}', SC_Extend), ('\u{108e}', '\u{108e}', SC_OLetter), ('\u{108f}', '\u{108f}',
+        SC_Extend), ('\u{1090}', '\u{1099}', SC_Numeric), ('\u{109a}', '\u{109d}', SC_Extend),
+        ('\u{10a0}', '\u{10c5}', SC_Upper), ('\u{10c7}', '\u{10c7}', SC_Upper), ('\u{10cd}',
+        '\u{10cd}', SC_Upper), ('\u{10d0}', '\u{10fa}', SC_OLetter), ('\u{10fc}', '\u{10fc}',
+        SC_Lower), ('\u{10fd}', '\u{1248}', SC_OLetter), ('\u{124a}', '\u{124d}', SC_OLetter),
+        ('\u{1250}', '\u{1256}', SC_OLetter), ('\u{1258}', '\u{1258}', SC_OLetter), ('\u{125a}',
+        '\u{125d}', SC_OLetter), ('\u{1260}', '\u{1288}', SC_OLetter), ('\u{128a}', '\u{128d}',
+        SC_OLetter), ('\u{1290}', '\u{12b0}', SC_OLetter), ('\u{12b2}', '\u{12b5}', SC_OLetter),
+        ('\u{12b8}', '\u{12be}', SC_OLetter), ('\u{12c0}', '\u{12c0}', SC_OLetter), ('\u{12c2}',
+        '\u{12c5}', SC_OLetter), ('\u{12c8}', '\u{12d6}', SC_OLetter), ('\u{12d8}', '\u{1310}',
+        SC_OLetter), ('\u{1312}', '\u{1315}', SC_OLetter), ('\u{1318}', '\u{135a}', SC_OLetter),
+        ('\u{135d}', '\u{135f}', SC_Extend), ('\u{1362}', '\u{1362}', SC_STerm), ('\u{1367}',
+        '\u{1368}', SC_STerm), ('\u{1380}', '\u{138f}', SC_OLetter), ('\u{13a0}', '\u{13f5}',
+        SC_Upper), ('\u{13f8}', '\u{13fd}', SC_Lower), ('\u{1401}', '\u{166c}', SC_OLetter),
+        ('\u{166e}', '\u{166e}', SC_STerm), ('\u{166f}', '\u{167f}', SC_OLetter), ('\u{1680}',
+        '\u{1680}', SC_Sp), ('\u{1681}', '\u{169a}', SC_OLetter), ('\u{169b}', '\u{169c}',
+        SC_Close), ('\u{16a0}', '\u{16ea}', SC_OLetter), ('\u{16ee}', '\u{16f8}', SC_OLetter),
+        ('\u{1700}', '\u{1711}', SC_OLetter), ('\u{1712}', '\u{1715}', SC_Extend), ('\u{171f}',
+        '\u{1731}', SC_OLetter), ('\u{1732}', '\u{1734}', SC_Extend), ('\u{1735}', '\u{1736}',
+        SC_STerm), ('\u{1740}', '\u{1751}', SC_OLetter), ('\u{1752}', '\u{1753}', SC_Extend),
+        ('\u{1760}', '\u{176c}', SC_OLetter), ('\u{176e}', '\u{1770}', SC_OLetter), ('\u{1772}',
+        '\u{1773}', SC_Extend), ('\u{1780}', '\u{17b3}', SC_OLetter), ('\u{17b4}', '\u{17d3}',
+        SC_Extend), ('\u{17d4}', '\u{17d5}', SC_STerm), ('\u{17d7}', '\u{17d7}', SC_OLetter),
+        ('\u{17dc}', '\u{17dc}', SC_OLetter), ('\u{17dd}', '\u{17dd}', SC_Extend), ('\u{17e0}',
+        '\u{17e9}', SC_Numeric), ('\u{1802}', '\u{1802}', SC_SContinue), ('\u{1803}', '\u{1803}',
+        SC_STerm), ('\u{1808}', '\u{1808}', SC_SContinue), ('\u{1809}', '\u{1809}', SC_STerm),
+        ('\u{180b}', '\u{180d}', SC_Extend), ('\u{180e}', '\u{180e}', SC_Format), ('\u{180f}',
+        '\u{180f}', SC_Extend), ('\u{1810}', '\u{1819}', SC_Numeric), ('\u{1820}', '\u{1878}',
+        SC_OLetter), ('\u{1880}', '\u{1884}', SC_OLetter), ('\u{1885}', '\u{1886}', SC_Extend),
+        ('\u{1887}', '\u{18a8}', SC_OLetter), ('\u{18a9}', '\u{18a9}', SC_Extend), ('\u{18aa}',
+        '\u{18aa}', SC_OLetter), ('\u{18b0}', '\u{18f5}', SC_OLetter), ('\u{1900}', '\u{191e}',
+        SC_OLetter), ('\u{1920}', '\u{192b}', SC_Extend), ('\u{1930}', '\u{193b}', SC_Extend),
+        ('\u{1944}', '\u{1945}', SC_STerm), ('\u{1946}', '\u{194f}', SC_Numeric), ('\u{1950}',
+        '\u{196d}', SC_OLetter), ('\u{1970}', '\u{1974}', SC_OLetter), ('\u{1980}', '\u{19ab}',
+        SC_OLetter), ('\u{19b0}', '\u{19c9}', SC_OLetter), ('\u{19d0}', '\u{19da}', SC_Numeric),
+        ('\u{1a00}', '\u{1a16}', SC_OLetter), ('\u{1a17}', '\u{1a1b}', SC_Extend), ('\u{1a20}',
+        '\u{1a54}', SC_OLetter), ('\u{1a55}', '\u{1a5e}', SC_Extend), ('\u{1a60}', '\u{1a7c}',
+        SC_Extend), ('\u{1a7f}', '\u{1a7f}', SC_Extend), ('\u{1a80}', '\u{1a89}', SC_Numeric),
+        ('\u{1a90}', '\u{1a99}', SC_Numeric), ('\u{1aa7}', '\u{1aa7}', SC_OLetter), ('\u{1aa8}',
+        '\u{1aab}', SC_STerm), ('\u{1ab0}', '\u{1ace}', SC_Extend), ('\u{1b00}', '\u{1b04}',
+        SC_Extend), ('\u{1b05}', '\u{1b33}', SC_OLetter), ('\u{1b34}', '\u{1b44}', SC_Extend),
+        ('\u{1b45}', '\u{1b4c}', SC_OLetter), ('\u{1b4e}', '\u{1b4f}', SC_STerm), ('\u{1b50}',
+        '\u{1b59}', SC_Numeric), ('\u{1b5a}', '\u{1b5b}', SC_STerm), ('\u{1b5e}', '\u{1b5f}',
+        SC_STerm), ('\u{1b6b}', '\u{1b73}', SC_Extend), ('\u{1b7d}', '\u{1b7f}', SC_STerm),
+        ('\u{1b80}', '\u{1b82}', SC_Extend), ('\u{1b83}', '\u{1ba0}', SC_OLetter), ('\u{1ba1}',
+        '\u{1bad}', SC_Extend), ('\u{1bae}', '\u{1baf}', SC_OLetter), ('\u{1bb0}', '\u{1bb9}',
+        SC_Numeric), ('\u{1bba}', '\u{1be5}', SC_OLetter), ('\u{1be6}', '\u{1bf3}', SC_Extend),
+        ('\u{1c00}', '\u{1c23}', SC_OLetter), ('\u{1c24}', '\u{1c37}', SC_Extend), ('\u{1c3b}',
+        '\u{1c3c}', SC_STerm), ('\u{1c40}', '\u{1c49}', SC_Numeric), ('\u{1c4d}', '\u{1c4f}',
+        SC_OLetter), ('\u{1c50}', '\u{1c59}', SC_Numeric), ('\u{1c5a}', '\u{1c7d}', SC_OLetter),
+        ('\u{1c7e}', '\u{1c7f}', SC_STerm), ('\u{1c80}', '\u{1c88}', SC_Lower), ('\u{1c89}',
+        '\u{1c89}', SC_Upper), ('\u{1c8a}', '\u{1c8a}', SC_Lower), ('\u{1c90}', '\u{1cba}',
         SC_OLetter), ('\u{1cbd}', '\u{1cbf}', SC_OLetter), ('\u{1cd0}', '\u{1cd2}', SC_Extend),
         ('\u{1cd4}', '\u{1ce8}', SC_Extend), ('\u{1ce9}', '\u{1cec}', SC_OLetter), ('\u{1ced}',
         '\u{1ced}', SC_Extend), ('\u{1cee}', '\u{1cf3}', SC_OLetter), ('\u{1cf4}', '\u{1cf4}',
@@ -2572,260 +2749,266 @@
         SC_Lower), ('\u{2ceb}', '\u{2ceb}', SC_Upper), ('\u{2cec}', '\u{2cec}', SC_Lower),
         ('\u{2ced}', '\u{2ced}', SC_Upper), ('\u{2cee}', '\u{2cee}', SC_Lower), ('\u{2cef}',
         '\u{2cf1}', SC_Extend), ('\u{2cf2}', '\u{2cf2}', SC_Upper), ('\u{2cf3}', '\u{2cf3}',
-        SC_Lower), ('\u{2d00}', '\u{2d25}', SC_Lower), ('\u{2d27}', '\u{2d27}', SC_Lower),
-        ('\u{2d2d}', '\u{2d2d}', SC_Lower), ('\u{2d30}', '\u{2d67}', SC_OLetter), ('\u{2d6f}',
-        '\u{2d6f}', SC_OLetter), ('\u{2d7f}', '\u{2d7f}', SC_Extend), ('\u{2d80}', '\u{2d96}',
-        SC_OLetter), ('\u{2da0}', '\u{2da6}', SC_OLetter), ('\u{2da8}', '\u{2dae}', SC_OLetter),
-        ('\u{2db0}', '\u{2db6}', SC_OLetter), ('\u{2db8}', '\u{2dbe}', SC_OLetter), ('\u{2dc0}',
-        '\u{2dc6}', SC_OLetter), ('\u{2dc8}', '\u{2dce}', SC_OLetter), ('\u{2dd0}', '\u{2dd6}',
-        SC_OLetter), ('\u{2dd8}', '\u{2dde}', SC_OLetter), ('\u{2de0}', '\u{2dff}', SC_Extend),
-        ('\u{2e00}', '\u{2e0d}', SC_Close), ('\u{2e1c}', '\u{2e1d}', SC_Close), ('\u{2e20}',
-        '\u{2e29}', SC_Close), ('\u{2e2e}', '\u{2e2e}', SC_STerm), ('\u{2e2f}', '\u{2e2f}',
-        SC_OLetter), ('\u{2e3c}', '\u{2e3c}', SC_STerm), ('\u{2e42}', '\u{2e42}', SC_Close),
-        ('\u{2e53}', '\u{2e54}', SC_STerm), ('\u{2e55}', '\u{2e5c}', SC_Close), ('\u{3000}',
-        '\u{3000}', SC_Sp), ('\u{3001}', '\u{3001}', SC_SContinue), ('\u{3002}', '\u{3002}',
-        SC_STerm), ('\u{3005}', '\u{3007}', SC_OLetter), ('\u{3008}', '\u{3011}', SC_Close),
-        ('\u{3014}', '\u{301b}', SC_Close), ('\u{301d}', '\u{301f}', SC_Close), ('\u{3021}',
-        '\u{3029}', SC_OLetter), ('\u{302a}', '\u{302f}', SC_Extend), ('\u{3031}', '\u{3035}',
-        SC_OLetter), ('\u{3038}', '\u{303c}', SC_OLetter), ('\u{3041}', '\u{3096}', SC_OLetter),
-        ('\u{3099}', '\u{309a}', SC_Extend), ('\u{309d}', '\u{309f}', SC_OLetter), ('\u{30a1}',
-        '\u{30fa}', SC_OLetter), ('\u{30fc}', '\u{30ff}', SC_OLetter), ('\u{3105}', '\u{312f}',
-        SC_OLetter), ('\u{3131}', '\u{318e}', SC_OLetter), ('\u{31a0}', '\u{31bf}', SC_OLetter),
-        ('\u{31f0}', '\u{31ff}', SC_OLetter), ('\u{3400}', '\u{4dbf}', SC_OLetter), ('\u{4e00}',
-        '\u{a48c}', SC_OLetter), ('\u{a4d0}', '\u{a4fd}', SC_OLetter), ('\u{a4ff}', '\u{a4ff}',
-        SC_STerm), ('\u{a500}', '\u{a60c}', SC_OLetter), ('\u{a60e}', '\u{a60f}', SC_STerm),
-        ('\u{a610}', '\u{a61f}', SC_OLetter), ('\u{a620}', '\u{a629}', SC_Numeric), ('\u{a62a}',
-        '\u{a62b}', SC_OLetter), ('\u{a640}', '\u{a640}', SC_Upper), ('\u{a641}', '\u{a641}',
-        SC_Lower), ('\u{a642}', '\u{a642}', SC_Upper), ('\u{a643}', '\u{a643}', SC_Lower),
-        ('\u{a644}', '\u{a644}', SC_Upper), ('\u{a645}', '\u{a645}', SC_Lower), ('\u{a646}',
-        '\u{a646}', SC_Upper), ('\u{a647}', '\u{a647}', SC_Lower), ('\u{a648}', '\u{a648}',
-        SC_Upper), ('\u{a649}', '\u{a649}', SC_Lower), ('\u{a64a}', '\u{a64a}', SC_Upper),
-        ('\u{a64b}', '\u{a64b}', SC_Lower), ('\u{a64c}', '\u{a64c}', SC_Upper), ('\u{a64d}',
-        '\u{a64d}', SC_Lower), ('\u{a64e}', '\u{a64e}', SC_Upper), ('\u{a64f}', '\u{a64f}',
-        SC_Lower), ('\u{a650}', '\u{a650}', SC_Upper), ('\u{a651}', '\u{a651}', SC_Lower),
-        ('\u{a652}', '\u{a652}', SC_Upper), ('\u{a653}', '\u{a653}', SC_Lower), ('\u{a654}',
-        '\u{a654}', SC_Upper), ('\u{a655}', '\u{a655}', SC_Lower), ('\u{a656}', '\u{a656}',
-        SC_Upper), ('\u{a657}', '\u{a657}', SC_Lower), ('\u{a658}', '\u{a658}', SC_Upper),
-        ('\u{a659}', '\u{a659}', SC_Lower), ('\u{a65a}', '\u{a65a}', SC_Upper), ('\u{a65b}',
-        '\u{a65b}', SC_Lower), ('\u{a65c}', '\u{a65c}', SC_Upper), ('\u{a65d}', '\u{a65d}',
-        SC_Lower), ('\u{a65e}', '\u{a65e}', SC_Upper), ('\u{a65f}', '\u{a65f}', SC_Lower),
-        ('\u{a660}', '\u{a660}', SC_Upper), ('\u{a661}', '\u{a661}', SC_Lower), ('\u{a662}',
-        '\u{a662}', SC_Upper), ('\u{a663}', '\u{a663}', SC_Lower), ('\u{a664}', '\u{a664}',
-        SC_Upper), ('\u{a665}', '\u{a665}', SC_Lower), ('\u{a666}', '\u{a666}', SC_Upper),
-        ('\u{a667}', '\u{a667}', SC_Lower), ('\u{a668}', '\u{a668}', SC_Upper), ('\u{a669}',
-        '\u{a669}', SC_Lower), ('\u{a66a}', '\u{a66a}', SC_Upper), ('\u{a66b}', '\u{a66b}',
-        SC_Lower), ('\u{a66c}', '\u{a66c}', SC_Upper), ('\u{a66d}', '\u{a66d}', SC_Lower),
-        ('\u{a66e}', '\u{a66e}', SC_OLetter), ('\u{a66f}', '\u{a672}', SC_Extend), ('\u{a674}',
-        '\u{a67d}', SC_Extend), ('\u{a67f}', '\u{a67f}', SC_OLetter), ('\u{a680}', '\u{a680}',
-        SC_Upper), ('\u{a681}', '\u{a681}', SC_Lower), ('\u{a682}', '\u{a682}', SC_Upper),
-        ('\u{a683}', '\u{a683}', SC_Lower), ('\u{a684}', '\u{a684}', SC_Upper), ('\u{a685}',
-        '\u{a685}', SC_Lower), ('\u{a686}', '\u{a686}', SC_Upper), ('\u{a687}', '\u{a687}',
-        SC_Lower), ('\u{a688}', '\u{a688}', SC_Upper), ('\u{a689}', '\u{a689}', SC_Lower),
-        ('\u{a68a}', '\u{a68a}', SC_Upper), ('\u{a68b}', '\u{a68b}', SC_Lower), ('\u{a68c}',
-        '\u{a68c}', SC_Upper), ('\u{a68d}', '\u{a68d}', SC_Lower), ('\u{a68e}', '\u{a68e}',
-        SC_Upper), ('\u{a68f}', '\u{a68f}', SC_Lower), ('\u{a690}', '\u{a690}', SC_Upper),
-        ('\u{a691}', '\u{a691}', SC_Lower), ('\u{a692}', '\u{a692}', SC_Upper), ('\u{a693}',
-        '\u{a693}', SC_Lower), ('\u{a694}', '\u{a694}', SC_Upper), ('\u{a695}', '\u{a695}',
-        SC_Lower), ('\u{a696}', '\u{a696}', SC_Upper), ('\u{a697}', '\u{a697}', SC_Lower),
-        ('\u{a698}', '\u{a698}', SC_Upper), ('\u{a699}', '\u{a699}', SC_Lower), ('\u{a69a}',
-        '\u{a69a}', SC_Upper), ('\u{a69b}', '\u{a69d}', SC_Lower), ('\u{a69e}', '\u{a69f}',
-        SC_Extend), ('\u{a6a0}', '\u{a6ef}', SC_OLetter), ('\u{a6f0}', '\u{a6f1}', SC_Extend),
-        ('\u{a6f3}', '\u{a6f3}', SC_STerm), ('\u{a6f7}', '\u{a6f7}', SC_STerm), ('\u{a717}',
-        '\u{a71f}', SC_OLetter), ('\u{a722}', '\u{a722}', SC_Upper), ('\u{a723}', '\u{a723}',
-        SC_Lower), ('\u{a724}', '\u{a724}', SC_Upper), ('\u{a725}', '\u{a725}', SC_Lower),
-        ('\u{a726}', '\u{a726}', SC_Upper), ('\u{a727}', '\u{a727}', SC_Lower), ('\u{a728}',
-        '\u{a728}', SC_Upper), ('\u{a729}', '\u{a729}', SC_Lower), ('\u{a72a}', '\u{a72a}',
-        SC_Upper), ('\u{a72b}', '\u{a72b}', SC_Lower), ('\u{a72c}', '\u{a72c}', SC_Upper),
-        ('\u{a72d}', '\u{a72d}', SC_Lower), ('\u{a72e}', '\u{a72e}', SC_Upper), ('\u{a72f}',
-        '\u{a731}', SC_Lower), ('\u{a732}', '\u{a732}', SC_Upper), ('\u{a733}', '\u{a733}',
-        SC_Lower), ('\u{a734}', '\u{a734}', SC_Upper), ('\u{a735}', '\u{a735}', SC_Lower),
-        ('\u{a736}', '\u{a736}', SC_Upper), ('\u{a737}', '\u{a737}', SC_Lower), ('\u{a738}',
-        '\u{a738}', SC_Upper), ('\u{a739}', '\u{a739}', SC_Lower), ('\u{a73a}', '\u{a73a}',
-        SC_Upper), ('\u{a73b}', '\u{a73b}', SC_Lower), ('\u{a73c}', '\u{a73c}', SC_Upper),
-        ('\u{a73d}', '\u{a73d}', SC_Lower), ('\u{a73e}', '\u{a73e}', SC_Upper), ('\u{a73f}',
-        '\u{a73f}', SC_Lower), ('\u{a740}', '\u{a740}', SC_Upper), ('\u{a741}', '\u{a741}',
-        SC_Lower), ('\u{a742}', '\u{a742}', SC_Upper), ('\u{a743}', '\u{a743}', SC_Lower),
-        ('\u{a744}', '\u{a744}', SC_Upper), ('\u{a745}', '\u{a745}', SC_Lower), ('\u{a746}',
-        '\u{a746}', SC_Upper), ('\u{a747}', '\u{a747}', SC_Lower), ('\u{a748}', '\u{a748}',
-        SC_Upper), ('\u{a749}', '\u{a749}', SC_Lower), ('\u{a74a}', '\u{a74a}', SC_Upper),
-        ('\u{a74b}', '\u{a74b}', SC_Lower), ('\u{a74c}', '\u{a74c}', SC_Upper), ('\u{a74d}',
-        '\u{a74d}', SC_Lower), ('\u{a74e}', '\u{a74e}', SC_Upper), ('\u{a74f}', '\u{a74f}',
-        SC_Lower), ('\u{a750}', '\u{a750}', SC_Upper), ('\u{a751}', '\u{a751}', SC_Lower),
-        ('\u{a752}', '\u{a752}', SC_Upper), ('\u{a753}', '\u{a753}', SC_Lower), ('\u{a754}',
-        '\u{a754}', SC_Upper), ('\u{a755}', '\u{a755}', SC_Lower), ('\u{a756}', '\u{a756}',
-        SC_Upper), ('\u{a757}', '\u{a757}', SC_Lower), ('\u{a758}', '\u{a758}', SC_Upper),
-        ('\u{a759}', '\u{a759}', SC_Lower), ('\u{a75a}', '\u{a75a}', SC_Upper), ('\u{a75b}',
-        '\u{a75b}', SC_Lower), ('\u{a75c}', '\u{a75c}', SC_Upper), ('\u{a75d}', '\u{a75d}',
-        SC_Lower), ('\u{a75e}', '\u{a75e}', SC_Upper), ('\u{a75f}', '\u{a75f}', SC_Lower),
-        ('\u{a760}', '\u{a760}', SC_Upper), ('\u{a761}', '\u{a761}', SC_Lower), ('\u{a762}',
-        '\u{a762}', SC_Upper), ('\u{a763}', '\u{a763}', SC_Lower), ('\u{a764}', '\u{a764}',
-        SC_Upper), ('\u{a765}', '\u{a765}', SC_Lower), ('\u{a766}', '\u{a766}', SC_Upper),
-        ('\u{a767}', '\u{a767}', SC_Lower), ('\u{a768}', '\u{a768}', SC_Upper), ('\u{a769}',
-        '\u{a769}', SC_Lower), ('\u{a76a}', '\u{a76a}', SC_Upper), ('\u{a76b}', '\u{a76b}',
-        SC_Lower), ('\u{a76c}', '\u{a76c}', SC_Upper), ('\u{a76d}', '\u{a76d}', SC_Lower),
-        ('\u{a76e}', '\u{a76e}', SC_Upper), ('\u{a76f}', '\u{a778}', SC_Lower), ('\u{a779}',
-        '\u{a779}', SC_Upper), ('\u{a77a}', '\u{a77a}', SC_Lower), ('\u{a77b}', '\u{a77b}',
-        SC_Upper), ('\u{a77c}', '\u{a77c}', SC_Lower), ('\u{a77d}', '\u{a77e}', SC_Upper),
-        ('\u{a77f}', '\u{a77f}', SC_Lower), ('\u{a780}', '\u{a780}', SC_Upper), ('\u{a781}',
-        '\u{a781}', SC_Lower), ('\u{a782}', '\u{a782}', SC_Upper), ('\u{a783}', '\u{a783}',
-        SC_Lower), ('\u{a784}', '\u{a784}', SC_Upper), ('\u{a785}', '\u{a785}', SC_Lower),
-        ('\u{a786}', '\u{a786}', SC_Upper), ('\u{a787}', '\u{a787}', SC_Lower), ('\u{a788}',
-        '\u{a788}', SC_OLetter), ('\u{a78b}', '\u{a78b}', SC_Upper), ('\u{a78c}', '\u{a78c}',
-        SC_Lower), ('\u{a78d}', '\u{a78d}', SC_Upper), ('\u{a78e}', '\u{a78e}', SC_Lower),
-        ('\u{a78f}', '\u{a78f}', SC_OLetter), ('\u{a790}', '\u{a790}', SC_Upper), ('\u{a791}',
-        '\u{a791}', SC_Lower), ('\u{a792}', '\u{a792}', SC_Upper), ('\u{a793}', '\u{a795}',
-        SC_Lower), ('\u{a796}', '\u{a796}', SC_Upper), ('\u{a797}', '\u{a797}', SC_Lower),
-        ('\u{a798}', '\u{a798}', SC_Upper), ('\u{a799}', '\u{a799}', SC_Lower), ('\u{a79a}',
-        '\u{a79a}', SC_Upper), ('\u{a79b}', '\u{a79b}', SC_Lower), ('\u{a79c}', '\u{a79c}',
-        SC_Upper), ('\u{a79d}', '\u{a79d}', SC_Lower), ('\u{a79e}', '\u{a79e}', SC_Upper),
-        ('\u{a79f}', '\u{a79f}', SC_Lower), ('\u{a7a0}', '\u{a7a0}', SC_Upper), ('\u{a7a1}',
-        '\u{a7a1}', SC_Lower), ('\u{a7a2}', '\u{a7a2}', SC_Upper), ('\u{a7a3}', '\u{a7a3}',
-        SC_Lower), ('\u{a7a4}', '\u{a7a4}', SC_Upper), ('\u{a7a5}', '\u{a7a5}', SC_Lower),
-        ('\u{a7a6}', '\u{a7a6}', SC_Upper), ('\u{a7a7}', '\u{a7a7}', SC_Lower), ('\u{a7a8}',
-        '\u{a7a8}', SC_Upper), ('\u{a7a9}', '\u{a7a9}', SC_Lower), ('\u{a7aa}', '\u{a7ae}',
-        SC_Upper), ('\u{a7af}', '\u{a7af}', SC_Lower), ('\u{a7b0}', '\u{a7b4}', SC_Upper),
-        ('\u{a7b5}', '\u{a7b5}', SC_Lower), ('\u{a7b6}', '\u{a7b6}', SC_Upper), ('\u{a7b7}',
-        '\u{a7b7}', SC_Lower), ('\u{a7b8}', '\u{a7b8}', SC_Upper), ('\u{a7b9}', '\u{a7b9}',
-        SC_Lower), ('\u{a7ba}', '\u{a7ba}', SC_Upper), ('\u{a7bb}', '\u{a7bb}', SC_Lower),
-        ('\u{a7bc}', '\u{a7bc}', SC_Upper), ('\u{a7bd}', '\u{a7bd}', SC_Lower), ('\u{a7be}',
-        '\u{a7be}', SC_Upper), ('\u{a7bf}', '\u{a7bf}', SC_Lower), ('\u{a7c0}', '\u{a7c0}',
-        SC_Upper), ('\u{a7c1}', '\u{a7c1}', SC_Lower), ('\u{a7c2}', '\u{a7c2}', SC_Upper),
-        ('\u{a7c3}', '\u{a7c3}', SC_Lower), ('\u{a7c4}', '\u{a7c7}', SC_Upper), ('\u{a7c8}',
-        '\u{a7c8}', SC_Lower), ('\u{a7c9}', '\u{a7c9}', SC_Upper), ('\u{a7ca}', '\u{a7ca}',
-        SC_Lower), ('\u{a7d0}', '\u{a7d0}', SC_Upper), ('\u{a7d1}', '\u{a7d1}', SC_Lower),
-        ('\u{a7d3}', '\u{a7d3}', SC_Lower), ('\u{a7d5}', '\u{a7d5}', SC_Lower), ('\u{a7d6}',
-        '\u{a7d6}', SC_Upper), ('\u{a7d7}', '\u{a7d7}', SC_Lower), ('\u{a7d8}', '\u{a7d8}',
-        SC_Upper), ('\u{a7d9}', '\u{a7d9}', SC_Lower), ('\u{a7f2}', '\u{a7f4}', SC_Lower),
-        ('\u{a7f5}', '\u{a7f5}', SC_Upper), ('\u{a7f6}', '\u{a7f6}', SC_Lower), ('\u{a7f7}',
-        '\u{a7f7}', SC_OLetter), ('\u{a7f8}', '\u{a7fa}', SC_Lower), ('\u{a7fb}', '\u{a801}',
-        SC_OLetter), ('\u{a802}', '\u{a802}', SC_Extend), ('\u{a803}', '\u{a805}', SC_OLetter),
-        ('\u{a806}', '\u{a806}', SC_Extend), ('\u{a807}', '\u{a80a}', SC_OLetter), ('\u{a80b}',
-        '\u{a80b}', SC_Extend), ('\u{a80c}', '\u{a822}', SC_OLetter), ('\u{a823}', '\u{a827}',
-        SC_Extend), ('\u{a82c}', '\u{a82c}', SC_Extend), ('\u{a840}', '\u{a873}', SC_OLetter),
-        ('\u{a876}', '\u{a877}', SC_STerm), ('\u{a880}', '\u{a881}', SC_Extend), ('\u{a882}',
-        '\u{a8b3}', SC_OLetter), ('\u{a8b4}', '\u{a8c5}', SC_Extend), ('\u{a8ce}', '\u{a8cf}',
-        SC_STerm), ('\u{a8d0}', '\u{a8d9}', SC_Numeric), ('\u{a8e0}', '\u{a8f1}', SC_Extend),
-        ('\u{a8f2}', '\u{a8f7}', SC_OLetter), ('\u{a8fb}', '\u{a8fb}', SC_OLetter), ('\u{a8fd}',
-        '\u{a8fe}', SC_OLetter), ('\u{a8ff}', '\u{a8ff}', SC_Extend), ('\u{a900}', '\u{a909}',
-        SC_Numeric), ('\u{a90a}', '\u{a925}', SC_OLetter), ('\u{a926}', '\u{a92d}', SC_Extend),
-        ('\u{a92f}', '\u{a92f}', SC_STerm), ('\u{a930}', '\u{a946}', SC_OLetter), ('\u{a947}',
-        '\u{a953}', SC_Extend), ('\u{a960}', '\u{a97c}', SC_OLetter), ('\u{a980}', '\u{a983}',
-        SC_Extend), ('\u{a984}', '\u{a9b2}', SC_OLetter), ('\u{a9b3}', '\u{a9c0}', SC_Extend),
-        ('\u{a9c8}', '\u{a9c9}', SC_STerm), ('\u{a9cf}', '\u{a9cf}', SC_OLetter), ('\u{a9d0}',
-        '\u{a9d9}', SC_Numeric), ('\u{a9e0}', '\u{a9e4}', SC_OLetter), ('\u{a9e5}', '\u{a9e5}',
-        SC_Extend), ('\u{a9e6}', '\u{a9ef}', SC_OLetter), ('\u{a9f0}', '\u{a9f9}', SC_Numeric),
-        ('\u{a9fa}', '\u{a9fe}', SC_OLetter), ('\u{aa00}', '\u{aa28}', SC_OLetter), ('\u{aa29}',
-        '\u{aa36}', SC_Extend), ('\u{aa40}', '\u{aa42}', SC_OLetter), ('\u{aa43}', '\u{aa43}',
-        SC_Extend), ('\u{aa44}', '\u{aa4b}', SC_OLetter), ('\u{aa4c}', '\u{aa4d}', SC_Extend),
-        ('\u{aa50}', '\u{aa59}', SC_Numeric), ('\u{aa5d}', '\u{aa5f}', SC_STerm), ('\u{aa60}',
-        '\u{aa76}', SC_OLetter), ('\u{aa7a}', '\u{aa7a}', SC_OLetter), ('\u{aa7b}', '\u{aa7d}',
-        SC_Extend), ('\u{aa7e}', '\u{aaaf}', SC_OLetter), ('\u{aab0}', '\u{aab0}', SC_Extend),
-        ('\u{aab1}', '\u{aab1}', SC_OLetter), ('\u{aab2}', '\u{aab4}', SC_Extend), ('\u{aab5}',
-        '\u{aab6}', SC_OLetter), ('\u{aab7}', '\u{aab8}', SC_Extend), ('\u{aab9}', '\u{aabd}',
-        SC_OLetter), ('\u{aabe}', '\u{aabf}', SC_Extend), ('\u{aac0}', '\u{aac0}', SC_OLetter),
-        ('\u{aac1}', '\u{aac1}', SC_Extend), ('\u{aac2}', '\u{aac2}', SC_OLetter), ('\u{aadb}',
-        '\u{aadd}', SC_OLetter), ('\u{aae0}', '\u{aaea}', SC_OLetter), ('\u{aaeb}', '\u{aaef}',
-        SC_Extend), ('\u{aaf0}', '\u{aaf1}', SC_STerm), ('\u{aaf2}', '\u{aaf4}', SC_OLetter),
-        ('\u{aaf5}', '\u{aaf6}', SC_Extend), ('\u{ab01}', '\u{ab06}', SC_OLetter), ('\u{ab09}',
-        '\u{ab0e}', SC_OLetter), ('\u{ab11}', '\u{ab16}', SC_OLetter), ('\u{ab20}', '\u{ab26}',
-        SC_OLetter), ('\u{ab28}', '\u{ab2e}', SC_OLetter), ('\u{ab30}', '\u{ab5a}', SC_Lower),
-        ('\u{ab5c}', '\u{ab69}', SC_Lower), ('\u{ab70}', '\u{abbf}', SC_Lower), ('\u{abc0}',
-        '\u{abe2}', SC_OLetter), ('\u{abe3}', '\u{abea}', SC_Extend), ('\u{abeb}', '\u{abeb}',
-        SC_STerm), ('\u{abec}', '\u{abed}', SC_Extend), ('\u{abf0}', '\u{abf9}', SC_Numeric),
-        ('\u{ac00}', '\u{d7a3}', SC_OLetter), ('\u{d7b0}', '\u{d7c6}', SC_OLetter), ('\u{d7cb}',
-        '\u{d7fb}', SC_OLetter), ('\u{f900}', '\u{fa6d}', SC_OLetter), ('\u{fa70}', '\u{fad9}',
-        SC_OLetter), ('\u{fb00}', '\u{fb06}', SC_Lower), ('\u{fb13}', '\u{fb17}', SC_Lower),
-        ('\u{fb1d}', '\u{fb1d}', SC_OLetter), ('\u{fb1e}', '\u{fb1e}', SC_Extend), ('\u{fb1f}',
-        '\u{fb28}', SC_OLetter), ('\u{fb2a}', '\u{fb36}', SC_OLetter), ('\u{fb38}', '\u{fb3c}',
-        SC_OLetter), ('\u{fb3e}', '\u{fb3e}', SC_OLetter), ('\u{fb40}', '\u{fb41}', SC_OLetter),
-        ('\u{fb43}', '\u{fb44}', SC_OLetter), ('\u{fb46}', '\u{fbb1}', SC_OLetter), ('\u{fbd3}',
-        '\u{fd3d}', SC_OLetter), ('\u{fd3e}', '\u{fd3f}', SC_Close), ('\u{fd50}', '\u{fd8f}',
-        SC_OLetter), ('\u{fd92}', '\u{fdc7}', SC_OLetter), ('\u{fdf0}', '\u{fdfb}', SC_OLetter),
-        ('\u{fe00}', '\u{fe0f}', SC_Extend), ('\u{fe10}', '\u{fe11}', SC_SContinue), ('\u{fe13}',
-        '\u{fe13}', SC_SContinue), ('\u{fe17}', '\u{fe18}', SC_Close), ('\u{fe20}', '\u{fe2f}',
-        SC_Extend), ('\u{fe31}', '\u{fe32}', SC_SContinue), ('\u{fe35}', '\u{fe44}', SC_Close),
-        ('\u{fe47}', '\u{fe48}', SC_Close), ('\u{fe50}', '\u{fe51}', SC_SContinue), ('\u{fe52}',
-        '\u{fe52}', SC_ATerm), ('\u{fe55}', '\u{fe55}', SC_SContinue), ('\u{fe56}', '\u{fe57}',
-        SC_STerm), ('\u{fe58}', '\u{fe58}', SC_SContinue), ('\u{fe59}', '\u{fe5e}', SC_Close),
-        ('\u{fe63}', '\u{fe63}', SC_SContinue), ('\u{fe70}', '\u{fe74}', SC_OLetter), ('\u{fe76}',
-        '\u{fefc}', SC_OLetter), ('\u{feff}', '\u{feff}', SC_Format), ('\u{ff01}', '\u{ff01}',
-        SC_STerm), ('\u{ff08}', '\u{ff09}', SC_Close), ('\u{ff0c}', '\u{ff0d}', SC_SContinue),
-        ('\u{ff0e}', '\u{ff0e}', SC_ATerm), ('\u{ff10}', '\u{ff19}', SC_Numeric), ('\u{ff1a}',
-        '\u{ff1a}', SC_SContinue), ('\u{ff1f}', '\u{ff1f}', SC_STerm), ('\u{ff21}', '\u{ff3a}',
-        SC_Upper), ('\u{ff3b}', '\u{ff3b}', SC_Close), ('\u{ff3d}', '\u{ff3d}', SC_Close),
-        ('\u{ff41}', '\u{ff5a}', SC_Lower), ('\u{ff5b}', '\u{ff5b}', SC_Close), ('\u{ff5d}',
-        '\u{ff5d}', SC_Close), ('\u{ff5f}', '\u{ff60}', SC_Close), ('\u{ff61}', '\u{ff61}',
-        SC_STerm), ('\u{ff62}', '\u{ff63}', SC_Close), ('\u{ff64}', '\u{ff64}', SC_SContinue),
-        ('\u{ff66}', '\u{ff9d}', SC_OLetter), ('\u{ff9e}', '\u{ff9f}', SC_Extend), ('\u{ffa0}',
-        '\u{ffbe}', SC_OLetter), ('\u{ffc2}', '\u{ffc7}', SC_OLetter), ('\u{ffca}', '\u{ffcf}',
-        SC_OLetter), ('\u{ffd2}', '\u{ffd7}', SC_OLetter), ('\u{ffda}', '\u{ffdc}', SC_OLetter),
-        ('\u{fff9}', '\u{fffb}', SC_Format), ('\u{10000}', '\u{1000b}', SC_OLetter), ('\u{1000d}',
-        '\u{10026}', SC_OLetter), ('\u{10028}', '\u{1003a}', SC_OLetter), ('\u{1003c}', '\u{1003d}',
-        SC_OLetter), ('\u{1003f}', '\u{1004d}', SC_OLetter), ('\u{10050}', '\u{1005d}', SC_OLetter),
-        ('\u{10080}', '\u{100fa}', SC_OLetter), ('\u{10140}', '\u{10174}', SC_OLetter),
-        ('\u{101fd}', '\u{101fd}', SC_Extend), ('\u{10280}', '\u{1029c}', SC_OLetter), ('\u{102a0}',
-        '\u{102d0}', SC_OLetter), ('\u{102e0}', '\u{102e0}', SC_Extend), ('\u{10300}', '\u{1031f}',
-        SC_OLetter), ('\u{1032d}', '\u{1034a}', SC_OLetter), ('\u{10350}', '\u{10375}', SC_OLetter),
-        ('\u{10376}', '\u{1037a}', SC_Extend), ('\u{10380}', '\u{1039d}', SC_OLetter), ('\u{103a0}',
-        '\u{103c3}', SC_OLetter), ('\u{103c8}', '\u{103cf}', SC_OLetter), ('\u{103d1}', '\u{103d5}',
-        SC_OLetter), ('\u{10400}', '\u{10427}', SC_Upper), ('\u{10428}', '\u{1044f}', SC_Lower),
-        ('\u{10450}', '\u{1049d}', SC_OLetter), ('\u{104a0}', '\u{104a9}', SC_Numeric),
-        ('\u{104b0}', '\u{104d3}', SC_Upper), ('\u{104d8}', '\u{104fb}', SC_Lower), ('\u{10500}',
-        '\u{10527}', SC_OLetter), ('\u{10530}', '\u{10563}', SC_OLetter), ('\u{10570}', '\u{1057a}',
-        SC_Upper), ('\u{1057c}', '\u{1058a}', SC_Upper), ('\u{1058c}', '\u{10592}', SC_Upper),
-        ('\u{10594}', '\u{10595}', SC_Upper), ('\u{10597}', '\u{105a1}', SC_Lower), ('\u{105a3}',
-        '\u{105b1}', SC_Lower), ('\u{105b3}', '\u{105b9}', SC_Lower), ('\u{105bb}', '\u{105bc}',
-        SC_Lower), ('\u{10600}', '\u{10736}', SC_OLetter), ('\u{10740}', '\u{10755}', SC_OLetter),
-        ('\u{10760}', '\u{10767}', SC_OLetter), ('\u{10780}', '\u{10780}', SC_Lower), ('\u{10781}',
-        '\u{10782}', SC_OLetter), ('\u{10783}', '\u{10785}', SC_Lower), ('\u{10787}', '\u{107b0}',
-        SC_Lower), ('\u{107b2}', '\u{107ba}', SC_Lower), ('\u{10800}', '\u{10805}', SC_OLetter),
-        ('\u{10808}', '\u{10808}', SC_OLetter), ('\u{1080a}', '\u{10835}', SC_OLetter),
-        ('\u{10837}', '\u{10838}', SC_OLetter), ('\u{1083c}', '\u{1083c}', SC_OLetter),
-        ('\u{1083f}', '\u{10855}', SC_OLetter), ('\u{10860}', '\u{10876}', SC_OLetter),
-        ('\u{10880}', '\u{1089e}', SC_OLetter), ('\u{108e0}', '\u{108f2}', SC_OLetter),
-        ('\u{108f4}', '\u{108f5}', SC_OLetter), ('\u{10900}', '\u{10915}', SC_OLetter),
-        ('\u{10920}', '\u{10939}', SC_OLetter), ('\u{10980}', '\u{109b7}', SC_OLetter),
-        ('\u{109be}', '\u{109bf}', SC_OLetter), ('\u{10a00}', '\u{10a00}', SC_OLetter),
-        ('\u{10a01}', '\u{10a03}', SC_Extend), ('\u{10a05}', '\u{10a06}', SC_Extend), ('\u{10a0c}',
-        '\u{10a0f}', SC_Extend), ('\u{10a10}', '\u{10a13}', SC_OLetter), ('\u{10a15}', '\u{10a17}',
-        SC_OLetter), ('\u{10a19}', '\u{10a35}', SC_OLetter), ('\u{10a38}', '\u{10a3a}', SC_Extend),
-        ('\u{10a3f}', '\u{10a3f}', SC_Extend), ('\u{10a56}', '\u{10a57}', SC_STerm), ('\u{10a60}',
-        '\u{10a7c}', SC_OLetter), ('\u{10a80}', '\u{10a9c}', SC_OLetter), ('\u{10ac0}', '\u{10ac7}',
-        SC_OLetter), ('\u{10ac9}', '\u{10ae4}', SC_OLetter), ('\u{10ae5}', '\u{10ae6}', SC_Extend),
-        ('\u{10b00}', '\u{10b35}', SC_OLetter), ('\u{10b40}', '\u{10b55}', SC_OLetter),
-        ('\u{10b60}', '\u{10b72}', SC_OLetter), ('\u{10b80}', '\u{10b91}', SC_OLetter),
-        ('\u{10c00}', '\u{10c48}', SC_OLetter), ('\u{10c80}', '\u{10cb2}', SC_Upper), ('\u{10cc0}',
-        '\u{10cf2}', SC_Lower), ('\u{10d00}', '\u{10d23}', SC_OLetter), ('\u{10d24}', '\u{10d27}',
-        SC_Extend), ('\u{10d30}', '\u{10d39}', SC_Numeric), ('\u{10e80}', '\u{10ea9}', SC_OLetter),
-        ('\u{10eab}', '\u{10eac}', SC_Extend), ('\u{10eb0}', '\u{10eb1}', SC_OLetter), ('\u{10efd}',
-        '\u{10eff}', SC_Extend), ('\u{10f00}', '\u{10f1c}', SC_OLetter), ('\u{10f27}', '\u{10f27}',
-        SC_OLetter), ('\u{10f30}', '\u{10f45}', SC_OLetter), ('\u{10f46}', '\u{10f50}', SC_Extend),
-        ('\u{10f55}', '\u{10f59}', SC_STerm), ('\u{10f70}', '\u{10f81}', SC_OLetter), ('\u{10f82}',
-        '\u{10f85}', SC_Extend), ('\u{10f86}', '\u{10f89}', SC_STerm), ('\u{10fb0}', '\u{10fc4}',
-        SC_OLetter), ('\u{10fe0}', '\u{10ff6}', SC_OLetter), ('\u{11000}', '\u{11002}', SC_Extend),
-        ('\u{11003}', '\u{11037}', SC_OLetter), ('\u{11038}', '\u{11046}', SC_Extend), ('\u{11047}',
-        '\u{11048}', SC_STerm), ('\u{11066}', '\u{1106f}', SC_Numeric), ('\u{11070}', '\u{11070}',
-        SC_Extend), ('\u{11071}', '\u{11072}', SC_OLetter), ('\u{11073}', '\u{11074}', SC_Extend),
-        ('\u{11075}', '\u{11075}', SC_OLetter), ('\u{1107f}', '\u{11082}', SC_Extend), ('\u{11083}',
-        '\u{110af}', SC_OLetter), ('\u{110b0}', '\u{110ba}', SC_Extend), ('\u{110bd}', '\u{110bd}',
-        SC_Format), ('\u{110be}', '\u{110c1}', SC_STerm), ('\u{110c2}', '\u{110c2}', SC_Extend),
-        ('\u{110cd}', '\u{110cd}', SC_Format), ('\u{110d0}', '\u{110e8}', SC_OLetter), ('\u{110f0}',
-        '\u{110f9}', SC_Numeric), ('\u{11100}', '\u{11102}', SC_Extend), ('\u{11103}', '\u{11126}',
-        SC_OLetter), ('\u{11127}', '\u{11134}', SC_Extend), ('\u{11136}', '\u{1113f}', SC_Numeric),
-        ('\u{11141}', '\u{11143}', SC_STerm), ('\u{11144}', '\u{11144}', SC_OLetter), ('\u{11145}',
-        '\u{11146}', SC_Extend), ('\u{11147}', '\u{11147}', SC_OLetter), ('\u{11150}', '\u{11172}',
-        SC_OLetter), ('\u{11173}', '\u{11173}', SC_Extend), ('\u{11176}', '\u{11176}', SC_OLetter),
-        ('\u{11180}', '\u{11182}', SC_Extend), ('\u{11183}', '\u{111b2}', SC_OLetter), ('\u{111b3}',
-        '\u{111c0}', SC_Extend), ('\u{111c1}', '\u{111c4}', SC_OLetter), ('\u{111c5}', '\u{111c6}',
-        SC_STerm), ('\u{111c9}', '\u{111cc}', SC_Extend), ('\u{111cd}', '\u{111cd}', SC_STerm),
-        ('\u{111ce}', '\u{111cf}', SC_Extend), ('\u{111d0}', '\u{111d9}', SC_Numeric), ('\u{111da}',
-        '\u{111da}', SC_OLetter), ('\u{111dc}', '\u{111dc}', SC_OLetter), ('\u{111de}', '\u{111df}',
-        SC_STerm), ('\u{11200}', '\u{11211}', SC_OLetter), ('\u{11213}', '\u{1122b}', SC_OLetter),
-        ('\u{1122c}', '\u{11237}', SC_Extend), ('\u{11238}', '\u{11239}', SC_STerm), ('\u{1123b}',
-        '\u{1123c}', SC_STerm), ('\u{1123e}', '\u{1123e}', SC_Extend), ('\u{1123f}', '\u{11240}',
-        SC_OLetter), ('\u{11241}', '\u{11241}', SC_Extend), ('\u{11280}', '\u{11286}', SC_OLetter),
-        ('\u{11288}', '\u{11288}', SC_OLetter), ('\u{1128a}', '\u{1128d}', SC_OLetter),
-        ('\u{1128f}', '\u{1129d}', SC_OLetter), ('\u{1129f}', '\u{112a8}', SC_OLetter),
+        SC_Lower), ('\u{2cf9}', '\u{2cfb}', SC_STerm), ('\u{2d00}', '\u{2d25}', SC_Lower),
+        ('\u{2d27}', '\u{2d27}', SC_Lower), ('\u{2d2d}', '\u{2d2d}', SC_Lower), ('\u{2d30}',
+        '\u{2d67}', SC_OLetter), ('\u{2d6f}', '\u{2d6f}', SC_OLetter), ('\u{2d7f}', '\u{2d7f}',
+        SC_Extend), ('\u{2d80}', '\u{2d96}', SC_OLetter), ('\u{2da0}', '\u{2da6}', SC_OLetter),
+        ('\u{2da8}', '\u{2dae}', SC_OLetter), ('\u{2db0}', '\u{2db6}', SC_OLetter), ('\u{2db8}',
+        '\u{2dbe}', SC_OLetter), ('\u{2dc0}', '\u{2dc6}', SC_OLetter), ('\u{2dc8}', '\u{2dce}',
+        SC_OLetter), ('\u{2dd0}', '\u{2dd6}', SC_OLetter), ('\u{2dd8}', '\u{2dde}', SC_OLetter),
+        ('\u{2de0}', '\u{2dff}', SC_Extend), ('\u{2e00}', '\u{2e0d}', SC_Close), ('\u{2e1c}',
+        '\u{2e1d}', SC_Close), ('\u{2e20}', '\u{2e29}', SC_Close), ('\u{2e2e}', '\u{2e2e}',
+        SC_STerm), ('\u{2e2f}', '\u{2e2f}', SC_OLetter), ('\u{2e3c}', '\u{2e3c}', SC_STerm),
+        ('\u{2e42}', '\u{2e42}', SC_Close), ('\u{2e53}', '\u{2e54}', SC_STerm), ('\u{2e55}',
+        '\u{2e5c}', SC_Close), ('\u{3000}', '\u{3000}', SC_Sp), ('\u{3001}', '\u{3001}',
+        SC_SContinue), ('\u{3002}', '\u{3002}', SC_STerm), ('\u{3005}', '\u{3007}', SC_OLetter),
+        ('\u{3008}', '\u{3011}', SC_Close), ('\u{3014}', '\u{301b}', SC_Close), ('\u{301d}',
+        '\u{301f}', SC_Close), ('\u{3021}', '\u{3029}', SC_OLetter), ('\u{302a}', '\u{302f}',
+        SC_Extend), ('\u{3031}', '\u{3035}', SC_OLetter), ('\u{3038}', '\u{303c}', SC_OLetter),
+        ('\u{3041}', '\u{3096}', SC_OLetter), ('\u{3099}', '\u{309a}', SC_Extend), ('\u{309d}',
+        '\u{309f}', SC_OLetter), ('\u{30a1}', '\u{30fa}', SC_OLetter), ('\u{30fc}', '\u{30ff}',
+        SC_OLetter), ('\u{3105}', '\u{312f}', SC_OLetter), ('\u{3131}', '\u{318e}', SC_OLetter),
+        ('\u{31a0}', '\u{31bf}', SC_OLetter), ('\u{31f0}', '\u{31ff}', SC_OLetter), ('\u{3400}',
+        '\u{4dbf}', SC_OLetter), ('\u{4e00}', '\u{a48c}', SC_OLetter), ('\u{a4d0}', '\u{a4fd}',
+        SC_OLetter), ('\u{a4ff}', '\u{a4ff}', SC_STerm), ('\u{a500}', '\u{a60c}', SC_OLetter),
+        ('\u{a60e}', '\u{a60f}', SC_STerm), ('\u{a610}', '\u{a61f}', SC_OLetter), ('\u{a620}',
+        '\u{a629}', SC_Numeric), ('\u{a62a}', '\u{a62b}', SC_OLetter), ('\u{a640}', '\u{a640}',
+        SC_Upper), ('\u{a641}', '\u{a641}', SC_Lower), ('\u{a642}', '\u{a642}', SC_Upper),
+        ('\u{a643}', '\u{a643}', SC_Lower), ('\u{a644}', '\u{a644}', SC_Upper), ('\u{a645}',
+        '\u{a645}', SC_Lower), ('\u{a646}', '\u{a646}', SC_Upper), ('\u{a647}', '\u{a647}',
+        SC_Lower), ('\u{a648}', '\u{a648}', SC_Upper), ('\u{a649}', '\u{a649}', SC_Lower),
+        ('\u{a64a}', '\u{a64a}', SC_Upper), ('\u{a64b}', '\u{a64b}', SC_Lower), ('\u{a64c}',
+        '\u{a64c}', SC_Upper), ('\u{a64d}', '\u{a64d}', SC_Lower), ('\u{a64e}', '\u{a64e}',
+        SC_Upper), ('\u{a64f}', '\u{a64f}', SC_Lower), ('\u{a650}', '\u{a650}', SC_Upper),
+        ('\u{a651}', '\u{a651}', SC_Lower), ('\u{a652}', '\u{a652}', SC_Upper), ('\u{a653}',
+        '\u{a653}', SC_Lower), ('\u{a654}', '\u{a654}', SC_Upper), ('\u{a655}', '\u{a655}',
+        SC_Lower), ('\u{a656}', '\u{a656}', SC_Upper), ('\u{a657}', '\u{a657}', SC_Lower),
+        ('\u{a658}', '\u{a658}', SC_Upper), ('\u{a659}', '\u{a659}', SC_Lower), ('\u{a65a}',
+        '\u{a65a}', SC_Upper), ('\u{a65b}', '\u{a65b}', SC_Lower), ('\u{a65c}', '\u{a65c}',
+        SC_Upper), ('\u{a65d}', '\u{a65d}', SC_Lower), ('\u{a65e}', '\u{a65e}', SC_Upper),
+        ('\u{a65f}', '\u{a65f}', SC_Lower), ('\u{a660}', '\u{a660}', SC_Upper), ('\u{a661}',
+        '\u{a661}', SC_Lower), ('\u{a662}', '\u{a662}', SC_Upper), ('\u{a663}', '\u{a663}',
+        SC_Lower), ('\u{a664}', '\u{a664}', SC_Upper), ('\u{a665}', '\u{a665}', SC_Lower),
+        ('\u{a666}', '\u{a666}', SC_Upper), ('\u{a667}', '\u{a667}', SC_Lower), ('\u{a668}',
+        '\u{a668}', SC_Upper), ('\u{a669}', '\u{a669}', SC_Lower), ('\u{a66a}', '\u{a66a}',
+        SC_Upper), ('\u{a66b}', '\u{a66b}', SC_Lower), ('\u{a66c}', '\u{a66c}', SC_Upper),
+        ('\u{a66d}', '\u{a66d}', SC_Lower), ('\u{a66e}', '\u{a66e}', SC_OLetter), ('\u{a66f}',
+        '\u{a672}', SC_Extend), ('\u{a674}', '\u{a67d}', SC_Extend), ('\u{a67f}', '\u{a67f}',
+        SC_OLetter), ('\u{a680}', '\u{a680}', SC_Upper), ('\u{a681}', '\u{a681}', SC_Lower),
+        ('\u{a682}', '\u{a682}', SC_Upper), ('\u{a683}', '\u{a683}', SC_Lower), ('\u{a684}',
+        '\u{a684}', SC_Upper), ('\u{a685}', '\u{a685}', SC_Lower), ('\u{a686}', '\u{a686}',
+        SC_Upper), ('\u{a687}', '\u{a687}', SC_Lower), ('\u{a688}', '\u{a688}', SC_Upper),
+        ('\u{a689}', '\u{a689}', SC_Lower), ('\u{a68a}', '\u{a68a}', SC_Upper), ('\u{a68b}',
+        '\u{a68b}', SC_Lower), ('\u{a68c}', '\u{a68c}', SC_Upper), ('\u{a68d}', '\u{a68d}',
+        SC_Lower), ('\u{a68e}', '\u{a68e}', SC_Upper), ('\u{a68f}', '\u{a68f}', SC_Lower),
+        ('\u{a690}', '\u{a690}', SC_Upper), ('\u{a691}', '\u{a691}', SC_Lower), ('\u{a692}',
+        '\u{a692}', SC_Upper), ('\u{a693}', '\u{a693}', SC_Lower), ('\u{a694}', '\u{a694}',
+        SC_Upper), ('\u{a695}', '\u{a695}', SC_Lower), ('\u{a696}', '\u{a696}', SC_Upper),
+        ('\u{a697}', '\u{a697}', SC_Lower), ('\u{a698}', '\u{a698}', SC_Upper), ('\u{a699}',
+        '\u{a699}', SC_Lower), ('\u{a69a}', '\u{a69a}', SC_Upper), ('\u{a69b}', '\u{a69d}',
+        SC_Lower), ('\u{a69e}', '\u{a69f}', SC_Extend), ('\u{a6a0}', '\u{a6ef}', SC_OLetter),
+        ('\u{a6f0}', '\u{a6f1}', SC_Extend), ('\u{a6f3}', '\u{a6f3}', SC_STerm), ('\u{a6f7}',
+        '\u{a6f7}', SC_STerm), ('\u{a717}', '\u{a71f}', SC_OLetter), ('\u{a722}', '\u{a722}',
+        SC_Upper), ('\u{a723}', '\u{a723}', SC_Lower), ('\u{a724}', '\u{a724}', SC_Upper),
+        ('\u{a725}', '\u{a725}', SC_Lower), ('\u{a726}', '\u{a726}', SC_Upper), ('\u{a727}',
+        '\u{a727}', SC_Lower), ('\u{a728}', '\u{a728}', SC_Upper), ('\u{a729}', '\u{a729}',
+        SC_Lower), ('\u{a72a}', '\u{a72a}', SC_Upper), ('\u{a72b}', '\u{a72b}', SC_Lower),
+        ('\u{a72c}', '\u{a72c}', SC_Upper), ('\u{a72d}', '\u{a72d}', SC_Lower), ('\u{a72e}',
+        '\u{a72e}', SC_Upper), ('\u{a72f}', '\u{a731}', SC_Lower), ('\u{a732}', '\u{a732}',
+        SC_Upper), ('\u{a733}', '\u{a733}', SC_Lower), ('\u{a734}', '\u{a734}', SC_Upper),
+        ('\u{a735}', '\u{a735}', SC_Lower), ('\u{a736}', '\u{a736}', SC_Upper), ('\u{a737}',
+        '\u{a737}', SC_Lower), ('\u{a738}', '\u{a738}', SC_Upper), ('\u{a739}', '\u{a739}',
+        SC_Lower), ('\u{a73a}', '\u{a73a}', SC_Upper), ('\u{a73b}', '\u{a73b}', SC_Lower),
+        ('\u{a73c}', '\u{a73c}', SC_Upper), ('\u{a73d}', '\u{a73d}', SC_Lower), ('\u{a73e}',
+        '\u{a73e}', SC_Upper), ('\u{a73f}', '\u{a73f}', SC_Lower), ('\u{a740}', '\u{a740}',
+        SC_Upper), ('\u{a741}', '\u{a741}', SC_Lower), ('\u{a742}', '\u{a742}', SC_Upper),
+        ('\u{a743}', '\u{a743}', SC_Lower), ('\u{a744}', '\u{a744}', SC_Upper), ('\u{a745}',
+        '\u{a745}', SC_Lower), ('\u{a746}', '\u{a746}', SC_Upper), ('\u{a747}', '\u{a747}',
+        SC_Lower), ('\u{a748}', '\u{a748}', SC_Upper), ('\u{a749}', '\u{a749}', SC_Lower),
+        ('\u{a74a}', '\u{a74a}', SC_Upper), ('\u{a74b}', '\u{a74b}', SC_Lower), ('\u{a74c}',
+        '\u{a74c}', SC_Upper), ('\u{a74d}', '\u{a74d}', SC_Lower), ('\u{a74e}', '\u{a74e}',
+        SC_Upper), ('\u{a74f}', '\u{a74f}', SC_Lower), ('\u{a750}', '\u{a750}', SC_Upper),
+        ('\u{a751}', '\u{a751}', SC_Lower), ('\u{a752}', '\u{a752}', SC_Upper), ('\u{a753}',
+        '\u{a753}', SC_Lower), ('\u{a754}', '\u{a754}', SC_Upper), ('\u{a755}', '\u{a755}',
+        SC_Lower), ('\u{a756}', '\u{a756}', SC_Upper), ('\u{a757}', '\u{a757}', SC_Lower),
+        ('\u{a758}', '\u{a758}', SC_Upper), ('\u{a759}', '\u{a759}', SC_Lower), ('\u{a75a}',
+        '\u{a75a}', SC_Upper), ('\u{a75b}', '\u{a75b}', SC_Lower), ('\u{a75c}', '\u{a75c}',
+        SC_Upper), ('\u{a75d}', '\u{a75d}', SC_Lower), ('\u{a75e}', '\u{a75e}', SC_Upper),
+        ('\u{a75f}', '\u{a75f}', SC_Lower), ('\u{a760}', '\u{a760}', SC_Upper), ('\u{a761}',
+        '\u{a761}', SC_Lower), ('\u{a762}', '\u{a762}', SC_Upper), ('\u{a763}', '\u{a763}',
+        SC_Lower), ('\u{a764}', '\u{a764}', SC_Upper), ('\u{a765}', '\u{a765}', SC_Lower),
+        ('\u{a766}', '\u{a766}', SC_Upper), ('\u{a767}', '\u{a767}', SC_Lower), ('\u{a768}',
+        '\u{a768}', SC_Upper), ('\u{a769}', '\u{a769}', SC_Lower), ('\u{a76a}', '\u{a76a}',
+        SC_Upper), ('\u{a76b}', '\u{a76b}', SC_Lower), ('\u{a76c}', '\u{a76c}', SC_Upper),
+        ('\u{a76d}', '\u{a76d}', SC_Lower), ('\u{a76e}', '\u{a76e}', SC_Upper), ('\u{a76f}',
+        '\u{a778}', SC_Lower), ('\u{a779}', '\u{a779}', SC_Upper), ('\u{a77a}', '\u{a77a}',
+        SC_Lower), ('\u{a77b}', '\u{a77b}', SC_Upper), ('\u{a77c}', '\u{a77c}', SC_Lower),
+        ('\u{a77d}', '\u{a77e}', SC_Upper), ('\u{a77f}', '\u{a77f}', SC_Lower), ('\u{a780}',
+        '\u{a780}', SC_Upper), ('\u{a781}', '\u{a781}', SC_Lower), ('\u{a782}', '\u{a782}',
+        SC_Upper), ('\u{a783}', '\u{a783}', SC_Lower), ('\u{a784}', '\u{a784}', SC_Upper),
+        ('\u{a785}', '\u{a785}', SC_Lower), ('\u{a786}', '\u{a786}', SC_Upper), ('\u{a787}',
+        '\u{a787}', SC_Lower), ('\u{a788}', '\u{a788}', SC_OLetter), ('\u{a78b}', '\u{a78b}',
+        SC_Upper), ('\u{a78c}', '\u{a78c}', SC_Lower), ('\u{a78d}', '\u{a78d}', SC_Upper),
+        ('\u{a78e}', '\u{a78e}', SC_Lower), ('\u{a78f}', '\u{a78f}', SC_OLetter), ('\u{a790}',
+        '\u{a790}', SC_Upper), ('\u{a791}', '\u{a791}', SC_Lower), ('\u{a792}', '\u{a792}',
+        SC_Upper), ('\u{a793}', '\u{a795}', SC_Lower), ('\u{a796}', '\u{a796}', SC_Upper),
+        ('\u{a797}', '\u{a797}', SC_Lower), ('\u{a798}', '\u{a798}', SC_Upper), ('\u{a799}',
+        '\u{a799}', SC_Lower), ('\u{a79a}', '\u{a79a}', SC_Upper), ('\u{a79b}', '\u{a79b}',
+        SC_Lower), ('\u{a79c}', '\u{a79c}', SC_Upper), ('\u{a79d}', '\u{a79d}', SC_Lower),
+        ('\u{a79e}', '\u{a79e}', SC_Upper), ('\u{a79f}', '\u{a79f}', SC_Lower), ('\u{a7a0}',
+        '\u{a7a0}', SC_Upper), ('\u{a7a1}', '\u{a7a1}', SC_Lower), ('\u{a7a2}', '\u{a7a2}',
+        SC_Upper), ('\u{a7a3}', '\u{a7a3}', SC_Lower), ('\u{a7a4}', '\u{a7a4}', SC_Upper),
+        ('\u{a7a5}', '\u{a7a5}', SC_Lower), ('\u{a7a6}', '\u{a7a6}', SC_Upper), ('\u{a7a7}',
+        '\u{a7a7}', SC_Lower), ('\u{a7a8}', '\u{a7a8}', SC_Upper), ('\u{a7a9}', '\u{a7a9}',
+        SC_Lower), ('\u{a7aa}', '\u{a7ae}', SC_Upper), ('\u{a7af}', '\u{a7af}', SC_Lower),
+        ('\u{a7b0}', '\u{a7b4}', SC_Upper), ('\u{a7b5}', '\u{a7b5}', SC_Lower), ('\u{a7b6}',
+        '\u{a7b6}', SC_Upper), ('\u{a7b7}', '\u{a7b7}', SC_Lower), ('\u{a7b8}', '\u{a7b8}',
+        SC_Upper), ('\u{a7b9}', '\u{a7b9}', SC_Lower), ('\u{a7ba}', '\u{a7ba}', SC_Upper),
+        ('\u{a7bb}', '\u{a7bb}', SC_Lower), ('\u{a7bc}', '\u{a7bc}', SC_Upper), ('\u{a7bd}',
+        '\u{a7bd}', SC_Lower), ('\u{a7be}', '\u{a7be}', SC_Upper), ('\u{a7bf}', '\u{a7bf}',
+        SC_Lower), ('\u{a7c0}', '\u{a7c0}', SC_Upper), ('\u{a7c1}', '\u{a7c1}', SC_Lower),
+        ('\u{a7c2}', '\u{a7c2}', SC_Upper), ('\u{a7c3}', '\u{a7c3}', SC_Lower), ('\u{a7c4}',
+        '\u{a7c7}', SC_Upper), ('\u{a7c8}', '\u{a7c8}', SC_Lower), ('\u{a7c9}', '\u{a7c9}',
+        SC_Upper), ('\u{a7ca}', '\u{a7ca}', SC_Lower), ('\u{a7cb}', '\u{a7cc}', SC_Upper),
+        ('\u{a7cd}', '\u{a7cd}', SC_Lower), ('\u{a7d0}', '\u{a7d0}', SC_Upper), ('\u{a7d1}',
+        '\u{a7d1}', SC_Lower), ('\u{a7d3}', '\u{a7d3}', SC_Lower), ('\u{a7d5}', '\u{a7d5}',
+        SC_Lower), ('\u{a7d6}', '\u{a7d6}', SC_Upper), ('\u{a7d7}', '\u{a7d7}', SC_Lower),
+        ('\u{a7d8}', '\u{a7d8}', SC_Upper), ('\u{a7d9}', '\u{a7d9}', SC_Lower), ('\u{a7da}',
+        '\u{a7da}', SC_Upper), ('\u{a7db}', '\u{a7db}', SC_Lower), ('\u{a7dc}', '\u{a7dc}',
+        SC_Upper), ('\u{a7f2}', '\u{a7f4}', SC_Lower), ('\u{a7f5}', '\u{a7f5}', SC_Upper),
+        ('\u{a7f6}', '\u{a7f6}', SC_Lower), ('\u{a7f7}', '\u{a7f7}', SC_OLetter), ('\u{a7f8}',
+        '\u{a7fa}', SC_Lower), ('\u{a7fb}', '\u{a801}', SC_OLetter), ('\u{a802}', '\u{a802}',
+        SC_Extend), ('\u{a803}', '\u{a805}', SC_OLetter), ('\u{a806}', '\u{a806}', SC_Extend),
+        ('\u{a807}', '\u{a80a}', SC_OLetter), ('\u{a80b}', '\u{a80b}', SC_Extend), ('\u{a80c}',
+        '\u{a822}', SC_OLetter), ('\u{a823}', '\u{a827}', SC_Extend), ('\u{a82c}', '\u{a82c}',
+        SC_Extend), ('\u{a840}', '\u{a873}', SC_OLetter), ('\u{a876}', '\u{a877}', SC_STerm),
+        ('\u{a880}', '\u{a881}', SC_Extend), ('\u{a882}', '\u{a8b3}', SC_OLetter), ('\u{a8b4}',
+        '\u{a8c5}', SC_Extend), ('\u{a8ce}', '\u{a8cf}', SC_STerm), ('\u{a8d0}', '\u{a8d9}',
+        SC_Numeric), ('\u{a8e0}', '\u{a8f1}', SC_Extend), ('\u{a8f2}', '\u{a8f7}', SC_OLetter),
+        ('\u{a8fb}', '\u{a8fb}', SC_OLetter), ('\u{a8fd}', '\u{a8fe}', SC_OLetter), ('\u{a8ff}',
+        '\u{a8ff}', SC_Extend), ('\u{a900}', '\u{a909}', SC_Numeric), ('\u{a90a}', '\u{a925}',
+        SC_OLetter), ('\u{a926}', '\u{a92d}', SC_Extend), ('\u{a92f}', '\u{a92f}', SC_STerm),
+        ('\u{a930}', '\u{a946}', SC_OLetter), ('\u{a947}', '\u{a953}', SC_Extend), ('\u{a960}',
+        '\u{a97c}', SC_OLetter), ('\u{a980}', '\u{a983}', SC_Extend), ('\u{a984}', '\u{a9b2}',
+        SC_OLetter), ('\u{a9b3}', '\u{a9c0}', SC_Extend), ('\u{a9c8}', '\u{a9c9}', SC_STerm),
+        ('\u{a9cf}', '\u{a9cf}', SC_OLetter), ('\u{a9d0}', '\u{a9d9}', SC_Numeric), ('\u{a9e0}',
+        '\u{a9e4}', SC_OLetter), ('\u{a9e5}', '\u{a9e5}', SC_Extend), ('\u{a9e6}', '\u{a9ef}',
+        SC_OLetter), ('\u{a9f0}', '\u{a9f9}', SC_Numeric), ('\u{a9fa}', '\u{a9fe}', SC_OLetter),
+        ('\u{aa00}', '\u{aa28}', SC_OLetter), ('\u{aa29}', '\u{aa36}', SC_Extend), ('\u{aa40}',
+        '\u{aa42}', SC_OLetter), ('\u{aa43}', '\u{aa43}', SC_Extend), ('\u{aa44}', '\u{aa4b}',
+        SC_OLetter), ('\u{aa4c}', '\u{aa4d}', SC_Extend), ('\u{aa50}', '\u{aa59}', SC_Numeric),
+        ('\u{aa5d}', '\u{aa5f}', SC_STerm), ('\u{aa60}', '\u{aa76}', SC_OLetter), ('\u{aa7a}',
+        '\u{aa7a}', SC_OLetter), ('\u{aa7b}', '\u{aa7d}', SC_Extend), ('\u{aa7e}', '\u{aaaf}',
+        SC_OLetter), ('\u{aab0}', '\u{aab0}', SC_Extend), ('\u{aab1}', '\u{aab1}', SC_OLetter),
+        ('\u{aab2}', '\u{aab4}', SC_Extend), ('\u{aab5}', '\u{aab6}', SC_OLetter), ('\u{aab7}',
+        '\u{aab8}', SC_Extend), ('\u{aab9}', '\u{aabd}', SC_OLetter), ('\u{aabe}', '\u{aabf}',
+        SC_Extend), ('\u{aac0}', '\u{aac0}', SC_OLetter), ('\u{aac1}', '\u{aac1}', SC_Extend),
+        ('\u{aac2}', '\u{aac2}', SC_OLetter), ('\u{aadb}', '\u{aadd}', SC_OLetter), ('\u{aae0}',
+        '\u{aaea}', SC_OLetter), ('\u{aaeb}', '\u{aaef}', SC_Extend), ('\u{aaf0}', '\u{aaf1}',
+        SC_STerm), ('\u{aaf2}', '\u{aaf4}', SC_OLetter), ('\u{aaf5}', '\u{aaf6}', SC_Extend),
+        ('\u{ab01}', '\u{ab06}', SC_OLetter), ('\u{ab09}', '\u{ab0e}', SC_OLetter), ('\u{ab11}',
+        '\u{ab16}', SC_OLetter), ('\u{ab20}', '\u{ab26}', SC_OLetter), ('\u{ab28}', '\u{ab2e}',
+        SC_OLetter), ('\u{ab30}', '\u{ab5a}', SC_Lower), ('\u{ab5c}', '\u{ab69}', SC_Lower),
+        ('\u{ab70}', '\u{abbf}', SC_Lower), ('\u{abc0}', '\u{abe2}', SC_OLetter), ('\u{abe3}',
+        '\u{abea}', SC_Extend), ('\u{abeb}', '\u{abeb}', SC_STerm), ('\u{abec}', '\u{abed}',
+        SC_Extend), ('\u{abf0}', '\u{abf9}', SC_Numeric), ('\u{ac00}', '\u{d7a3}', SC_OLetter),
+        ('\u{d7b0}', '\u{d7c6}', SC_OLetter), ('\u{d7cb}', '\u{d7fb}', SC_OLetter), ('\u{f900}',
+        '\u{fa6d}', SC_OLetter), ('\u{fa70}', '\u{fad9}', SC_OLetter), ('\u{fb00}', '\u{fb06}',
+        SC_Lower), ('\u{fb13}', '\u{fb17}', SC_Lower), ('\u{fb1d}', '\u{fb1d}', SC_OLetter),
+        ('\u{fb1e}', '\u{fb1e}', SC_Extend), ('\u{fb1f}', '\u{fb28}', SC_OLetter), ('\u{fb2a}',
+        '\u{fb36}', SC_OLetter), ('\u{fb38}', '\u{fb3c}', SC_OLetter), ('\u{fb3e}', '\u{fb3e}',
+        SC_OLetter), ('\u{fb40}', '\u{fb41}', SC_OLetter), ('\u{fb43}', '\u{fb44}', SC_OLetter),
+        ('\u{fb46}', '\u{fbb1}', SC_OLetter), ('\u{fbd3}', '\u{fd3d}', SC_OLetter), ('\u{fd3e}',
+        '\u{fd3f}', SC_Close), ('\u{fd50}', '\u{fd8f}', SC_OLetter), ('\u{fd92}', '\u{fdc7}',
+        SC_OLetter), ('\u{fdf0}', '\u{fdfb}', SC_OLetter), ('\u{fe00}', '\u{fe0f}', SC_Extend),
+        ('\u{fe10}', '\u{fe11}', SC_SContinue), ('\u{fe12}', '\u{fe12}', SC_STerm), ('\u{fe13}',
+        '\u{fe14}', SC_SContinue), ('\u{fe15}', '\u{fe16}', SC_STerm), ('\u{fe17}', '\u{fe18}',
+        SC_Close), ('\u{fe20}', '\u{fe2f}', SC_Extend), ('\u{fe31}', '\u{fe32}', SC_SContinue),
+        ('\u{fe35}', '\u{fe44}', SC_Close), ('\u{fe47}', '\u{fe48}', SC_Close), ('\u{fe50}',
+        '\u{fe51}', SC_SContinue), ('\u{fe52}', '\u{fe52}', SC_ATerm), ('\u{fe54}', '\u{fe55}',
+        SC_SContinue), ('\u{fe56}', '\u{fe57}', SC_STerm), ('\u{fe58}', '\u{fe58}', SC_SContinue),
+        ('\u{fe59}', '\u{fe5e}', SC_Close), ('\u{fe63}', '\u{fe63}', SC_SContinue), ('\u{fe70}',
+        '\u{fe74}', SC_OLetter), ('\u{fe76}', '\u{fefc}', SC_OLetter), ('\u{feff}', '\u{feff}',
+        SC_Format), ('\u{ff01}', '\u{ff01}', SC_STerm), ('\u{ff08}', '\u{ff09}', SC_Close),
+        ('\u{ff0c}', '\u{ff0d}', SC_SContinue), ('\u{ff0e}', '\u{ff0e}', SC_ATerm), ('\u{ff10}',
+        '\u{ff19}', SC_Numeric), ('\u{ff1a}', '\u{ff1b}', SC_SContinue), ('\u{ff1f}', '\u{ff1f}',
+        SC_STerm), ('\u{ff21}', '\u{ff3a}', SC_Upper), ('\u{ff3b}', '\u{ff3b}', SC_Close),
+        ('\u{ff3d}', '\u{ff3d}', SC_Close), ('\u{ff41}', '\u{ff5a}', SC_Lower), ('\u{ff5b}',
+        '\u{ff5b}', SC_Close), ('\u{ff5d}', '\u{ff5d}', SC_Close), ('\u{ff5f}', '\u{ff60}',
+        SC_Close), ('\u{ff61}', '\u{ff61}', SC_STerm), ('\u{ff62}', '\u{ff63}', SC_Close),
+        ('\u{ff64}', '\u{ff64}', SC_SContinue), ('\u{ff66}', '\u{ff9d}', SC_OLetter), ('\u{ff9e}',
+        '\u{ff9f}', SC_Extend), ('\u{ffa0}', '\u{ffbe}', SC_OLetter), ('\u{ffc2}', '\u{ffc7}',
+        SC_OLetter), ('\u{ffca}', '\u{ffcf}', SC_OLetter), ('\u{ffd2}', '\u{ffd7}', SC_OLetter),
+        ('\u{ffda}', '\u{ffdc}', SC_OLetter), ('\u{fff9}', '\u{fffb}', SC_Format), ('\u{10000}',
+        '\u{1000b}', SC_OLetter), ('\u{1000d}', '\u{10026}', SC_OLetter), ('\u{10028}', '\u{1003a}',
+        SC_OLetter), ('\u{1003c}', '\u{1003d}', SC_OLetter), ('\u{1003f}', '\u{1004d}', SC_OLetter),
+        ('\u{10050}', '\u{1005d}', SC_OLetter), ('\u{10080}', '\u{100fa}', SC_OLetter),
+        ('\u{10140}', '\u{10174}', SC_OLetter), ('\u{101fd}', '\u{101fd}', SC_Extend), ('\u{10280}',
+        '\u{1029c}', SC_OLetter), ('\u{102a0}', '\u{102d0}', SC_OLetter), ('\u{102e0}', '\u{102e0}',
+        SC_Extend), ('\u{10300}', '\u{1031f}', SC_OLetter), ('\u{1032d}', '\u{1034a}', SC_OLetter),
+        ('\u{10350}', '\u{10375}', SC_OLetter), ('\u{10376}', '\u{1037a}', SC_Extend), ('\u{10380}',
+        '\u{1039d}', SC_OLetter), ('\u{103a0}', '\u{103c3}', SC_OLetter), ('\u{103c8}', '\u{103cf}',
+        SC_OLetter), ('\u{103d1}', '\u{103d5}', SC_OLetter), ('\u{10400}', '\u{10427}', SC_Upper),
+        ('\u{10428}', '\u{1044f}', SC_Lower), ('\u{10450}', '\u{1049d}', SC_OLetter), ('\u{104a0}',
+        '\u{104a9}', SC_Numeric), ('\u{104b0}', '\u{104d3}', SC_Upper), ('\u{104d8}', '\u{104fb}',
+        SC_Lower), ('\u{10500}', '\u{10527}', SC_OLetter), ('\u{10530}', '\u{10563}', SC_OLetter),
+        ('\u{10570}', '\u{1057a}', SC_Upper), ('\u{1057c}', '\u{1058a}', SC_Upper), ('\u{1058c}',
+        '\u{10592}', SC_Upper), ('\u{10594}', '\u{10595}', SC_Upper), ('\u{10597}', '\u{105a1}',
+        SC_Lower), ('\u{105a3}', '\u{105b1}', SC_Lower), ('\u{105b3}', '\u{105b9}', SC_Lower),
+        ('\u{105bb}', '\u{105bc}', SC_Lower), ('\u{105c0}', '\u{105f3}', SC_OLetter), ('\u{10600}',
+        '\u{10736}', SC_OLetter), ('\u{10740}', '\u{10755}', SC_OLetter), ('\u{10760}', '\u{10767}',
+        SC_OLetter), ('\u{10780}', '\u{10780}', SC_Lower), ('\u{10781}', '\u{10782}', SC_OLetter),
+        ('\u{10783}', '\u{10785}', SC_Lower), ('\u{10787}', '\u{107b0}', SC_Lower), ('\u{107b2}',
+        '\u{107ba}', SC_Lower), ('\u{10800}', '\u{10805}', SC_OLetter), ('\u{10808}', '\u{10808}',
+        SC_OLetter), ('\u{1080a}', '\u{10835}', SC_OLetter), ('\u{10837}', '\u{10838}', SC_OLetter),
+        ('\u{1083c}', '\u{1083c}', SC_OLetter), ('\u{1083f}', '\u{10855}', SC_OLetter),
+        ('\u{10860}', '\u{10876}', SC_OLetter), ('\u{10880}', '\u{1089e}', SC_OLetter),
+        ('\u{108e0}', '\u{108f2}', SC_OLetter), ('\u{108f4}', '\u{108f5}', SC_OLetter),
+        ('\u{10900}', '\u{10915}', SC_OLetter), ('\u{10920}', '\u{10939}', SC_OLetter),
+        ('\u{10980}', '\u{109b7}', SC_OLetter), ('\u{109be}', '\u{109bf}', SC_OLetter),
+        ('\u{10a00}', '\u{10a00}', SC_OLetter), ('\u{10a01}', '\u{10a03}', SC_Extend), ('\u{10a05}',
+        '\u{10a06}', SC_Extend), ('\u{10a0c}', '\u{10a0f}', SC_Extend), ('\u{10a10}', '\u{10a13}',
+        SC_OLetter), ('\u{10a15}', '\u{10a17}', SC_OLetter), ('\u{10a19}', '\u{10a35}', SC_OLetter),
+        ('\u{10a38}', '\u{10a3a}', SC_Extend), ('\u{10a3f}', '\u{10a3f}', SC_Extend), ('\u{10a56}',
+        '\u{10a57}', SC_STerm), ('\u{10a60}', '\u{10a7c}', SC_OLetter), ('\u{10a80}', '\u{10a9c}',
+        SC_OLetter), ('\u{10ac0}', '\u{10ac7}', SC_OLetter), ('\u{10ac9}', '\u{10ae4}', SC_OLetter),
+        ('\u{10ae5}', '\u{10ae6}', SC_Extend), ('\u{10b00}', '\u{10b35}', SC_OLetter), ('\u{10b40}',
+        '\u{10b55}', SC_OLetter), ('\u{10b60}', '\u{10b72}', SC_OLetter), ('\u{10b80}', '\u{10b91}',
+        SC_OLetter), ('\u{10c00}', '\u{10c48}', SC_OLetter), ('\u{10c80}', '\u{10cb2}', SC_Upper),
+        ('\u{10cc0}', '\u{10cf2}', SC_Lower), ('\u{10d00}', '\u{10d23}', SC_OLetter), ('\u{10d24}',
+        '\u{10d27}', SC_Extend), ('\u{10d30}', '\u{10d39}', SC_Numeric), ('\u{10d40}', '\u{10d49}',
+        SC_Numeric), ('\u{10d4a}', '\u{10d4f}', SC_OLetter), ('\u{10d50}', '\u{10d65}', SC_Upper),
+        ('\u{10d69}', '\u{10d6d}', SC_Extend), ('\u{10d6f}', '\u{10d6f}', SC_OLetter), ('\u{10d70}',
+        '\u{10d85}', SC_Lower), ('\u{10e80}', '\u{10ea9}', SC_OLetter), ('\u{10eab}', '\u{10eac}',
+        SC_Extend), ('\u{10eb0}', '\u{10eb1}', SC_OLetter), ('\u{10ec2}', '\u{10ec4}', SC_OLetter),
+        ('\u{10efc}', '\u{10eff}', SC_Extend), ('\u{10f00}', '\u{10f1c}', SC_OLetter), ('\u{10f27}',
+        '\u{10f27}', SC_OLetter), ('\u{10f30}', '\u{10f45}', SC_OLetter), ('\u{10f46}', '\u{10f50}',
+        SC_Extend), ('\u{10f55}', '\u{10f59}', SC_STerm), ('\u{10f70}', '\u{10f81}', SC_OLetter),
+        ('\u{10f82}', '\u{10f85}', SC_Extend), ('\u{10f86}', '\u{10f89}', SC_STerm), ('\u{10fb0}',
+        '\u{10fc4}', SC_OLetter), ('\u{10fe0}', '\u{10ff6}', SC_OLetter), ('\u{11000}', '\u{11002}',
+        SC_Extend), ('\u{11003}', '\u{11037}', SC_OLetter), ('\u{11038}', '\u{11046}', SC_Extend),
+        ('\u{11047}', '\u{11048}', SC_STerm), ('\u{11066}', '\u{1106f}', SC_Numeric), ('\u{11070}',
+        '\u{11070}', SC_Extend), ('\u{11071}', '\u{11072}', SC_OLetter), ('\u{11073}', '\u{11074}',
+        SC_Extend), ('\u{11075}', '\u{11075}', SC_OLetter), ('\u{1107f}', '\u{11082}', SC_Extend),
+        ('\u{11083}', '\u{110af}', SC_OLetter), ('\u{110b0}', '\u{110ba}', SC_Extend), ('\u{110bd}',
+        '\u{110bd}', SC_Numeric), ('\u{110be}', '\u{110c1}', SC_STerm), ('\u{110c2}', '\u{110c2}',
+        SC_Extend), ('\u{110cd}', '\u{110cd}', SC_Numeric), ('\u{110d0}', '\u{110e8}', SC_OLetter),
+        ('\u{110f0}', '\u{110f9}', SC_Numeric), ('\u{11100}', '\u{11102}', SC_Extend), ('\u{11103}',
+        '\u{11126}', SC_OLetter), ('\u{11127}', '\u{11134}', SC_Extend), ('\u{11136}', '\u{1113f}',
+        SC_Numeric), ('\u{11141}', '\u{11143}', SC_STerm), ('\u{11144}', '\u{11144}', SC_OLetter),
+        ('\u{11145}', '\u{11146}', SC_Extend), ('\u{11147}', '\u{11147}', SC_OLetter), ('\u{11150}',
+        '\u{11172}', SC_OLetter), ('\u{11173}', '\u{11173}', SC_Extend), ('\u{11176}', '\u{11176}',
+        SC_OLetter), ('\u{11180}', '\u{11182}', SC_Extend), ('\u{11183}', '\u{111b2}', SC_OLetter),
+        ('\u{111b3}', '\u{111c0}', SC_Extend), ('\u{111c1}', '\u{111c4}', SC_OLetter), ('\u{111c5}',
+        '\u{111c6}', SC_STerm), ('\u{111c9}', '\u{111cc}', SC_Extend), ('\u{111cd}', '\u{111cd}',
+        SC_STerm), ('\u{111ce}', '\u{111cf}', SC_Extend), ('\u{111d0}', '\u{111d9}', SC_Numeric),
+        ('\u{111da}', '\u{111da}', SC_OLetter), ('\u{111dc}', '\u{111dc}', SC_OLetter),
+        ('\u{111de}', '\u{111df}', SC_STerm), ('\u{11200}', '\u{11211}', SC_OLetter), ('\u{11213}',
+        '\u{1122b}', SC_OLetter), ('\u{1122c}', '\u{11237}', SC_Extend), ('\u{11238}', '\u{11239}',
+        SC_STerm), ('\u{1123b}', '\u{1123c}', SC_STerm), ('\u{1123e}', '\u{1123e}', SC_Extend),
+        ('\u{1123f}', '\u{11240}', SC_OLetter), ('\u{11241}', '\u{11241}', SC_Extend), ('\u{11280}',
+        '\u{11286}', SC_OLetter), ('\u{11288}', '\u{11288}', SC_OLetter), ('\u{1128a}', '\u{1128d}',
+        SC_OLetter), ('\u{1128f}', '\u{1129d}', SC_OLetter), ('\u{1129f}', '\u{112a8}', SC_OLetter),
         ('\u{112a9}', '\u{112a9}', SC_STerm), ('\u{112b0}', '\u{112de}', SC_OLetter), ('\u{112df}',
         '\u{112ea}', SC_Extend), ('\u{112f0}', '\u{112f9}', SC_Numeric), ('\u{11300}', '\u{11303}',
         SC_Extend), ('\u{11305}', '\u{1130c}', SC_OLetter), ('\u{1130f}', '\u{11310}', SC_OLetter),
@@ -2835,19 +3018,26 @@
         '\u{11344}', SC_Extend), ('\u{11347}', '\u{11348}', SC_Extend), ('\u{1134b}', '\u{1134d}',
         SC_Extend), ('\u{11350}', '\u{11350}', SC_OLetter), ('\u{11357}', '\u{11357}', SC_Extend),
         ('\u{1135d}', '\u{11361}', SC_OLetter), ('\u{11362}', '\u{11363}', SC_Extend), ('\u{11366}',
-        '\u{1136c}', SC_Extend), ('\u{11370}', '\u{11374}', SC_Extend), ('\u{11400}', '\u{11434}',
-        SC_OLetter), ('\u{11435}', '\u{11446}', SC_Extend), ('\u{11447}', '\u{1144a}', SC_OLetter),
-        ('\u{1144b}', '\u{1144c}', SC_STerm), ('\u{11450}', '\u{11459}', SC_Numeric), ('\u{1145e}',
-        '\u{1145e}', SC_Extend), ('\u{1145f}', '\u{11461}', SC_OLetter), ('\u{11480}', '\u{114af}',
-        SC_OLetter), ('\u{114b0}', '\u{114c3}', SC_Extend), ('\u{114c4}', '\u{114c5}', SC_OLetter),
-        ('\u{114c7}', '\u{114c7}', SC_OLetter), ('\u{114d0}', '\u{114d9}', SC_Numeric),
-        ('\u{11580}', '\u{115ae}', SC_OLetter), ('\u{115af}', '\u{115b5}', SC_Extend), ('\u{115b8}',
-        '\u{115c0}', SC_Extend), ('\u{115c2}', '\u{115c3}', SC_STerm), ('\u{115c9}', '\u{115d7}',
-        SC_STerm), ('\u{115d8}', '\u{115db}', SC_OLetter), ('\u{115dc}', '\u{115dd}', SC_Extend),
-        ('\u{11600}', '\u{1162f}', SC_OLetter), ('\u{11630}', '\u{11640}', SC_Extend), ('\u{11641}',
-        '\u{11642}', SC_STerm), ('\u{11644}', '\u{11644}', SC_OLetter), ('\u{11650}', '\u{11659}',
-        SC_Numeric), ('\u{11680}', '\u{116aa}', SC_OLetter), ('\u{116ab}', '\u{116b7}', SC_Extend),
-        ('\u{116b8}', '\u{116b8}', SC_OLetter), ('\u{116c0}', '\u{116c9}', SC_Numeric),
+        '\u{1136c}', SC_Extend), ('\u{11370}', '\u{11374}', SC_Extend), ('\u{11380}', '\u{11389}',
+        SC_OLetter), ('\u{1138b}', '\u{1138b}', SC_OLetter), ('\u{1138e}', '\u{1138e}', SC_OLetter),
+        ('\u{11390}', '\u{113b5}', SC_OLetter), ('\u{113b7}', '\u{113b7}', SC_OLetter),
+        ('\u{113b8}', '\u{113c0}', SC_Extend), ('\u{113c2}', '\u{113c2}', SC_Extend), ('\u{113c5}',
+        '\u{113c5}', SC_Extend), ('\u{113c7}', '\u{113ca}', SC_Extend), ('\u{113cc}', '\u{113d0}',
+        SC_Extend), ('\u{113d1}', '\u{113d1}', SC_OLetter), ('\u{113d2}', '\u{113d2}', SC_Extend),
+        ('\u{113d3}', '\u{113d3}', SC_OLetter), ('\u{113d4}', '\u{113d5}', SC_STerm), ('\u{113e1}',
+        '\u{113e2}', SC_Extend), ('\u{11400}', '\u{11434}', SC_OLetter), ('\u{11435}', '\u{11446}',
+        SC_Extend), ('\u{11447}', '\u{1144a}', SC_OLetter), ('\u{1144b}', '\u{1144c}', SC_STerm),
+        ('\u{11450}', '\u{11459}', SC_Numeric), ('\u{1145e}', '\u{1145e}', SC_Extend), ('\u{1145f}',
+        '\u{11461}', SC_OLetter), ('\u{11480}', '\u{114af}', SC_OLetter), ('\u{114b0}', '\u{114c3}',
+        SC_Extend), ('\u{114c4}', '\u{114c5}', SC_OLetter), ('\u{114c7}', '\u{114c7}', SC_OLetter),
+        ('\u{114d0}', '\u{114d9}', SC_Numeric), ('\u{11580}', '\u{115ae}', SC_OLetter),
+        ('\u{115af}', '\u{115b5}', SC_Extend), ('\u{115b8}', '\u{115c0}', SC_Extend), ('\u{115c2}',
+        '\u{115c3}', SC_STerm), ('\u{115c9}', '\u{115d7}', SC_STerm), ('\u{115d8}', '\u{115db}',
+        SC_OLetter), ('\u{115dc}', '\u{115dd}', SC_Extend), ('\u{11600}', '\u{1162f}', SC_OLetter),
+        ('\u{11630}', '\u{11640}', SC_Extend), ('\u{11641}', '\u{11642}', SC_STerm), ('\u{11644}',
+        '\u{11644}', SC_OLetter), ('\u{11650}', '\u{11659}', SC_Numeric), ('\u{11680}', '\u{116aa}',
+        SC_OLetter), ('\u{116ab}', '\u{116b7}', SC_Extend), ('\u{116b8}', '\u{116b8}', SC_OLetter),
+        ('\u{116c0}', '\u{116c9}', SC_Numeric), ('\u{116d0}', '\u{116e3}', SC_Numeric),
         ('\u{11700}', '\u{1171a}', SC_OLetter), ('\u{1171d}', '\u{1172b}', SC_Extend), ('\u{11730}',
         '\u{11739}', SC_Numeric), ('\u{1173c}', '\u{1173e}', SC_STerm), ('\u{11740}', '\u{11746}',
         SC_OLetter), ('\u{11800}', '\u{1182b}', SC_OLetter), ('\u{1182c}', '\u{1183a}', SC_Extend),
@@ -2868,7 +3058,8 @@
         SC_Extend), ('\u{11a50}', '\u{11a50}', SC_OLetter), ('\u{11a51}', '\u{11a5b}', SC_Extend),
         ('\u{11a5c}', '\u{11a89}', SC_OLetter), ('\u{11a8a}', '\u{11a99}', SC_Extend), ('\u{11a9b}',
         '\u{11a9c}', SC_STerm), ('\u{11a9d}', '\u{11a9d}', SC_OLetter), ('\u{11ab0}', '\u{11af8}',
-        SC_OLetter), ('\u{11c00}', '\u{11c08}', SC_OLetter), ('\u{11c0a}', '\u{11c2e}', SC_OLetter),
+        SC_OLetter), ('\u{11bc0}', '\u{11be0}', SC_OLetter), ('\u{11bf0}', '\u{11bf9}', SC_Numeric),
+        ('\u{11c00}', '\u{11c08}', SC_OLetter), ('\u{11c0a}', '\u{11c2e}', SC_OLetter),
         ('\u{11c2f}', '\u{11c36}', SC_Extend), ('\u{11c38}', '\u{11c3f}', SC_Extend), ('\u{11c40}',
         '\u{11c40}', SC_OLetter), ('\u{11c41}', '\u{11c42}', SC_STerm), ('\u{11c50}', '\u{11c59}',
         SC_Numeric), ('\u{11c72}', '\u{11c8f}', SC_OLetter), ('\u{11c92}', '\u{11ca7}', SC_Extend),
@@ -2885,102 +3076,108 @@
         '\u{11f02}', SC_OLetter), ('\u{11f03}', '\u{11f03}', SC_Extend), ('\u{11f04}', '\u{11f10}',
         SC_OLetter), ('\u{11f12}', '\u{11f33}', SC_OLetter), ('\u{11f34}', '\u{11f3a}', SC_Extend),
         ('\u{11f3e}', '\u{11f42}', SC_Extend), ('\u{11f43}', '\u{11f44}', SC_STerm), ('\u{11f50}',
-        '\u{11f59}', SC_Numeric), ('\u{11fb0}', '\u{11fb0}', SC_OLetter), ('\u{12000}', '\u{12399}',
-        SC_OLetter), ('\u{12400}', '\u{1246e}', SC_OLetter), ('\u{12480}', '\u{12543}', SC_OLetter),
-        ('\u{12f90}', '\u{12ff0}', SC_OLetter), ('\u{13000}', '\u{1342f}', SC_OLetter),
-        ('\u{13430}', '\u{1343f}', SC_Format), ('\u{13440}', '\u{13440}', SC_Extend), ('\u{13441}',
-        '\u{13446}', SC_OLetter), ('\u{13447}', '\u{13455}', SC_Extend), ('\u{14400}', '\u{14646}',
-        SC_OLetter), ('\u{16800}', '\u{16a38}', SC_OLetter), ('\u{16a40}', '\u{16a5e}', SC_OLetter),
-        ('\u{16a60}', '\u{16a69}', SC_Numeric), ('\u{16a6e}', '\u{16a6f}', SC_STerm), ('\u{16a70}',
-        '\u{16abe}', SC_OLetter), ('\u{16ac0}', '\u{16ac9}', SC_Numeric), ('\u{16ad0}', '\u{16aed}',
-        SC_OLetter), ('\u{16af0}', '\u{16af4}', SC_Extend), ('\u{16af5}', '\u{16af5}', SC_STerm),
-        ('\u{16b00}', '\u{16b2f}', SC_OLetter), ('\u{16b30}', '\u{16b36}', SC_Extend), ('\u{16b37}',
-        '\u{16b38}', SC_STerm), ('\u{16b40}', '\u{16b43}', SC_OLetter), ('\u{16b44}', '\u{16b44}',
-        SC_STerm), ('\u{16b50}', '\u{16b59}', SC_Numeric), ('\u{16b63}', '\u{16b77}', SC_OLetter),
-        ('\u{16b7d}', '\u{16b8f}', SC_OLetter), ('\u{16e40}', '\u{16e5f}', SC_Upper), ('\u{16e60}',
-        '\u{16e7f}', SC_Lower), ('\u{16e98}', '\u{16e98}', SC_STerm), ('\u{16f00}', '\u{16f4a}',
-        SC_OLetter), ('\u{16f4f}', '\u{16f4f}', SC_Extend), ('\u{16f50}', '\u{16f50}', SC_OLetter),
-        ('\u{16f51}', '\u{16f87}', SC_Extend), ('\u{16f8f}', '\u{16f92}', SC_Extend), ('\u{16f93}',
-        '\u{16f9f}', SC_OLetter), ('\u{16fe0}', '\u{16fe1}', SC_OLetter), ('\u{16fe3}', '\u{16fe3}',
-        SC_OLetter), ('\u{16fe4}', '\u{16fe4}', SC_Extend), ('\u{16ff0}', '\u{16ff1}', SC_Extend),
-        ('\u{17000}', '\u{187f7}', SC_OLetter), ('\u{18800}', '\u{18cd5}', SC_OLetter),
-        ('\u{18d00}', '\u{18d08}', SC_OLetter), ('\u{1aff0}', '\u{1aff3}', SC_OLetter),
-        ('\u{1aff5}', '\u{1affb}', SC_OLetter), ('\u{1affd}', '\u{1affe}', SC_OLetter),
-        ('\u{1b000}', '\u{1b122}', SC_OLetter), ('\u{1b132}', '\u{1b132}', SC_OLetter),
-        ('\u{1b150}', '\u{1b152}', SC_OLetter), ('\u{1b155}', '\u{1b155}', SC_OLetter),
-        ('\u{1b164}', '\u{1b167}', SC_OLetter), ('\u{1b170}', '\u{1b2fb}', SC_OLetter),
-        ('\u{1bc00}', '\u{1bc6a}', SC_OLetter), ('\u{1bc70}', '\u{1bc7c}', SC_OLetter),
-        ('\u{1bc80}', '\u{1bc88}', SC_OLetter), ('\u{1bc90}', '\u{1bc99}', SC_OLetter),
-        ('\u{1bc9d}', '\u{1bc9e}', SC_Extend), ('\u{1bc9f}', '\u{1bc9f}', SC_STerm), ('\u{1bca0}',
-        '\u{1bca3}', SC_Format), ('\u{1cf00}', '\u{1cf2d}', SC_Extend), ('\u{1cf30}', '\u{1cf46}',
-        SC_Extend), ('\u{1d165}', '\u{1d169}', SC_Extend), ('\u{1d16d}', '\u{1d172}', SC_Extend),
-        ('\u{1d173}', '\u{1d17a}', SC_Format), ('\u{1d17b}', '\u{1d182}', SC_Extend), ('\u{1d185}',
-        '\u{1d18b}', SC_Extend), ('\u{1d1aa}', '\u{1d1ad}', SC_Extend), ('\u{1d242}', '\u{1d244}',
-        SC_Extend), ('\u{1d400}', '\u{1d419}', SC_Upper), ('\u{1d41a}', '\u{1d433}', SC_Lower),
-        ('\u{1d434}', '\u{1d44d}', SC_Upper), ('\u{1d44e}', '\u{1d454}', SC_Lower), ('\u{1d456}',
-        '\u{1d467}', SC_Lower), ('\u{1d468}', '\u{1d481}', SC_Upper), ('\u{1d482}', '\u{1d49b}',
-        SC_Lower), ('\u{1d49c}', '\u{1d49c}', SC_Upper), ('\u{1d49e}', '\u{1d49f}', SC_Upper),
-        ('\u{1d4a2}', '\u{1d4a2}', SC_Upper), ('\u{1d4a5}', '\u{1d4a6}', SC_Upper), ('\u{1d4a9}',
-        '\u{1d4ac}', SC_Upper), ('\u{1d4ae}', '\u{1d4b5}', SC_Upper), ('\u{1d4b6}', '\u{1d4b9}',
-        SC_Lower), ('\u{1d4bb}', '\u{1d4bb}', SC_Lower), ('\u{1d4bd}', '\u{1d4c3}', SC_Lower),
-        ('\u{1d4c5}', '\u{1d4cf}', SC_Lower), ('\u{1d4d0}', '\u{1d4e9}', SC_Upper), ('\u{1d4ea}',
-        '\u{1d503}', SC_Lower), ('\u{1d504}', '\u{1d505}', SC_Upper), ('\u{1d507}', '\u{1d50a}',
-        SC_Upper), ('\u{1d50d}', '\u{1d514}', SC_Upper), ('\u{1d516}', '\u{1d51c}', SC_Upper),
-        ('\u{1d51e}', '\u{1d537}', SC_Lower), ('\u{1d538}', '\u{1d539}', SC_Upper), ('\u{1d53b}',
-        '\u{1d53e}', SC_Upper), ('\u{1d540}', '\u{1d544}', SC_Upper), ('\u{1d546}', '\u{1d546}',
-        SC_Upper), ('\u{1d54a}', '\u{1d550}', SC_Upper), ('\u{1d552}', '\u{1d56b}', SC_Lower),
-        ('\u{1d56c}', '\u{1d585}', SC_Upper), ('\u{1d586}', '\u{1d59f}', SC_Lower), ('\u{1d5a0}',
-        '\u{1d5b9}', SC_Upper), ('\u{1d5ba}', '\u{1d5d3}', SC_Lower), ('\u{1d5d4}', '\u{1d5ed}',
-        SC_Upper), ('\u{1d5ee}', '\u{1d607}', SC_Lower), ('\u{1d608}', '\u{1d621}', SC_Upper),
-        ('\u{1d622}', '\u{1d63b}', SC_Lower), ('\u{1d63c}', '\u{1d655}', SC_Upper), ('\u{1d656}',
-        '\u{1d66f}', SC_Lower), ('\u{1d670}', '\u{1d689}', SC_Upper), ('\u{1d68a}', '\u{1d6a5}',
-        SC_Lower), ('\u{1d6a8}', '\u{1d6c0}', SC_Upper), ('\u{1d6c2}', '\u{1d6da}', SC_Lower),
-        ('\u{1d6dc}', '\u{1d6e1}', SC_Lower), ('\u{1d6e2}', '\u{1d6fa}', SC_Upper), ('\u{1d6fc}',
-        '\u{1d714}', SC_Lower), ('\u{1d716}', '\u{1d71b}', SC_Lower), ('\u{1d71c}', '\u{1d734}',
-        SC_Upper), ('\u{1d736}', '\u{1d74e}', SC_Lower), ('\u{1d750}', '\u{1d755}', SC_Lower),
-        ('\u{1d756}', '\u{1d76e}', SC_Upper), ('\u{1d770}', '\u{1d788}', SC_Lower), ('\u{1d78a}',
-        '\u{1d78f}', SC_Lower), ('\u{1d790}', '\u{1d7a8}', SC_Upper), ('\u{1d7aa}', '\u{1d7c2}',
-        SC_Lower), ('\u{1d7c4}', '\u{1d7c9}', SC_Lower), ('\u{1d7ca}', '\u{1d7ca}', SC_Upper),
-        ('\u{1d7cb}', '\u{1d7cb}', SC_Lower), ('\u{1d7ce}', '\u{1d7ff}', SC_Numeric), ('\u{1da00}',
-        '\u{1da36}', SC_Extend), ('\u{1da3b}', '\u{1da6c}', SC_Extend), ('\u{1da75}', '\u{1da75}',
-        SC_Extend), ('\u{1da84}', '\u{1da84}', SC_Extend), ('\u{1da88}', '\u{1da88}', SC_STerm),
-        ('\u{1da9b}', '\u{1da9f}', SC_Extend), ('\u{1daa1}', '\u{1daaf}', SC_Extend), ('\u{1df00}',
-        '\u{1df09}', SC_Lower), ('\u{1df0a}', '\u{1df0a}', SC_OLetter), ('\u{1df0b}', '\u{1df1e}',
-        SC_Lower), ('\u{1df25}', '\u{1df2a}', SC_Lower), ('\u{1e000}', '\u{1e006}', SC_Extend),
-        ('\u{1e008}', '\u{1e018}', SC_Extend), ('\u{1e01b}', '\u{1e021}', SC_Extend), ('\u{1e023}',
-        '\u{1e024}', SC_Extend), ('\u{1e026}', '\u{1e02a}', SC_Extend), ('\u{1e030}', '\u{1e06d}',
-        SC_Lower), ('\u{1e08f}', '\u{1e08f}', SC_Extend), ('\u{1e100}', '\u{1e12c}', SC_OLetter),
-        ('\u{1e130}', '\u{1e136}', SC_Extend), ('\u{1e137}', '\u{1e13d}', SC_OLetter), ('\u{1e140}',
-        '\u{1e149}', SC_Numeric), ('\u{1e14e}', '\u{1e14e}', SC_OLetter), ('\u{1e290}', '\u{1e2ad}',
-        SC_OLetter), ('\u{1e2ae}', '\u{1e2ae}', SC_Extend), ('\u{1e2c0}', '\u{1e2eb}', SC_OLetter),
-        ('\u{1e2ec}', '\u{1e2ef}', SC_Extend), ('\u{1e2f0}', '\u{1e2f9}', SC_Numeric), ('\u{1e4d0}',
-        '\u{1e4eb}', SC_OLetter), ('\u{1e4ec}', '\u{1e4ef}', SC_Extend), ('\u{1e4f0}', '\u{1e4f9}',
-        SC_Numeric), ('\u{1e7e0}', '\u{1e7e6}', SC_OLetter), ('\u{1e7e8}', '\u{1e7eb}', SC_OLetter),
-        ('\u{1e7ed}', '\u{1e7ee}', SC_OLetter), ('\u{1e7f0}', '\u{1e7fe}', SC_OLetter),
-        ('\u{1e800}', '\u{1e8c4}', SC_OLetter), ('\u{1e8d0}', '\u{1e8d6}', SC_Extend), ('\u{1e900}',
-        '\u{1e921}', SC_Upper), ('\u{1e922}', '\u{1e943}', SC_Lower), ('\u{1e944}', '\u{1e94a}',
-        SC_Extend), ('\u{1e94b}', '\u{1e94b}', SC_OLetter), ('\u{1e950}', '\u{1e959}', SC_Numeric),
-        ('\u{1ee00}', '\u{1ee03}', SC_OLetter), ('\u{1ee05}', '\u{1ee1f}', SC_OLetter),
-        ('\u{1ee21}', '\u{1ee22}', SC_OLetter), ('\u{1ee24}', '\u{1ee24}', SC_OLetter),
-        ('\u{1ee27}', '\u{1ee27}', SC_OLetter), ('\u{1ee29}', '\u{1ee32}', SC_OLetter),
-        ('\u{1ee34}', '\u{1ee37}', SC_OLetter), ('\u{1ee39}', '\u{1ee39}', SC_OLetter),
-        ('\u{1ee3b}', '\u{1ee3b}', SC_OLetter), ('\u{1ee42}', '\u{1ee42}', SC_OLetter),
-        ('\u{1ee47}', '\u{1ee47}', SC_OLetter), ('\u{1ee49}', '\u{1ee49}', SC_OLetter),
-        ('\u{1ee4b}', '\u{1ee4b}', SC_OLetter), ('\u{1ee4d}', '\u{1ee4f}', SC_OLetter),
-        ('\u{1ee51}', '\u{1ee52}', SC_OLetter), ('\u{1ee54}', '\u{1ee54}', SC_OLetter),
-        ('\u{1ee57}', '\u{1ee57}', SC_OLetter), ('\u{1ee59}', '\u{1ee59}', SC_OLetter),
-        ('\u{1ee5b}', '\u{1ee5b}', SC_OLetter), ('\u{1ee5d}', '\u{1ee5d}', SC_OLetter),
-        ('\u{1ee5f}', '\u{1ee5f}', SC_OLetter), ('\u{1ee61}', '\u{1ee62}', SC_OLetter),
-        ('\u{1ee64}', '\u{1ee64}', SC_OLetter), ('\u{1ee67}', '\u{1ee6a}', SC_OLetter),
-        ('\u{1ee6c}', '\u{1ee72}', SC_OLetter), ('\u{1ee74}', '\u{1ee77}', SC_OLetter),
-        ('\u{1ee79}', '\u{1ee7c}', SC_OLetter), ('\u{1ee7e}', '\u{1ee7e}', SC_OLetter),
-        ('\u{1ee80}', '\u{1ee89}', SC_OLetter), ('\u{1ee8b}', '\u{1ee9b}', SC_OLetter),
-        ('\u{1eea1}', '\u{1eea3}', SC_OLetter), ('\u{1eea5}', '\u{1eea9}', SC_OLetter),
-        ('\u{1eeab}', '\u{1eebb}', SC_OLetter), ('\u{1f130}', '\u{1f149}', SC_Upper), ('\u{1f150}',
-        '\u{1f169}', SC_Upper), ('\u{1f170}', '\u{1f189}', SC_Upper), ('\u{1f676}', '\u{1f678}',
-        SC_Close), ('\u{1fbf0}', '\u{1fbf9}', SC_Numeric), ('\u{20000}', '\u{2a6df}', SC_OLetter),
-        ('\u{2a700}', '\u{2b739}', SC_OLetter), ('\u{2b740}', '\u{2b81d}', SC_OLetter),
-        ('\u{2b820}', '\u{2cea1}', SC_OLetter), ('\u{2ceb0}', '\u{2ebe0}', SC_OLetter),
+        '\u{11f59}', SC_Numeric), ('\u{11f5a}', '\u{11f5a}', SC_Extend), ('\u{11fb0}', '\u{11fb0}',
+        SC_OLetter), ('\u{12000}', '\u{12399}', SC_OLetter), ('\u{12400}', '\u{1246e}', SC_OLetter),
+        ('\u{12480}', '\u{12543}', SC_OLetter), ('\u{12f90}', '\u{12ff0}', SC_OLetter),
+        ('\u{13000}', '\u{1342f}', SC_OLetter), ('\u{13430}', '\u{1343f}', SC_Format), ('\u{13440}',
+        '\u{13440}', SC_Extend), ('\u{13441}', '\u{13446}', SC_OLetter), ('\u{13447}', '\u{13455}',
+        SC_Extend), ('\u{13460}', '\u{143fa}', SC_OLetter), ('\u{14400}', '\u{14646}', SC_OLetter),
+        ('\u{16100}', '\u{1611d}', SC_OLetter), ('\u{1611e}', '\u{1612f}', SC_Extend), ('\u{16130}',
+        '\u{16139}', SC_Numeric), ('\u{16800}', '\u{16a38}', SC_OLetter), ('\u{16a40}', '\u{16a5e}',
+        SC_OLetter), ('\u{16a60}', '\u{16a69}', SC_Numeric), ('\u{16a6e}', '\u{16a6f}', SC_STerm),
+        ('\u{16a70}', '\u{16abe}', SC_OLetter), ('\u{16ac0}', '\u{16ac9}', SC_Numeric),
+        ('\u{16ad0}', '\u{16aed}', SC_OLetter), ('\u{16af0}', '\u{16af4}', SC_Extend), ('\u{16af5}',
+        '\u{16af5}', SC_STerm), ('\u{16b00}', '\u{16b2f}', SC_OLetter), ('\u{16b30}', '\u{16b36}',
+        SC_Extend), ('\u{16b37}', '\u{16b38}', SC_STerm), ('\u{16b40}', '\u{16b43}', SC_OLetter),
+        ('\u{16b44}', '\u{16b44}', SC_STerm), ('\u{16b50}', '\u{16b59}', SC_Numeric), ('\u{16b63}',
+        '\u{16b77}', SC_OLetter), ('\u{16b7d}', '\u{16b8f}', SC_OLetter), ('\u{16d40}', '\u{16d6c}',
+        SC_OLetter), ('\u{16d6e}', '\u{16d6f}', SC_STerm), ('\u{16d70}', '\u{16d79}', SC_Numeric),
+        ('\u{16e40}', '\u{16e5f}', SC_Upper), ('\u{16e60}', '\u{16e7f}', SC_Lower), ('\u{16e98}',
+        '\u{16e98}', SC_STerm), ('\u{16f00}', '\u{16f4a}', SC_OLetter), ('\u{16f4f}', '\u{16f4f}',
+        SC_Extend), ('\u{16f50}', '\u{16f50}', SC_OLetter), ('\u{16f51}', '\u{16f87}', SC_Extend),
+        ('\u{16f8f}', '\u{16f92}', SC_Extend), ('\u{16f93}', '\u{16f9f}', SC_OLetter), ('\u{16fe0}',
+        '\u{16fe1}', SC_OLetter), ('\u{16fe3}', '\u{16fe3}', SC_OLetter), ('\u{16fe4}', '\u{16fe4}',
+        SC_Extend), ('\u{16ff0}', '\u{16ff1}', SC_Extend), ('\u{17000}', '\u{187f7}', SC_OLetter),
+        ('\u{18800}', '\u{18cd5}', SC_OLetter), ('\u{18cff}', '\u{18d08}', SC_OLetter),
+        ('\u{1aff0}', '\u{1aff3}', SC_OLetter), ('\u{1aff5}', '\u{1affb}', SC_OLetter),
+        ('\u{1affd}', '\u{1affe}', SC_OLetter), ('\u{1b000}', '\u{1b122}', SC_OLetter),
+        ('\u{1b132}', '\u{1b132}', SC_OLetter), ('\u{1b150}', '\u{1b152}', SC_OLetter),
+        ('\u{1b155}', '\u{1b155}', SC_OLetter), ('\u{1b164}', '\u{1b167}', SC_OLetter),
+        ('\u{1b170}', '\u{1b2fb}', SC_OLetter), ('\u{1bc00}', '\u{1bc6a}', SC_OLetter),
+        ('\u{1bc70}', '\u{1bc7c}', SC_OLetter), ('\u{1bc80}', '\u{1bc88}', SC_OLetter),
+        ('\u{1bc90}', '\u{1bc99}', SC_OLetter), ('\u{1bc9d}', '\u{1bc9e}', SC_Extend), ('\u{1bc9f}',
+        '\u{1bc9f}', SC_STerm), ('\u{1bca0}', '\u{1bca3}', SC_Format), ('\u{1ccf0}', '\u{1ccf9}',
+        SC_Numeric), ('\u{1cf00}', '\u{1cf2d}', SC_Extend), ('\u{1cf30}', '\u{1cf46}', SC_Extend),
+        ('\u{1d165}', '\u{1d169}', SC_Extend), ('\u{1d16d}', '\u{1d172}', SC_Extend), ('\u{1d173}',
+        '\u{1d17a}', SC_Format), ('\u{1d17b}', '\u{1d182}', SC_Extend), ('\u{1d185}', '\u{1d18b}',
+        SC_Extend), ('\u{1d1aa}', '\u{1d1ad}', SC_Extend), ('\u{1d242}', '\u{1d244}', SC_Extend),
+        ('\u{1d400}', '\u{1d419}', SC_Upper), ('\u{1d41a}', '\u{1d433}', SC_Lower), ('\u{1d434}',
+        '\u{1d44d}', SC_Upper), ('\u{1d44e}', '\u{1d454}', SC_Lower), ('\u{1d456}', '\u{1d467}',
+        SC_Lower), ('\u{1d468}', '\u{1d481}', SC_Upper), ('\u{1d482}', '\u{1d49b}', SC_Lower),
+        ('\u{1d49c}', '\u{1d49c}', SC_Upper), ('\u{1d49e}', '\u{1d49f}', SC_Upper), ('\u{1d4a2}',
+        '\u{1d4a2}', SC_Upper), ('\u{1d4a5}', '\u{1d4a6}', SC_Upper), ('\u{1d4a9}', '\u{1d4ac}',
+        SC_Upper), ('\u{1d4ae}', '\u{1d4b5}', SC_Upper), ('\u{1d4b6}', '\u{1d4b9}', SC_Lower),
+        ('\u{1d4bb}', '\u{1d4bb}', SC_Lower), ('\u{1d4bd}', '\u{1d4c3}', SC_Lower), ('\u{1d4c5}',
+        '\u{1d4cf}', SC_Lower), ('\u{1d4d0}', '\u{1d4e9}', SC_Upper), ('\u{1d4ea}', '\u{1d503}',
+        SC_Lower), ('\u{1d504}', '\u{1d505}', SC_Upper), ('\u{1d507}', '\u{1d50a}', SC_Upper),
+        ('\u{1d50d}', '\u{1d514}', SC_Upper), ('\u{1d516}', '\u{1d51c}', SC_Upper), ('\u{1d51e}',
+        '\u{1d537}', SC_Lower), ('\u{1d538}', '\u{1d539}', SC_Upper), ('\u{1d53b}', '\u{1d53e}',
+        SC_Upper), ('\u{1d540}', '\u{1d544}', SC_Upper), ('\u{1d546}', '\u{1d546}', SC_Upper),
+        ('\u{1d54a}', '\u{1d550}', SC_Upper), ('\u{1d552}', '\u{1d56b}', SC_Lower), ('\u{1d56c}',
+        '\u{1d585}', SC_Upper), ('\u{1d586}', '\u{1d59f}', SC_Lower), ('\u{1d5a0}', '\u{1d5b9}',
+        SC_Upper), ('\u{1d5ba}', '\u{1d5d3}', SC_Lower), ('\u{1d5d4}', '\u{1d5ed}', SC_Upper),
+        ('\u{1d5ee}', '\u{1d607}', SC_Lower), ('\u{1d608}', '\u{1d621}', SC_Upper), ('\u{1d622}',
+        '\u{1d63b}', SC_Lower), ('\u{1d63c}', '\u{1d655}', SC_Upper), ('\u{1d656}', '\u{1d66f}',
+        SC_Lower), ('\u{1d670}', '\u{1d689}', SC_Upper), ('\u{1d68a}', '\u{1d6a5}', SC_Lower),
+        ('\u{1d6a8}', '\u{1d6c0}', SC_Upper), ('\u{1d6c2}', '\u{1d6da}', SC_Lower), ('\u{1d6dc}',
+        '\u{1d6e1}', SC_Lower), ('\u{1d6e2}', '\u{1d6fa}', SC_Upper), ('\u{1d6fc}', '\u{1d714}',
+        SC_Lower), ('\u{1d716}', '\u{1d71b}', SC_Lower), ('\u{1d71c}', '\u{1d734}', SC_Upper),
+        ('\u{1d736}', '\u{1d74e}', SC_Lower), ('\u{1d750}', '\u{1d755}', SC_Lower), ('\u{1d756}',
+        '\u{1d76e}', SC_Upper), ('\u{1d770}', '\u{1d788}', SC_Lower), ('\u{1d78a}', '\u{1d78f}',
+        SC_Lower), ('\u{1d790}', '\u{1d7a8}', SC_Upper), ('\u{1d7aa}', '\u{1d7c2}', SC_Lower),
+        ('\u{1d7c4}', '\u{1d7c9}', SC_Lower), ('\u{1d7ca}', '\u{1d7ca}', SC_Upper), ('\u{1d7cb}',
+        '\u{1d7cb}', SC_Lower), ('\u{1d7ce}', '\u{1d7ff}', SC_Numeric), ('\u{1da00}', '\u{1da36}',
+        SC_Extend), ('\u{1da3b}', '\u{1da6c}', SC_Extend), ('\u{1da75}', '\u{1da75}', SC_Extend),
+        ('\u{1da84}', '\u{1da84}', SC_Extend), ('\u{1da88}', '\u{1da88}', SC_STerm), ('\u{1da9b}',
+        '\u{1da9f}', SC_Extend), ('\u{1daa1}', '\u{1daaf}', SC_Extend), ('\u{1df00}', '\u{1df09}',
+        SC_Lower), ('\u{1df0a}', '\u{1df0a}', SC_OLetter), ('\u{1df0b}', '\u{1df1e}', SC_Lower),
+        ('\u{1df25}', '\u{1df2a}', SC_Lower), ('\u{1e000}', '\u{1e006}', SC_Extend), ('\u{1e008}',
+        '\u{1e018}', SC_Extend), ('\u{1e01b}', '\u{1e021}', SC_Extend), ('\u{1e023}', '\u{1e024}',
+        SC_Extend), ('\u{1e026}', '\u{1e02a}', SC_Extend), ('\u{1e030}', '\u{1e06d}', SC_Lower),
+        ('\u{1e08f}', '\u{1e08f}', SC_Extend), ('\u{1e100}', '\u{1e12c}', SC_OLetter), ('\u{1e130}',
+        '\u{1e136}', SC_Extend), ('\u{1e137}', '\u{1e13d}', SC_OLetter), ('\u{1e140}', '\u{1e149}',
+        SC_Numeric), ('\u{1e14e}', '\u{1e14e}', SC_OLetter), ('\u{1e290}', '\u{1e2ad}', SC_OLetter),
+        ('\u{1e2ae}', '\u{1e2ae}', SC_Extend), ('\u{1e2c0}', '\u{1e2eb}', SC_OLetter), ('\u{1e2ec}',
+        '\u{1e2ef}', SC_Extend), ('\u{1e2f0}', '\u{1e2f9}', SC_Numeric), ('\u{1e4d0}', '\u{1e4eb}',
+        SC_OLetter), ('\u{1e4ec}', '\u{1e4ef}', SC_Extend), ('\u{1e4f0}', '\u{1e4f9}', SC_Numeric),
+        ('\u{1e5d0}', '\u{1e5ed}', SC_OLetter), ('\u{1e5ee}', '\u{1e5ef}', SC_Extend), ('\u{1e5f0}',
+        '\u{1e5f0}', SC_OLetter), ('\u{1e5f1}', '\u{1e5fa}', SC_Numeric), ('\u{1e7e0}', '\u{1e7e6}',
+        SC_OLetter), ('\u{1e7e8}', '\u{1e7eb}', SC_OLetter), ('\u{1e7ed}', '\u{1e7ee}', SC_OLetter),
+        ('\u{1e7f0}', '\u{1e7fe}', SC_OLetter), ('\u{1e800}', '\u{1e8c4}', SC_OLetter),
+        ('\u{1e8d0}', '\u{1e8d6}', SC_Extend), ('\u{1e900}', '\u{1e921}', SC_Upper), ('\u{1e922}',
+        '\u{1e943}', SC_Lower), ('\u{1e944}', '\u{1e94a}', SC_Extend), ('\u{1e94b}', '\u{1e94b}',
+        SC_OLetter), ('\u{1e950}', '\u{1e959}', SC_Numeric), ('\u{1ee00}', '\u{1ee03}', SC_OLetter),
+        ('\u{1ee05}', '\u{1ee1f}', SC_OLetter), ('\u{1ee21}', '\u{1ee22}', SC_OLetter),
+        ('\u{1ee24}', '\u{1ee24}', SC_OLetter), ('\u{1ee27}', '\u{1ee27}', SC_OLetter),
+        ('\u{1ee29}', '\u{1ee32}', SC_OLetter), ('\u{1ee34}', '\u{1ee37}', SC_OLetter),
+        ('\u{1ee39}', '\u{1ee39}', SC_OLetter), ('\u{1ee3b}', '\u{1ee3b}', SC_OLetter),
+        ('\u{1ee42}', '\u{1ee42}', SC_OLetter), ('\u{1ee47}', '\u{1ee47}', SC_OLetter),
+        ('\u{1ee49}', '\u{1ee49}', SC_OLetter), ('\u{1ee4b}', '\u{1ee4b}', SC_OLetter),
+        ('\u{1ee4d}', '\u{1ee4f}', SC_OLetter), ('\u{1ee51}', '\u{1ee52}', SC_OLetter),
+        ('\u{1ee54}', '\u{1ee54}', SC_OLetter), ('\u{1ee57}', '\u{1ee57}', SC_OLetter),
+        ('\u{1ee59}', '\u{1ee59}', SC_OLetter), ('\u{1ee5b}', '\u{1ee5b}', SC_OLetter),
+        ('\u{1ee5d}', '\u{1ee5d}', SC_OLetter), ('\u{1ee5f}', '\u{1ee5f}', SC_OLetter),
+        ('\u{1ee61}', '\u{1ee62}', SC_OLetter), ('\u{1ee64}', '\u{1ee64}', SC_OLetter),
+        ('\u{1ee67}', '\u{1ee6a}', SC_OLetter), ('\u{1ee6c}', '\u{1ee72}', SC_OLetter),
+        ('\u{1ee74}', '\u{1ee77}', SC_OLetter), ('\u{1ee79}', '\u{1ee7c}', SC_OLetter),
+        ('\u{1ee7e}', '\u{1ee7e}', SC_OLetter), ('\u{1ee80}', '\u{1ee89}', SC_OLetter),
+        ('\u{1ee8b}', '\u{1ee9b}', SC_OLetter), ('\u{1eea1}', '\u{1eea3}', SC_OLetter),
+        ('\u{1eea5}', '\u{1eea9}', SC_OLetter), ('\u{1eeab}', '\u{1eebb}', SC_OLetter),
+        ('\u{1f130}', '\u{1f149}', SC_Upper), ('\u{1f150}', '\u{1f169}', SC_Upper), ('\u{1f170}',
+        '\u{1f189}', SC_Upper), ('\u{1f676}', '\u{1f678}', SC_Close), ('\u{1fbf0}', '\u{1fbf9}',
+        SC_Numeric), ('\u{20000}', '\u{2a6df}', SC_OLetter), ('\u{2a700}', '\u{2b739}', SC_OLetter),
+        ('\u{2b740}', '\u{2b81d}', SC_OLetter), ('\u{2b820}', '\u{2cea1}', SC_OLetter),
+        ('\u{2ceb0}', '\u{2ebe0}', SC_OLetter), ('\u{2ebf0}', '\u{2ee5d}', SC_OLetter),
         ('\u{2f800}', '\u{2fa1d}', SC_OLetter), ('\u{30000}', '\u{3134a}', SC_OLetter),
         ('\u{31350}', '\u{323af}', SC_OLetter), ('\u{e0001}', '\u{e0001}', SC_Format), ('\u{e0020}',
         '\u{e007f}', SC_Extend), ('\u{e0100}', '\u{e01ef}', SC_Extend)
diff --git a/crates/unicode-segmentation/src/testdata.rs b/crates/unicode-segmentation/src/testdata.rs
deleted file mode 100644
index 8a675aa..0000000
--- a/crates/unicode-segmentation/src/testdata.rs
+++ /dev/null
@@ -1,5250 +0,0 @@
-// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly
-
-#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
-// official Unicode test data
-// http://www.unicode.org/Public/15.0.0/ucd/auxiliary/GraphemeBreakTest.txt
-pub const TEST_SAME: &'static [(&'static str, &'static [&'static str])] = &[
-    ("\u{20}\u{20}", &["\u{20}", "\u{20}"]),
-    ("\u{20}\u{308}\u{20}", &["\u{20}\u{308}", "\u{20}"]),
-    ("\u{20}\u{d}", &["\u{20}", "\u{d}"]),
-    ("\u{20}\u{308}\u{d}", &["\u{20}\u{308}", "\u{d}"]),
-    ("\u{20}\u{a}", &["\u{20}", "\u{a}"]),
-    ("\u{20}\u{308}\u{a}", &["\u{20}\u{308}", "\u{a}"]),
-    ("\u{20}\u{1}", &["\u{20}", "\u{1}"]),
-    ("\u{20}\u{308}\u{1}", &["\u{20}\u{308}", "\u{1}"]),
-    ("\u{20}\u{34f}", &["\u{20}\u{34f}"]),
-    ("\u{20}\u{308}\u{34f}", &["\u{20}\u{308}\u{34f}"]),
-    ("\u{20}\u{1f1e6}", &["\u{20}", "\u{1f1e6}"]),
-    ("\u{20}\u{308}\u{1f1e6}", &["\u{20}\u{308}", "\u{1f1e6}"]),
-    ("\u{20}\u{600}", &["\u{20}", "\u{600}"]),
-    ("\u{20}\u{308}\u{600}", &["\u{20}\u{308}", "\u{600}"]),
-    ("\u{20}\u{1100}", &["\u{20}", "\u{1100}"]),
-    ("\u{20}\u{308}\u{1100}", &["\u{20}\u{308}", "\u{1100}"]),
-    ("\u{20}\u{1160}", &["\u{20}", "\u{1160}"]),
-    ("\u{20}\u{308}\u{1160}", &["\u{20}\u{308}", "\u{1160}"]),
-    ("\u{20}\u{11a8}", &["\u{20}", "\u{11a8}"]),
-    ("\u{20}\u{308}\u{11a8}", &["\u{20}\u{308}", "\u{11a8}"]),
-    ("\u{20}\u{ac00}", &["\u{20}", "\u{ac00}"]),
-    ("\u{20}\u{308}\u{ac00}", &["\u{20}\u{308}", "\u{ac00}"]),
-    ("\u{20}\u{ac01}", &["\u{20}", "\u{ac01}"]),
-    ("\u{20}\u{308}\u{ac01}", &["\u{20}\u{308}", "\u{ac01}"]),
-    ("\u{20}\u{231a}", &["\u{20}", "\u{231a}"]),
-    ("\u{20}\u{308}\u{231a}", &["\u{20}\u{308}", "\u{231a}"]),
-    ("\u{20}\u{300}", &["\u{20}\u{300}"]),
-    ("\u{20}\u{308}\u{300}", &["\u{20}\u{308}\u{300}"]),
-    ("\u{20}\u{200d}", &["\u{20}\u{200d}"]),
-    ("\u{20}\u{308}\u{200d}", &["\u{20}\u{308}\u{200d}"]),
-    ("\u{20}\u{378}", &["\u{20}", "\u{378}"]),
-    ("\u{20}\u{308}\u{378}", &["\u{20}\u{308}", "\u{378}"]),
-    ("\u{d}\u{20}", &["\u{d}", "\u{20}"]),
-    ("\u{d}\u{308}\u{20}", &["\u{d}", "\u{308}", "\u{20}"]),
-    ("\u{d}\u{d}", &["\u{d}", "\u{d}"]),
-    ("\u{d}\u{308}\u{d}", &["\u{d}", "\u{308}", "\u{d}"]),
-    ("\u{d}\u{a}", &["\u{d}\u{a}"]),
-    ("\u{d}\u{308}\u{a}", &["\u{d}", "\u{308}", "\u{a}"]),
-    ("\u{d}\u{1}", &["\u{d}", "\u{1}"]),
-    ("\u{d}\u{308}\u{1}", &["\u{d}", "\u{308}", "\u{1}"]),
-    ("\u{d}\u{34f}", &["\u{d}", "\u{34f}"]),
-    ("\u{d}\u{308}\u{34f}", &["\u{d}", "\u{308}\u{34f}"]),
-    ("\u{d}\u{1f1e6}", &["\u{d}", "\u{1f1e6}"]),
-    ("\u{d}\u{308}\u{1f1e6}", &["\u{d}", "\u{308}", "\u{1f1e6}"]),
-    ("\u{d}\u{600}", &["\u{d}", "\u{600}"]),
-    ("\u{d}\u{308}\u{600}", &["\u{d}", "\u{308}", "\u{600}"]),
-    ("\u{d}\u{903}", &["\u{d}", "\u{903}"]),
-    ("\u{d}\u{1100}", &["\u{d}", "\u{1100}"]),
-    ("\u{d}\u{308}\u{1100}", &["\u{d}", "\u{308}", "\u{1100}"]),
-    ("\u{d}\u{1160}", &["\u{d}", "\u{1160}"]),
-    ("\u{d}\u{308}\u{1160}", &["\u{d}", "\u{308}", "\u{1160}"]),
-    ("\u{d}\u{11a8}", &["\u{d}", "\u{11a8}"]),
-    ("\u{d}\u{308}\u{11a8}", &["\u{d}", "\u{308}", "\u{11a8}"]),
-    ("\u{d}\u{ac00}", &["\u{d}", "\u{ac00}"]),
-    ("\u{d}\u{308}\u{ac00}", &["\u{d}", "\u{308}", "\u{ac00}"]),
-    ("\u{d}\u{ac01}", &["\u{d}", "\u{ac01}"]),
-    ("\u{d}\u{308}\u{ac01}", &["\u{d}", "\u{308}", "\u{ac01}"]),
-    ("\u{d}\u{231a}", &["\u{d}", "\u{231a}"]),
-    ("\u{d}\u{308}\u{231a}", &["\u{d}", "\u{308}", "\u{231a}"]),
-    ("\u{d}\u{300}", &["\u{d}", "\u{300}"]),
-    ("\u{d}\u{308}\u{300}", &["\u{d}", "\u{308}\u{300}"]),
-    ("\u{d}\u{200d}", &["\u{d}", "\u{200d}"]),
-    ("\u{d}\u{308}\u{200d}", &["\u{d}", "\u{308}\u{200d}"]),
-    ("\u{d}\u{378}", &["\u{d}", "\u{378}"]),
-    ("\u{d}\u{308}\u{378}", &["\u{d}", "\u{308}", "\u{378}"]),
-    ("\u{a}\u{20}", &["\u{a}", "\u{20}"]),
-    ("\u{a}\u{308}\u{20}", &["\u{a}", "\u{308}", "\u{20}"]),
-    ("\u{a}\u{d}", &["\u{a}", "\u{d}"]),
-    ("\u{a}\u{308}\u{d}", &["\u{a}", "\u{308}", "\u{d}"]),
-    ("\u{a}\u{a}", &["\u{a}", "\u{a}"]),
-    ("\u{a}\u{308}\u{a}", &["\u{a}", "\u{308}", "\u{a}"]),
-    ("\u{a}\u{1}", &["\u{a}", "\u{1}"]),
-    ("\u{a}\u{308}\u{1}", &["\u{a}", "\u{308}", "\u{1}"]),
-    ("\u{a}\u{34f}", &["\u{a}", "\u{34f}"]),
-    ("\u{a}\u{308}\u{34f}", &["\u{a}", "\u{308}\u{34f}"]),
-    ("\u{a}\u{1f1e6}", &["\u{a}", "\u{1f1e6}"]),
-    ("\u{a}\u{308}\u{1f1e6}", &["\u{a}", "\u{308}", "\u{1f1e6}"]),
-    ("\u{a}\u{600}", &["\u{a}", "\u{600}"]),
-    ("\u{a}\u{308}\u{600}", &["\u{a}", "\u{308}", "\u{600}"]),
-    ("\u{a}\u{903}", &["\u{a}", "\u{903}"]),
-    ("\u{a}\u{1100}", &["\u{a}", "\u{1100}"]),
-    ("\u{a}\u{308}\u{1100}", &["\u{a}", "\u{308}", "\u{1100}"]),
-    ("\u{a}\u{1160}", &["\u{a}", "\u{1160}"]),
-    ("\u{a}\u{308}\u{1160}", &["\u{a}", "\u{308}", "\u{1160}"]),
-    ("\u{a}\u{11a8}", &["\u{a}", "\u{11a8}"]),
-    ("\u{a}\u{308}\u{11a8}", &["\u{a}", "\u{308}", "\u{11a8}"]),
-    ("\u{a}\u{ac00}", &["\u{a}", "\u{ac00}"]),
-    ("\u{a}\u{308}\u{ac00}", &["\u{a}", "\u{308}", "\u{ac00}"]),
-    ("\u{a}\u{ac01}", &["\u{a}", "\u{ac01}"]),
-    ("\u{a}\u{308}\u{ac01}", &["\u{a}", "\u{308}", "\u{ac01}"]),
-    ("\u{a}\u{231a}", &["\u{a}", "\u{231a}"]),
-    ("\u{a}\u{308}\u{231a}", &["\u{a}", "\u{308}", "\u{231a}"]),
-    ("\u{a}\u{300}", &["\u{a}", "\u{300}"]),
-    ("\u{a}\u{308}\u{300}", &["\u{a}", "\u{308}\u{300}"]),
-    ("\u{a}\u{200d}", &["\u{a}", "\u{200d}"]),
-    ("\u{a}\u{308}\u{200d}", &["\u{a}", "\u{308}\u{200d}"]),
-    ("\u{a}\u{378}", &["\u{a}", "\u{378}"]),
-    ("\u{a}\u{308}\u{378}", &["\u{a}", "\u{308}", "\u{378}"]),
-    ("\u{1}\u{20}", &["\u{1}", "\u{20}"]),
-    ("\u{1}\u{308}\u{20}", &["\u{1}", "\u{308}", "\u{20}"]),
-    ("\u{1}\u{d}", &["\u{1}", "\u{d}"]),
-    ("\u{1}\u{308}\u{d}", &["\u{1}", "\u{308}", "\u{d}"]),
-    ("\u{1}\u{a}", &["\u{1}", "\u{a}"]),
-    ("\u{1}\u{308}\u{a}", &["\u{1}", "\u{308}", "\u{a}"]),
-    ("\u{1}\u{1}", &["\u{1}", "\u{1}"]),
-    ("\u{1}\u{308}\u{1}", &["\u{1}", "\u{308}", "\u{1}"]),
-    ("\u{1}\u{34f}", &["\u{1}", "\u{34f}"]),
-    ("\u{1}\u{308}\u{34f}", &["\u{1}", "\u{308}\u{34f}"]),
-    ("\u{1}\u{1f1e6}", &["\u{1}", "\u{1f1e6}"]),
-    ("\u{1}\u{308}\u{1f1e6}", &["\u{1}", "\u{308}", "\u{1f1e6}"]),
-    ("\u{1}\u{600}", &["\u{1}", "\u{600}"]),
-    ("\u{1}\u{308}\u{600}", &["\u{1}", "\u{308}", "\u{600}"]),
-    ("\u{1}\u{903}", &["\u{1}", "\u{903}"]),
-    ("\u{1}\u{1100}", &["\u{1}", "\u{1100}"]),
-    ("\u{1}\u{308}\u{1100}", &["\u{1}", "\u{308}", "\u{1100}"]),
-    ("\u{1}\u{1160}", &["\u{1}", "\u{1160}"]),
-    ("\u{1}\u{308}\u{1160}", &["\u{1}", "\u{308}", "\u{1160}"]),
-    ("\u{1}\u{11a8}", &["\u{1}", "\u{11a8}"]),
-    ("\u{1}\u{308}\u{11a8}", &["\u{1}", "\u{308}", "\u{11a8}"]),
-    ("\u{1}\u{ac00}", &["\u{1}", "\u{ac00}"]),
-    ("\u{1}\u{308}\u{ac00}", &["\u{1}", "\u{308}", "\u{ac00}"]),
-    ("\u{1}\u{ac01}", &["\u{1}", "\u{ac01}"]),
-    ("\u{1}\u{308}\u{ac01}", &["\u{1}", "\u{308}", "\u{ac01}"]),
-    ("\u{1}\u{231a}", &["\u{1}", "\u{231a}"]),
-    ("\u{1}\u{308}\u{231a}", &["\u{1}", "\u{308}", "\u{231a}"]),
-    ("\u{1}\u{300}", &["\u{1}", "\u{300}"]),
-    ("\u{1}\u{308}\u{300}", &["\u{1}", "\u{308}\u{300}"]),
-    ("\u{1}\u{200d}", &["\u{1}", "\u{200d}"]),
-    ("\u{1}\u{308}\u{200d}", &["\u{1}", "\u{308}\u{200d}"]),
-    ("\u{1}\u{378}", &["\u{1}", "\u{378}"]),
-    ("\u{1}\u{308}\u{378}", &["\u{1}", "\u{308}", "\u{378}"]),
-    ("\u{34f}\u{20}", &["\u{34f}", "\u{20}"]),
-    ("\u{34f}\u{308}\u{20}", &["\u{34f}\u{308}", "\u{20}"]),
-    ("\u{34f}\u{d}", &["\u{34f}", "\u{d}"]),
-    ("\u{34f}\u{308}\u{d}", &["\u{34f}\u{308}", "\u{d}"]),
-    ("\u{34f}\u{a}", &["\u{34f}", "\u{a}"]),
-    ("\u{34f}\u{308}\u{a}", &["\u{34f}\u{308}", "\u{a}"]),
-    ("\u{34f}\u{1}", &["\u{34f}", "\u{1}"]),
-    ("\u{34f}\u{308}\u{1}", &["\u{34f}\u{308}", "\u{1}"]),
-    ("\u{34f}\u{34f}", &["\u{34f}\u{34f}"]),
-    ("\u{34f}\u{308}\u{34f}", &["\u{34f}\u{308}\u{34f}"]),
-    ("\u{34f}\u{1f1e6}", &["\u{34f}", "\u{1f1e6}"]),
-    ("\u{34f}\u{308}\u{1f1e6}", &["\u{34f}\u{308}", "\u{1f1e6}"]),
-    ("\u{34f}\u{600}", &["\u{34f}", "\u{600}"]),
-    ("\u{34f}\u{308}\u{600}", &["\u{34f}\u{308}", "\u{600}"]),
-    ("\u{34f}\u{1100}", &["\u{34f}", "\u{1100}"]),
-    ("\u{34f}\u{308}\u{1100}", &["\u{34f}\u{308}", "\u{1100}"]),
-    ("\u{34f}\u{1160}", &["\u{34f}", "\u{1160}"]),
-    ("\u{34f}\u{308}\u{1160}", &["\u{34f}\u{308}", "\u{1160}"]),
-    ("\u{34f}\u{11a8}", &["\u{34f}", "\u{11a8}"]),
-    ("\u{34f}\u{308}\u{11a8}", &["\u{34f}\u{308}", "\u{11a8}"]),
-    ("\u{34f}\u{ac00}", &["\u{34f}", "\u{ac00}"]),
-    ("\u{34f}\u{308}\u{ac00}", &["\u{34f}\u{308}", "\u{ac00}"]),
-    ("\u{34f}\u{ac01}", &["\u{34f}", "\u{ac01}"]),
-    ("\u{34f}\u{308}\u{ac01}", &["\u{34f}\u{308}", "\u{ac01}"]),
-    ("\u{34f}\u{231a}", &["\u{34f}", "\u{231a}"]),
-    ("\u{34f}\u{308}\u{231a}", &["\u{34f}\u{308}", "\u{231a}"]),
-    ("\u{34f}\u{300}", &["\u{34f}\u{300}"]),
-    ("\u{34f}\u{308}\u{300}", &["\u{34f}\u{308}\u{300}"]),
-    ("\u{34f}\u{200d}", &["\u{34f}\u{200d}"]),
-    ("\u{34f}\u{308}\u{200d}", &["\u{34f}\u{308}\u{200d}"]),
-    ("\u{34f}\u{378}", &["\u{34f}", "\u{378}"]),
-    ("\u{34f}\u{308}\u{378}", &["\u{34f}\u{308}", "\u{378}"]),
-    ("\u{1f1e6}\u{20}", &["\u{1f1e6}", "\u{20}"]),
-    ("\u{1f1e6}\u{308}\u{20}", &["\u{1f1e6}\u{308}", "\u{20}"]),
-    ("\u{1f1e6}\u{d}", &["\u{1f1e6}", "\u{d}"]),
-    ("\u{1f1e6}\u{308}\u{d}", &["\u{1f1e6}\u{308}", "\u{d}"]),
-    ("\u{1f1e6}\u{a}", &["\u{1f1e6}", "\u{a}"]),
-    ("\u{1f1e6}\u{308}\u{a}", &["\u{1f1e6}\u{308}", "\u{a}"]),
-    ("\u{1f1e6}\u{1}", &["\u{1f1e6}", "\u{1}"]),
-    ("\u{1f1e6}\u{308}\u{1}", &["\u{1f1e6}\u{308}", "\u{1}"]),
-    ("\u{1f1e6}\u{34f}", &["\u{1f1e6}\u{34f}"]),
-    ("\u{1f1e6}\u{308}\u{34f}", &["\u{1f1e6}\u{308}\u{34f}"]),
-    ("\u{1f1e6}\u{1f1e6}", &["\u{1f1e6}\u{1f1e6}"]),
-    (
-        "\u{1f1e6}\u{308}\u{1f1e6}",
-        &["\u{1f1e6}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{1f1e6}\u{600}", &["\u{1f1e6}", "\u{600}"]),
-    ("\u{1f1e6}\u{308}\u{600}", &["\u{1f1e6}\u{308}", "\u{600}"]),
-    ("\u{1f1e6}\u{1100}", &["\u{1f1e6}", "\u{1100}"]),
-    (
-        "\u{1f1e6}\u{308}\u{1100}",
-        &["\u{1f1e6}\u{308}", "\u{1100}"],
-    ),
-    ("\u{1f1e6}\u{1160}", &["\u{1f1e6}", "\u{1160}"]),
-    (
-        "\u{1f1e6}\u{308}\u{1160}",
-        &["\u{1f1e6}\u{308}", "\u{1160}"],
-    ),
-    ("\u{1f1e6}\u{11a8}", &["\u{1f1e6}", "\u{11a8}"]),
-    (
-        "\u{1f1e6}\u{308}\u{11a8}",
-        &["\u{1f1e6}\u{308}", "\u{11a8}"],
-    ),
-    ("\u{1f1e6}\u{ac00}", &["\u{1f1e6}", "\u{ac00}"]),
-    (
-        "\u{1f1e6}\u{308}\u{ac00}",
-        &["\u{1f1e6}\u{308}", "\u{ac00}"],
-    ),
-    ("\u{1f1e6}\u{ac01}", &["\u{1f1e6}", "\u{ac01}"]),
-    (
-        "\u{1f1e6}\u{308}\u{ac01}",
-        &["\u{1f1e6}\u{308}", "\u{ac01}"],
-    ),
-    ("\u{1f1e6}\u{231a}", &["\u{1f1e6}", "\u{231a}"]),
-    (
-        "\u{1f1e6}\u{308}\u{231a}",
-        &["\u{1f1e6}\u{308}", "\u{231a}"],
-    ),
-    ("\u{1f1e6}\u{300}", &["\u{1f1e6}\u{300}"]),
-    ("\u{1f1e6}\u{308}\u{300}", &["\u{1f1e6}\u{308}\u{300}"]),
-    ("\u{1f1e6}\u{200d}", &["\u{1f1e6}\u{200d}"]),
-    ("\u{1f1e6}\u{308}\u{200d}", &["\u{1f1e6}\u{308}\u{200d}"]),
-    ("\u{1f1e6}\u{378}", &["\u{1f1e6}", "\u{378}"]),
-    ("\u{1f1e6}\u{308}\u{378}", &["\u{1f1e6}\u{308}", "\u{378}"]),
-    ("\u{600}\u{308}\u{20}", &["\u{600}\u{308}", "\u{20}"]),
-    ("\u{600}\u{d}", &["\u{600}", "\u{d}"]),
-    ("\u{600}\u{308}\u{d}", &["\u{600}\u{308}", "\u{d}"]),
-    ("\u{600}\u{a}", &["\u{600}", "\u{a}"]),
-    ("\u{600}\u{308}\u{a}", &["\u{600}\u{308}", "\u{a}"]),
-    ("\u{600}\u{1}", &["\u{600}", "\u{1}"]),
-    ("\u{600}\u{308}\u{1}", &["\u{600}\u{308}", "\u{1}"]),
-    ("\u{600}\u{34f}", &["\u{600}\u{34f}"]),
-    ("\u{600}\u{308}\u{34f}", &["\u{600}\u{308}\u{34f}"]),
-    ("\u{600}\u{308}\u{1f1e6}", &["\u{600}\u{308}", "\u{1f1e6}"]),
-    ("\u{600}\u{308}\u{600}", &["\u{600}\u{308}", "\u{600}"]),
-    ("\u{600}\u{308}\u{1100}", &["\u{600}\u{308}", "\u{1100}"]),
-    ("\u{600}\u{308}\u{1160}", &["\u{600}\u{308}", "\u{1160}"]),
-    ("\u{600}\u{308}\u{11a8}", &["\u{600}\u{308}", "\u{11a8}"]),
-    ("\u{600}\u{308}\u{ac00}", &["\u{600}\u{308}", "\u{ac00}"]),
-    ("\u{600}\u{308}\u{ac01}", &["\u{600}\u{308}", "\u{ac01}"]),
-    ("\u{600}\u{308}\u{231a}", &["\u{600}\u{308}", "\u{231a}"]),
-    ("\u{600}\u{300}", &["\u{600}\u{300}"]),
-    ("\u{600}\u{308}\u{300}", &["\u{600}\u{308}\u{300}"]),
-    ("\u{600}\u{200d}", &["\u{600}\u{200d}"]),
-    ("\u{600}\u{308}\u{200d}", &["\u{600}\u{308}\u{200d}"]),
-    ("\u{600}\u{308}\u{378}", &["\u{600}\u{308}", "\u{378}"]),
-    ("\u{903}\u{20}", &["\u{903}", "\u{20}"]),
-    ("\u{903}\u{308}\u{20}", &["\u{903}\u{308}", "\u{20}"]),
-    ("\u{903}\u{d}", &["\u{903}", "\u{d}"]),
-    ("\u{903}\u{308}\u{d}", &["\u{903}\u{308}", "\u{d}"]),
-    ("\u{903}\u{a}", &["\u{903}", "\u{a}"]),
-    ("\u{903}\u{308}\u{a}", &["\u{903}\u{308}", "\u{a}"]),
-    ("\u{903}\u{1}", &["\u{903}", "\u{1}"]),
-    ("\u{903}\u{308}\u{1}", &["\u{903}\u{308}", "\u{1}"]),
-    ("\u{903}\u{34f}", &["\u{903}\u{34f}"]),
-    ("\u{903}\u{308}\u{34f}", &["\u{903}\u{308}\u{34f}"]),
-    ("\u{903}\u{1f1e6}", &["\u{903}", "\u{1f1e6}"]),
-    ("\u{903}\u{308}\u{1f1e6}", &["\u{903}\u{308}", "\u{1f1e6}"]),
-    ("\u{903}\u{600}", &["\u{903}", "\u{600}"]),
-    ("\u{903}\u{308}\u{600}", &["\u{903}\u{308}", "\u{600}"]),
-    ("\u{903}\u{1100}", &["\u{903}", "\u{1100}"]),
-    ("\u{903}\u{308}\u{1100}", &["\u{903}\u{308}", "\u{1100}"]),
-    ("\u{903}\u{1160}", &["\u{903}", "\u{1160}"]),
-    ("\u{903}\u{308}\u{1160}", &["\u{903}\u{308}", "\u{1160}"]),
-    ("\u{903}\u{11a8}", &["\u{903}", "\u{11a8}"]),
-    ("\u{903}\u{308}\u{11a8}", &["\u{903}\u{308}", "\u{11a8}"]),
-    ("\u{903}\u{ac00}", &["\u{903}", "\u{ac00}"]),
-    ("\u{903}\u{308}\u{ac00}", &["\u{903}\u{308}", "\u{ac00}"]),
-    ("\u{903}\u{ac01}", &["\u{903}", "\u{ac01}"]),
-    ("\u{903}\u{308}\u{ac01}", &["\u{903}\u{308}", "\u{ac01}"]),
-    ("\u{903}\u{231a}", &["\u{903}", "\u{231a}"]),
-    ("\u{903}\u{308}\u{231a}", &["\u{903}\u{308}", "\u{231a}"]),
-    ("\u{903}\u{300}", &["\u{903}\u{300}"]),
-    ("\u{903}\u{308}\u{300}", &["\u{903}\u{308}\u{300}"]),
-    ("\u{903}\u{200d}", &["\u{903}\u{200d}"]),
-    ("\u{903}\u{308}\u{200d}", &["\u{903}\u{308}\u{200d}"]),
-    ("\u{903}\u{378}", &["\u{903}", "\u{378}"]),
-    ("\u{903}\u{308}\u{378}", &["\u{903}\u{308}", "\u{378}"]),
-    ("\u{1100}\u{20}", &["\u{1100}", "\u{20}"]),
-    ("\u{1100}\u{308}\u{20}", &["\u{1100}\u{308}", "\u{20}"]),
-    ("\u{1100}\u{d}", &["\u{1100}", "\u{d}"]),
-    ("\u{1100}\u{308}\u{d}", &["\u{1100}\u{308}", "\u{d}"]),
-    ("\u{1100}\u{a}", &["\u{1100}", "\u{a}"]),
-    ("\u{1100}\u{308}\u{a}", &["\u{1100}\u{308}", "\u{a}"]),
-    ("\u{1100}\u{1}", &["\u{1100}", "\u{1}"]),
-    ("\u{1100}\u{308}\u{1}", &["\u{1100}\u{308}", "\u{1}"]),
-    ("\u{1100}\u{34f}", &["\u{1100}\u{34f}"]),
-    ("\u{1100}\u{308}\u{34f}", &["\u{1100}\u{308}\u{34f}"]),
-    ("\u{1100}\u{1f1e6}", &["\u{1100}", "\u{1f1e6}"]),
-    (
-        "\u{1100}\u{308}\u{1f1e6}",
-        &["\u{1100}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{1100}\u{600}", &["\u{1100}", "\u{600}"]),
-    ("\u{1100}\u{308}\u{600}", &["\u{1100}\u{308}", "\u{600}"]),
-    ("\u{1100}\u{1100}", &["\u{1100}\u{1100}"]),
-    ("\u{1100}\u{308}\u{1100}", &["\u{1100}\u{308}", "\u{1100}"]),
-    ("\u{1100}\u{1160}", &["\u{1100}\u{1160}"]),
-    ("\u{1100}\u{308}\u{1160}", &["\u{1100}\u{308}", "\u{1160}"]),
-    ("\u{1100}\u{11a8}", &["\u{1100}", "\u{11a8}"]),
-    ("\u{1100}\u{308}\u{11a8}", &["\u{1100}\u{308}", "\u{11a8}"]),
-    ("\u{1100}\u{ac00}", &["\u{1100}\u{ac00}"]),
-    ("\u{1100}\u{308}\u{ac00}", &["\u{1100}\u{308}", "\u{ac00}"]),
-    ("\u{1100}\u{ac01}", &["\u{1100}\u{ac01}"]),
-    ("\u{1100}\u{308}\u{ac01}", &["\u{1100}\u{308}", "\u{ac01}"]),
-    ("\u{1100}\u{231a}", &["\u{1100}", "\u{231a}"]),
-    ("\u{1100}\u{308}\u{231a}", &["\u{1100}\u{308}", "\u{231a}"]),
-    ("\u{1100}\u{300}", &["\u{1100}\u{300}"]),
-    ("\u{1100}\u{308}\u{300}", &["\u{1100}\u{308}\u{300}"]),
-    ("\u{1100}\u{200d}", &["\u{1100}\u{200d}"]),
-    ("\u{1100}\u{308}\u{200d}", &["\u{1100}\u{308}\u{200d}"]),
-    ("\u{1100}\u{378}", &["\u{1100}", "\u{378}"]),
-    ("\u{1100}\u{308}\u{378}", &["\u{1100}\u{308}", "\u{378}"]),
-    ("\u{1160}\u{20}", &["\u{1160}", "\u{20}"]),
-    ("\u{1160}\u{308}\u{20}", &["\u{1160}\u{308}", "\u{20}"]),
-    ("\u{1160}\u{d}", &["\u{1160}", "\u{d}"]),
-    ("\u{1160}\u{308}\u{d}", &["\u{1160}\u{308}", "\u{d}"]),
-    ("\u{1160}\u{a}", &["\u{1160}", "\u{a}"]),
-    ("\u{1160}\u{308}\u{a}", &["\u{1160}\u{308}", "\u{a}"]),
-    ("\u{1160}\u{1}", &["\u{1160}", "\u{1}"]),
-    ("\u{1160}\u{308}\u{1}", &["\u{1160}\u{308}", "\u{1}"]),
-    ("\u{1160}\u{34f}", &["\u{1160}\u{34f}"]),
-    ("\u{1160}\u{308}\u{34f}", &["\u{1160}\u{308}\u{34f}"]),
-    ("\u{1160}\u{1f1e6}", &["\u{1160}", "\u{1f1e6}"]),
-    (
-        "\u{1160}\u{308}\u{1f1e6}",
-        &["\u{1160}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{1160}\u{600}", &["\u{1160}", "\u{600}"]),
-    ("\u{1160}\u{308}\u{600}", &["\u{1160}\u{308}", "\u{600}"]),
-    ("\u{1160}\u{1100}", &["\u{1160}", "\u{1100}"]),
-    ("\u{1160}\u{308}\u{1100}", &["\u{1160}\u{308}", "\u{1100}"]),
-    ("\u{1160}\u{1160}", &["\u{1160}\u{1160}"]),
-    ("\u{1160}\u{308}\u{1160}", &["\u{1160}\u{308}", "\u{1160}"]),
-    ("\u{1160}\u{11a8}", &["\u{1160}\u{11a8}"]),
-    ("\u{1160}\u{308}\u{11a8}", &["\u{1160}\u{308}", "\u{11a8}"]),
-    ("\u{1160}\u{ac00}", &["\u{1160}", "\u{ac00}"]),
-    ("\u{1160}\u{308}\u{ac00}", &["\u{1160}\u{308}", "\u{ac00}"]),
-    ("\u{1160}\u{ac01}", &["\u{1160}", "\u{ac01}"]),
-    ("\u{1160}\u{308}\u{ac01}", &["\u{1160}\u{308}", "\u{ac01}"]),
-    ("\u{1160}\u{231a}", &["\u{1160}", "\u{231a}"]),
-    ("\u{1160}\u{308}\u{231a}", &["\u{1160}\u{308}", "\u{231a}"]),
-    ("\u{1160}\u{300}", &["\u{1160}\u{300}"]),
-    ("\u{1160}\u{308}\u{300}", &["\u{1160}\u{308}\u{300}"]),
-    ("\u{1160}\u{200d}", &["\u{1160}\u{200d}"]),
-    ("\u{1160}\u{308}\u{200d}", &["\u{1160}\u{308}\u{200d}"]),
-    ("\u{1160}\u{378}", &["\u{1160}", "\u{378}"]),
-    ("\u{1160}\u{308}\u{378}", &["\u{1160}\u{308}", "\u{378}"]),
-    ("\u{11a8}\u{20}", &["\u{11a8}", "\u{20}"]),
-    ("\u{11a8}\u{308}\u{20}", &["\u{11a8}\u{308}", "\u{20}"]),
-    ("\u{11a8}\u{d}", &["\u{11a8}", "\u{d}"]),
-    ("\u{11a8}\u{308}\u{d}", &["\u{11a8}\u{308}", "\u{d}"]),
-    ("\u{11a8}\u{a}", &["\u{11a8}", "\u{a}"]),
-    ("\u{11a8}\u{308}\u{a}", &["\u{11a8}\u{308}", "\u{a}"]),
-    ("\u{11a8}\u{1}", &["\u{11a8}", "\u{1}"]),
-    ("\u{11a8}\u{308}\u{1}", &["\u{11a8}\u{308}", "\u{1}"]),
-    ("\u{11a8}\u{34f}", &["\u{11a8}\u{34f}"]),
-    ("\u{11a8}\u{308}\u{34f}", &["\u{11a8}\u{308}\u{34f}"]),
-    ("\u{11a8}\u{1f1e6}", &["\u{11a8}", "\u{1f1e6}"]),
-    (
-        "\u{11a8}\u{308}\u{1f1e6}",
-        &["\u{11a8}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{11a8}\u{600}", &["\u{11a8}", "\u{600}"]),
-    ("\u{11a8}\u{308}\u{600}", &["\u{11a8}\u{308}", "\u{600}"]),
-    ("\u{11a8}\u{1100}", &["\u{11a8}", "\u{1100}"]),
-    ("\u{11a8}\u{308}\u{1100}", &["\u{11a8}\u{308}", "\u{1100}"]),
-    ("\u{11a8}\u{1160}", &["\u{11a8}", "\u{1160}"]),
-    ("\u{11a8}\u{308}\u{1160}", &["\u{11a8}\u{308}", "\u{1160}"]),
-    ("\u{11a8}\u{11a8}", &["\u{11a8}\u{11a8}"]),
-    ("\u{11a8}\u{308}\u{11a8}", &["\u{11a8}\u{308}", "\u{11a8}"]),
-    ("\u{11a8}\u{ac00}", &["\u{11a8}", "\u{ac00}"]),
-    ("\u{11a8}\u{308}\u{ac00}", &["\u{11a8}\u{308}", "\u{ac00}"]),
-    ("\u{11a8}\u{ac01}", &["\u{11a8}", "\u{ac01}"]),
-    ("\u{11a8}\u{308}\u{ac01}", &["\u{11a8}\u{308}", "\u{ac01}"]),
-    ("\u{11a8}\u{231a}", &["\u{11a8}", "\u{231a}"]),
-    ("\u{11a8}\u{308}\u{231a}", &["\u{11a8}\u{308}", "\u{231a}"]),
-    ("\u{11a8}\u{300}", &["\u{11a8}\u{300}"]),
-    ("\u{11a8}\u{308}\u{300}", &["\u{11a8}\u{308}\u{300}"]),
-    ("\u{11a8}\u{200d}", &["\u{11a8}\u{200d}"]),
-    ("\u{11a8}\u{308}\u{200d}", &["\u{11a8}\u{308}\u{200d}"]),
-    ("\u{11a8}\u{378}", &["\u{11a8}", "\u{378}"]),
-    ("\u{11a8}\u{308}\u{378}", &["\u{11a8}\u{308}", "\u{378}"]),
-    ("\u{ac00}\u{20}", &["\u{ac00}", "\u{20}"]),
-    ("\u{ac00}\u{308}\u{20}", &["\u{ac00}\u{308}", "\u{20}"]),
-    ("\u{ac00}\u{d}", &["\u{ac00}", "\u{d}"]),
-    ("\u{ac00}\u{308}\u{d}", &["\u{ac00}\u{308}", "\u{d}"]),
-    ("\u{ac00}\u{a}", &["\u{ac00}", "\u{a}"]),
-    ("\u{ac00}\u{308}\u{a}", &["\u{ac00}\u{308}", "\u{a}"]),
-    ("\u{ac00}\u{1}", &["\u{ac00}", "\u{1}"]),
-    ("\u{ac00}\u{308}\u{1}", &["\u{ac00}\u{308}", "\u{1}"]),
-    ("\u{ac00}\u{34f}", &["\u{ac00}\u{34f}"]),
-    ("\u{ac00}\u{308}\u{34f}", &["\u{ac00}\u{308}\u{34f}"]),
-    ("\u{ac00}\u{1f1e6}", &["\u{ac00}", "\u{1f1e6}"]),
-    (
-        "\u{ac00}\u{308}\u{1f1e6}",
-        &["\u{ac00}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{ac00}\u{600}", &["\u{ac00}", "\u{600}"]),
-    ("\u{ac00}\u{308}\u{600}", &["\u{ac00}\u{308}", "\u{600}"]),
-    ("\u{ac00}\u{1100}", &["\u{ac00}", "\u{1100}"]),
-    ("\u{ac00}\u{308}\u{1100}", &["\u{ac00}\u{308}", "\u{1100}"]),
-    ("\u{ac00}\u{1160}", &["\u{ac00}\u{1160}"]),
-    ("\u{ac00}\u{308}\u{1160}", &["\u{ac00}\u{308}", "\u{1160}"]),
-    ("\u{ac00}\u{11a8}", &["\u{ac00}\u{11a8}"]),
-    ("\u{ac00}\u{308}\u{11a8}", &["\u{ac00}\u{308}", "\u{11a8}"]),
-    ("\u{ac00}\u{ac00}", &["\u{ac00}", "\u{ac00}"]),
-    ("\u{ac00}\u{308}\u{ac00}", &["\u{ac00}\u{308}", "\u{ac00}"]),
-    ("\u{ac00}\u{ac01}", &["\u{ac00}", "\u{ac01}"]),
-    ("\u{ac00}\u{308}\u{ac01}", &["\u{ac00}\u{308}", "\u{ac01}"]),
-    ("\u{ac00}\u{231a}", &["\u{ac00}", "\u{231a}"]),
-    ("\u{ac00}\u{308}\u{231a}", &["\u{ac00}\u{308}", "\u{231a}"]),
-    ("\u{ac00}\u{300}", &["\u{ac00}\u{300}"]),
-    ("\u{ac00}\u{308}\u{300}", &["\u{ac00}\u{308}\u{300}"]),
-    ("\u{ac00}\u{200d}", &["\u{ac00}\u{200d}"]),
-    ("\u{ac00}\u{308}\u{200d}", &["\u{ac00}\u{308}\u{200d}"]),
-    ("\u{ac00}\u{378}", &["\u{ac00}", "\u{378}"]),
-    ("\u{ac00}\u{308}\u{378}", &["\u{ac00}\u{308}", "\u{378}"]),
-    ("\u{ac01}\u{20}", &["\u{ac01}", "\u{20}"]),
-    ("\u{ac01}\u{308}\u{20}", &["\u{ac01}\u{308}", "\u{20}"]),
-    ("\u{ac01}\u{d}", &["\u{ac01}", "\u{d}"]),
-    ("\u{ac01}\u{308}\u{d}", &["\u{ac01}\u{308}", "\u{d}"]),
-    ("\u{ac01}\u{a}", &["\u{ac01}", "\u{a}"]),
-    ("\u{ac01}\u{308}\u{a}", &["\u{ac01}\u{308}", "\u{a}"]),
-    ("\u{ac01}\u{1}", &["\u{ac01}", "\u{1}"]),
-    ("\u{ac01}\u{308}\u{1}", &["\u{ac01}\u{308}", "\u{1}"]),
-    ("\u{ac01}\u{34f}", &["\u{ac01}\u{34f}"]),
-    ("\u{ac01}\u{308}\u{34f}", &["\u{ac01}\u{308}\u{34f}"]),
-    ("\u{ac01}\u{1f1e6}", &["\u{ac01}", "\u{1f1e6}"]),
-    (
-        "\u{ac01}\u{308}\u{1f1e6}",
-        &["\u{ac01}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{ac01}\u{600}", &["\u{ac01}", "\u{600}"]),
-    ("\u{ac01}\u{308}\u{600}", &["\u{ac01}\u{308}", "\u{600}"]),
-    ("\u{ac01}\u{1100}", &["\u{ac01}", "\u{1100}"]),
-    ("\u{ac01}\u{308}\u{1100}", &["\u{ac01}\u{308}", "\u{1100}"]),
-    ("\u{ac01}\u{1160}", &["\u{ac01}", "\u{1160}"]),
-    ("\u{ac01}\u{308}\u{1160}", &["\u{ac01}\u{308}", "\u{1160}"]),
-    ("\u{ac01}\u{11a8}", &["\u{ac01}\u{11a8}"]),
-    ("\u{ac01}\u{308}\u{11a8}", &["\u{ac01}\u{308}", "\u{11a8}"]),
-    ("\u{ac01}\u{ac00}", &["\u{ac01}", "\u{ac00}"]),
-    ("\u{ac01}\u{308}\u{ac00}", &["\u{ac01}\u{308}", "\u{ac00}"]),
-    ("\u{ac01}\u{ac01}", &["\u{ac01}", "\u{ac01}"]),
-    ("\u{ac01}\u{308}\u{ac01}", &["\u{ac01}\u{308}", "\u{ac01}"]),
-    ("\u{ac01}\u{231a}", &["\u{ac01}", "\u{231a}"]),
-    ("\u{ac01}\u{308}\u{231a}", &["\u{ac01}\u{308}", "\u{231a}"]),
-    ("\u{ac01}\u{300}", &["\u{ac01}\u{300}"]),
-    ("\u{ac01}\u{308}\u{300}", &["\u{ac01}\u{308}\u{300}"]),
-    ("\u{ac01}\u{200d}", &["\u{ac01}\u{200d}"]),
-    ("\u{ac01}\u{308}\u{200d}", &["\u{ac01}\u{308}\u{200d}"]),
-    ("\u{ac01}\u{378}", &["\u{ac01}", "\u{378}"]),
-    ("\u{ac01}\u{308}\u{378}", &["\u{ac01}\u{308}", "\u{378}"]),
-    ("\u{231a}\u{20}", &["\u{231a}", "\u{20}"]),
-    ("\u{231a}\u{308}\u{20}", &["\u{231a}\u{308}", "\u{20}"]),
-    ("\u{231a}\u{d}", &["\u{231a}", "\u{d}"]),
-    ("\u{231a}\u{308}\u{d}", &["\u{231a}\u{308}", "\u{d}"]),
-    ("\u{231a}\u{a}", &["\u{231a}", "\u{a}"]),
-    ("\u{231a}\u{308}\u{a}", &["\u{231a}\u{308}", "\u{a}"]),
-    ("\u{231a}\u{1}", &["\u{231a}", "\u{1}"]),
-    ("\u{231a}\u{308}\u{1}", &["\u{231a}\u{308}", "\u{1}"]),
-    ("\u{231a}\u{34f}", &["\u{231a}\u{34f}"]),
-    ("\u{231a}\u{308}\u{34f}", &["\u{231a}\u{308}\u{34f}"]),
-    ("\u{231a}\u{1f1e6}", &["\u{231a}", "\u{1f1e6}"]),
-    (
-        "\u{231a}\u{308}\u{1f1e6}",
-        &["\u{231a}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{231a}\u{600}", &["\u{231a}", "\u{600}"]),
-    ("\u{231a}\u{308}\u{600}", &["\u{231a}\u{308}", "\u{600}"]),
-    ("\u{231a}\u{1100}", &["\u{231a}", "\u{1100}"]),
-    ("\u{231a}\u{308}\u{1100}", &["\u{231a}\u{308}", "\u{1100}"]),
-    ("\u{231a}\u{1160}", &["\u{231a}", "\u{1160}"]),
-    ("\u{231a}\u{308}\u{1160}", &["\u{231a}\u{308}", "\u{1160}"]),
-    ("\u{231a}\u{11a8}", &["\u{231a}", "\u{11a8}"]),
-    ("\u{231a}\u{308}\u{11a8}", &["\u{231a}\u{308}", "\u{11a8}"]),
-    ("\u{231a}\u{ac00}", &["\u{231a}", "\u{ac00}"]),
-    ("\u{231a}\u{308}\u{ac00}", &["\u{231a}\u{308}", "\u{ac00}"]),
-    ("\u{231a}\u{ac01}", &["\u{231a}", "\u{ac01}"]),
-    ("\u{231a}\u{308}\u{ac01}", &["\u{231a}\u{308}", "\u{ac01}"]),
-    ("\u{231a}\u{231a}", &["\u{231a}", "\u{231a}"]),
-    ("\u{231a}\u{308}\u{231a}", &["\u{231a}\u{308}", "\u{231a}"]),
-    ("\u{231a}\u{300}", &["\u{231a}\u{300}"]),
-    ("\u{231a}\u{308}\u{300}", &["\u{231a}\u{308}\u{300}"]),
-    ("\u{231a}\u{200d}", &["\u{231a}\u{200d}"]),
-    ("\u{231a}\u{308}\u{200d}", &["\u{231a}\u{308}\u{200d}"]),
-    ("\u{231a}\u{378}", &["\u{231a}", "\u{378}"]),
-    ("\u{231a}\u{308}\u{378}", &["\u{231a}\u{308}", "\u{378}"]),
-    ("\u{300}\u{20}", &["\u{300}", "\u{20}"]),
-    ("\u{300}\u{308}\u{20}", &["\u{300}\u{308}", "\u{20}"]),
-    ("\u{300}\u{d}", &["\u{300}", "\u{d}"]),
-    ("\u{300}\u{308}\u{d}", &["\u{300}\u{308}", "\u{d}"]),
-    ("\u{300}\u{a}", &["\u{300}", "\u{a}"]),
-    ("\u{300}\u{308}\u{a}", &["\u{300}\u{308}", "\u{a}"]),
-    ("\u{300}\u{1}", &["\u{300}", "\u{1}"]),
-    ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}", "\u{1}"]),
-    ("\u{300}\u{34f}", &["\u{300}\u{34f}"]),
-    ("\u{300}\u{308}\u{34f}", &["\u{300}\u{308}\u{34f}"]),
-    ("\u{300}\u{1f1e6}", &["\u{300}", "\u{1f1e6}"]),
-    ("\u{300}\u{308}\u{1f1e6}", &["\u{300}\u{308}", "\u{1f1e6}"]),
-    ("\u{300}\u{600}", &["\u{300}", "\u{600}"]),
-    ("\u{300}\u{308}\u{600}", &["\u{300}\u{308}", "\u{600}"]),
-    ("\u{300}\u{1100}", &["\u{300}", "\u{1100}"]),
-    ("\u{300}\u{308}\u{1100}", &["\u{300}\u{308}", "\u{1100}"]),
-    ("\u{300}\u{1160}", &["\u{300}", "\u{1160}"]),
-    ("\u{300}\u{308}\u{1160}", &["\u{300}\u{308}", "\u{1160}"]),
-    ("\u{300}\u{11a8}", &["\u{300}", "\u{11a8}"]),
-    ("\u{300}\u{308}\u{11a8}", &["\u{300}\u{308}", "\u{11a8}"]),
-    ("\u{300}\u{ac00}", &["\u{300}", "\u{ac00}"]),
-    ("\u{300}\u{308}\u{ac00}", &["\u{300}\u{308}", "\u{ac00}"]),
-    ("\u{300}\u{ac01}", &["\u{300}", "\u{ac01}"]),
-    ("\u{300}\u{308}\u{ac01}", &["\u{300}\u{308}", "\u{ac01}"]),
-    ("\u{300}\u{231a}", &["\u{300}", "\u{231a}"]),
-    ("\u{300}\u{308}\u{231a}", &["\u{300}\u{308}", "\u{231a}"]),
-    ("\u{300}\u{300}", &["\u{300}\u{300}"]),
-    ("\u{300}\u{308}\u{300}", &["\u{300}\u{308}\u{300}"]),
-    ("\u{300}\u{200d}", &["\u{300}\u{200d}"]),
-    ("\u{300}\u{308}\u{200d}", &["\u{300}\u{308}\u{200d}"]),
-    ("\u{300}\u{378}", &["\u{300}", "\u{378}"]),
-    ("\u{300}\u{308}\u{378}", &["\u{300}\u{308}", "\u{378}"]),
-    ("\u{200d}\u{20}", &["\u{200d}", "\u{20}"]),
-    ("\u{200d}\u{308}\u{20}", &["\u{200d}\u{308}", "\u{20}"]),
-    ("\u{200d}\u{d}", &["\u{200d}", "\u{d}"]),
-    ("\u{200d}\u{308}\u{d}", &["\u{200d}\u{308}", "\u{d}"]),
-    ("\u{200d}\u{a}", &["\u{200d}", "\u{a}"]),
-    ("\u{200d}\u{308}\u{a}", &["\u{200d}\u{308}", "\u{a}"]),
-    ("\u{200d}\u{1}", &["\u{200d}", "\u{1}"]),
-    ("\u{200d}\u{308}\u{1}", &["\u{200d}\u{308}", "\u{1}"]),
-    ("\u{200d}\u{34f}", &["\u{200d}\u{34f}"]),
-    ("\u{200d}\u{308}\u{34f}", &["\u{200d}\u{308}\u{34f}"]),
-    ("\u{200d}\u{1f1e6}", &["\u{200d}", "\u{1f1e6}"]),
-    (
-        "\u{200d}\u{308}\u{1f1e6}",
-        &["\u{200d}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{200d}\u{600}", &["\u{200d}", "\u{600}"]),
-    ("\u{200d}\u{308}\u{600}", &["\u{200d}\u{308}", "\u{600}"]),
-    ("\u{200d}\u{1100}", &["\u{200d}", "\u{1100}"]),
-    ("\u{200d}\u{308}\u{1100}", &["\u{200d}\u{308}", "\u{1100}"]),
-    ("\u{200d}\u{1160}", &["\u{200d}", "\u{1160}"]),
-    ("\u{200d}\u{308}\u{1160}", &["\u{200d}\u{308}", "\u{1160}"]),
-    ("\u{200d}\u{11a8}", &["\u{200d}", "\u{11a8}"]),
-    ("\u{200d}\u{308}\u{11a8}", &["\u{200d}\u{308}", "\u{11a8}"]),
-    ("\u{200d}\u{ac00}", &["\u{200d}", "\u{ac00}"]),
-    ("\u{200d}\u{308}\u{ac00}", &["\u{200d}\u{308}", "\u{ac00}"]),
-    ("\u{200d}\u{ac01}", &["\u{200d}", "\u{ac01}"]),
-    ("\u{200d}\u{308}\u{ac01}", &["\u{200d}\u{308}", "\u{ac01}"]),
-    ("\u{200d}\u{231a}", &["\u{200d}", "\u{231a}"]),
-    ("\u{200d}\u{308}\u{231a}", &["\u{200d}\u{308}", "\u{231a}"]),
-    ("\u{200d}\u{300}", &["\u{200d}\u{300}"]),
-    ("\u{200d}\u{308}\u{300}", &["\u{200d}\u{308}\u{300}"]),
-    ("\u{200d}\u{200d}", &["\u{200d}\u{200d}"]),
-    ("\u{200d}\u{308}\u{200d}", &["\u{200d}\u{308}\u{200d}"]),
-    ("\u{200d}\u{378}", &["\u{200d}", "\u{378}"]),
-    ("\u{200d}\u{308}\u{378}", &["\u{200d}\u{308}", "\u{378}"]),
-    ("\u{378}\u{20}", &["\u{378}", "\u{20}"]),
-    ("\u{378}\u{308}\u{20}", &["\u{378}\u{308}", "\u{20}"]),
-    ("\u{378}\u{d}", &["\u{378}", "\u{d}"]),
-    ("\u{378}\u{308}\u{d}", &["\u{378}\u{308}", "\u{d}"]),
-    ("\u{378}\u{a}", &["\u{378}", "\u{a}"]),
-    ("\u{378}\u{308}\u{a}", &["\u{378}\u{308}", "\u{a}"]),
-    ("\u{378}\u{1}", &["\u{378}", "\u{1}"]),
-    ("\u{378}\u{308}\u{1}", &["\u{378}\u{308}", "\u{1}"]),
-    ("\u{378}\u{34f}", &["\u{378}\u{34f}"]),
-    ("\u{378}\u{308}\u{34f}", &["\u{378}\u{308}\u{34f}"]),
-    ("\u{378}\u{1f1e6}", &["\u{378}", "\u{1f1e6}"]),
-    ("\u{378}\u{308}\u{1f1e6}", &["\u{378}\u{308}", "\u{1f1e6}"]),
-    ("\u{378}\u{600}", &["\u{378}", "\u{600}"]),
-    ("\u{378}\u{308}\u{600}", &["\u{378}\u{308}", "\u{600}"]),
-    ("\u{378}\u{1100}", &["\u{378}", "\u{1100}"]),
-    ("\u{378}\u{308}\u{1100}", &["\u{378}\u{308}", "\u{1100}"]),
-    ("\u{378}\u{1160}", &["\u{378}", "\u{1160}"]),
-    ("\u{378}\u{308}\u{1160}", &["\u{378}\u{308}", "\u{1160}"]),
-    ("\u{378}\u{11a8}", &["\u{378}", "\u{11a8}"]),
-    ("\u{378}\u{308}\u{11a8}", &["\u{378}\u{308}", "\u{11a8}"]),
-    ("\u{378}\u{ac00}", &["\u{378}", "\u{ac00}"]),
-    ("\u{378}\u{308}\u{ac00}", &["\u{378}\u{308}", "\u{ac00}"]),
-    ("\u{378}\u{ac01}", &["\u{378}", "\u{ac01}"]),
-    ("\u{378}\u{308}\u{ac01}", &["\u{378}\u{308}", "\u{ac01}"]),
-    ("\u{378}\u{231a}", &["\u{378}", "\u{231a}"]),
-    ("\u{378}\u{308}\u{231a}", &["\u{378}\u{308}", "\u{231a}"]),
-    ("\u{378}\u{300}", &["\u{378}\u{300}"]),
-    ("\u{378}\u{308}\u{300}", &["\u{378}\u{308}\u{300}"]),
-    ("\u{378}\u{200d}", &["\u{378}\u{200d}"]),
-    ("\u{378}\u{308}\u{200d}", &["\u{378}\u{308}\u{200d}"]),
-    ("\u{378}\u{378}", &["\u{378}", "\u{378}"]),
-    ("\u{378}\u{308}\u{378}", &["\u{378}\u{308}", "\u{378}"]),
-    (
-        "\u{d}\u{a}\u{61}\u{a}\u{308}",
-        &["\u{d}\u{a}", "\u{61}", "\u{a}", "\u{308}"],
-    ),
-    ("\u{61}\u{308}", &["\u{61}\u{308}"]),
-    ("\u{20}\u{200d}\u{646}", &["\u{20}\u{200d}", "\u{646}"]),
-    ("\u{646}\u{200d}\u{20}", &["\u{646}\u{200d}", "\u{20}"]),
-    ("\u{1100}\u{1100}", &["\u{1100}\u{1100}"]),
-    (
-        "\u{ac00}\u{11a8}\u{1100}",
-        &["\u{ac00}\u{11a8}", "\u{1100}"],
-    ),
-    (
-        "\u{ac01}\u{11a8}\u{1100}",
-        &["\u{ac01}\u{11a8}", "\u{1100}"],
-    ),
-    (
-        "\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}",
-        &["\u{1f1e6}\u{1f1e7}", "\u{1f1e8}", "\u{62}"],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}",
-        &["\u{61}", "\u{1f1e6}\u{1f1e7}", "\u{1f1e8}", "\u{62}"],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{1f1e7}\u{200d}\u{1f1e8}\u{62}",
-        &[
-            "\u{61}",
-            "\u{1f1e6}\u{1f1e7}\u{200d}",
-            "\u{1f1e8}",
-            "\u{62}",
-        ],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{200d}\u{1f1e7}\u{1f1e8}\u{62}",
-        &[
-            "\u{61}",
-            "\u{1f1e6}\u{200d}",
-            "\u{1f1e7}\u{1f1e8}",
-            "\u{62}",
-        ],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{1f1e9}\u{62}",
-        &[
-            "\u{61}",
-            "\u{1f1e6}\u{1f1e7}",
-            "\u{1f1e8}\u{1f1e9}",
-            "\u{62}",
-        ],
-    ),
-    ("\u{61}\u{200d}", &["\u{61}\u{200d}"]),
-    ("\u{61}\u{308}\u{62}", &["\u{61}\u{308}", "\u{62}"]),
-    (
-        "\u{1f476}\u{1f3ff}\u{1f476}",
-        &["\u{1f476}\u{1f3ff}", "\u{1f476}"],
-    ),
-    (
-        "\u{61}\u{1f3ff}\u{1f476}",
-        &["\u{61}\u{1f3ff}", "\u{1f476}"],
-    ),
-    (
-        "\u{61}\u{1f3ff}\u{1f476}\u{200d}\u{1f6d1}",
-        &["\u{61}\u{1f3ff}", "\u{1f476}\u{200d}\u{1f6d1}"],
-    ),
-    (
-        "\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}",
-        &["\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}"],
-    ),
-    (
-        "\u{1f6d1}\u{200d}\u{1f6d1}",
-        &["\u{1f6d1}\u{200d}\u{1f6d1}"],
-    ),
-    ("\u{61}\u{200d}\u{1f6d1}", &["\u{61}\u{200d}", "\u{1f6d1}"]),
-    ("\u{2701}\u{200d}\u{2701}", &["\u{2701}\u{200d}\u{2701}"]),
-    ("\u{61}\u{200d}\u{2701}", &["\u{61}\u{200d}", "\u{2701}"]),
-];
-
-pub const TEST_DIFF: &'static [(
-    &'static str,
-    &'static [&'static str],
-    &'static [&'static str],
-)] = &[
-    ("\u{20}\u{903}", &["\u{20}\u{903}"], &["\u{20}", "\u{903}"]),
-    (
-        "\u{20}\u{308}\u{903}",
-        &["\u{20}\u{308}\u{903}"],
-        &["\u{20}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{d}\u{308}\u{903}",
-        &["\u{d}", "\u{308}\u{903}"],
-        &["\u{d}", "\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{a}\u{308}\u{903}",
-        &["\u{a}", "\u{308}\u{903}"],
-        &["\u{a}", "\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{1}\u{308}\u{903}",
-        &["\u{1}", "\u{308}\u{903}"],
-        &["\u{1}", "\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{34f}\u{903}",
-        &["\u{34f}\u{903}"],
-        &["\u{34f}", "\u{903}"],
-    ),
-    (
-        "\u{34f}\u{308}\u{903}",
-        &["\u{34f}\u{308}\u{903}"],
-        &["\u{34f}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{1f1e6}\u{903}",
-        &["\u{1f1e6}\u{903}"],
-        &["\u{1f1e6}", "\u{903}"],
-    ),
-    (
-        "\u{1f1e6}\u{308}\u{903}",
-        &["\u{1f1e6}\u{308}\u{903}"],
-        &["\u{1f1e6}\u{308}", "\u{903}"],
-    ),
-    ("\u{600}\u{20}", &["\u{600}\u{20}"], &["\u{600}", "\u{20}"]),
-    (
-        "\u{600}\u{1f1e6}",
-        &["\u{600}\u{1f1e6}"],
-        &["\u{600}", "\u{1f1e6}"],
-    ),
-    (
-        "\u{600}\u{600}",
-        &["\u{600}\u{600}"],
-        &["\u{600}", "\u{600}"],
-    ),
-    (
-        "\u{600}\u{903}",
-        &["\u{600}\u{903}"],
-        &["\u{600}", "\u{903}"],
-    ),
-    (
-        "\u{600}\u{308}\u{903}",
-        &["\u{600}\u{308}\u{903}"],
-        &["\u{600}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{600}\u{1100}",
-        &["\u{600}\u{1100}"],
-        &["\u{600}", "\u{1100}"],
-    ),
-    (
-        "\u{600}\u{1160}",
-        &["\u{600}\u{1160}"],
-        &["\u{600}", "\u{1160}"],
-    ),
-    (
-        "\u{600}\u{11a8}",
-        &["\u{600}\u{11a8}"],
-        &["\u{600}", "\u{11a8}"],
-    ),
-    (
-        "\u{600}\u{ac00}",
-        &["\u{600}\u{ac00}"],
-        &["\u{600}", "\u{ac00}"],
-    ),
-    (
-        "\u{600}\u{ac01}",
-        &["\u{600}\u{ac01}"],
-        &["\u{600}", "\u{ac01}"],
-    ),
-    (
-        "\u{600}\u{231a}",
-        &["\u{600}\u{231a}"],
-        &["\u{600}", "\u{231a}"],
-    ),
-    (
-        "\u{600}\u{378}",
-        &["\u{600}\u{378}"],
-        &["\u{600}", "\u{378}"],
-    ),
-    (
-        "\u{903}\u{903}",
-        &["\u{903}\u{903}"],
-        &["\u{903}", "\u{903}"],
-    ),
-    (
-        "\u{903}\u{308}\u{903}",
-        &["\u{903}\u{308}\u{903}"],
-        &["\u{903}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{1100}\u{903}",
-        &["\u{1100}\u{903}"],
-        &["\u{1100}", "\u{903}"],
-    ),
-    (
-        "\u{1100}\u{308}\u{903}",
-        &["\u{1100}\u{308}\u{903}"],
-        &["\u{1100}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{1160}\u{903}",
-        &["\u{1160}\u{903}"],
-        &["\u{1160}", "\u{903}"],
-    ),
-    (
-        "\u{1160}\u{308}\u{903}",
-        &["\u{1160}\u{308}\u{903}"],
-        &["\u{1160}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{11a8}\u{903}",
-        &["\u{11a8}\u{903}"],
-        &["\u{11a8}", "\u{903}"],
-    ),
-    (
-        "\u{11a8}\u{308}\u{903}",
-        &["\u{11a8}\u{308}\u{903}"],
-        &["\u{11a8}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{ac00}\u{903}",
-        &["\u{ac00}\u{903}"],
-        &["\u{ac00}", "\u{903}"],
-    ),
-    (
-        "\u{ac00}\u{308}\u{903}",
-        &["\u{ac00}\u{308}\u{903}"],
-        &["\u{ac00}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{ac01}\u{903}",
-        &["\u{ac01}\u{903}"],
-        &["\u{ac01}", "\u{903}"],
-    ),
-    (
-        "\u{ac01}\u{308}\u{903}",
-        &["\u{ac01}\u{308}\u{903}"],
-        &["\u{ac01}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{231a}\u{903}",
-        &["\u{231a}\u{903}"],
-        &["\u{231a}", "\u{903}"],
-    ),
-    (
-        "\u{231a}\u{308}\u{903}",
-        &["\u{231a}\u{308}\u{903}"],
-        &["\u{231a}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{300}\u{903}",
-        &["\u{300}\u{903}"],
-        &["\u{300}", "\u{903}"],
-    ),
-    (
-        "\u{300}\u{308}\u{903}",
-        &["\u{300}\u{308}\u{903}"],
-        &["\u{300}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{200d}\u{903}",
-        &["\u{200d}\u{903}"],
-        &["\u{200d}", "\u{903}"],
-    ),
-    (
-        "\u{200d}\u{308}\u{903}",
-        &["\u{200d}\u{308}\u{903}"],
-        &["\u{200d}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{378}\u{903}",
-        &["\u{378}\u{903}"],
-        &["\u{378}", "\u{903}"],
-    ),
-    (
-        "\u{378}\u{308}\u{903}",
-        &["\u{378}\u{308}\u{903}"],
-        &["\u{378}\u{308}", "\u{903}"],
-    ),
-    (
-        "\u{61}\u{903}\u{62}",
-        &["\u{61}\u{903}", "\u{62}"],
-        &["\u{61}", "\u{903}", "\u{62}"],
-    ),
-    (
-        "\u{61}\u{600}\u{62}",
-        &["\u{61}", "\u{600}\u{62}"],
-        &["\u{61}", "\u{600}", "\u{62}"],
-    ),
-];
-
-// official Unicode test data
-// http://www.unicode.org/Public/15.0.0/ucd/auxiliary/WordBreakTest.txt
-pub const TEST_WORD: &'static [(&'static str, &'static [&'static str])] = &[
-    ("\u{1}\u{1}", &["\u{1}", "\u{1}"]),
-    ("\u{1}\u{308}\u{1}", &["\u{1}\u{308}", "\u{1}"]),
-    ("\u{1}\u{d}", &["\u{1}", "\u{d}"]),
-    ("\u{1}\u{308}\u{d}", &["\u{1}\u{308}", "\u{d}"]),
-    ("\u{1}\u{a}", &["\u{1}", "\u{a}"]),
-    ("\u{1}\u{308}\u{a}", &["\u{1}\u{308}", "\u{a}"]),
-    ("\u{1}\u{b}", &["\u{1}", "\u{b}"]),
-    ("\u{1}\u{308}\u{b}", &["\u{1}\u{308}", "\u{b}"]),
-    ("\u{1}\u{3031}", &["\u{1}", "\u{3031}"]),
-    ("\u{1}\u{308}\u{3031}", &["\u{1}\u{308}", "\u{3031}"]),
-    ("\u{1}\u{41}", &["\u{1}", "\u{41}"]),
-    ("\u{1}\u{308}\u{41}", &["\u{1}\u{308}", "\u{41}"]),
-    ("\u{1}\u{3a}", &["\u{1}", "\u{3a}"]),
-    ("\u{1}\u{308}\u{3a}", &["\u{1}\u{308}", "\u{3a}"]),
-    ("\u{1}\u{2c}", &["\u{1}", "\u{2c}"]),
-    ("\u{1}\u{308}\u{2c}", &["\u{1}\u{308}", "\u{2c}"]),
-    ("\u{1}\u{2e}", &["\u{1}", "\u{2e}"]),
-    ("\u{1}\u{308}\u{2e}", &["\u{1}\u{308}", "\u{2e}"]),
-    ("\u{1}\u{30}", &["\u{1}", "\u{30}"]),
-    ("\u{1}\u{308}\u{30}", &["\u{1}\u{308}", "\u{30}"]),
-    ("\u{1}\u{5f}", &["\u{1}", "\u{5f}"]),
-    ("\u{1}\u{308}\u{5f}", &["\u{1}\u{308}", "\u{5f}"]),
-    ("\u{1}\u{1f1e6}", &["\u{1}", "\u{1f1e6}"]),
-    ("\u{1}\u{308}\u{1f1e6}", &["\u{1}\u{308}", "\u{1f1e6}"]),
-    ("\u{1}\u{5d0}", &["\u{1}", "\u{5d0}"]),
-    ("\u{1}\u{308}\u{5d0}", &["\u{1}\u{308}", "\u{5d0}"]),
-    ("\u{1}\u{22}", &["\u{1}", "\u{22}"]),
-    ("\u{1}\u{308}\u{22}", &["\u{1}\u{308}", "\u{22}"]),
-    ("\u{1}\u{27}", &["\u{1}", "\u{27}"]),
-    ("\u{1}\u{308}\u{27}", &["\u{1}\u{308}", "\u{27}"]),
-    ("\u{1}\u{231a}", &["\u{1}", "\u{231a}"]),
-    ("\u{1}\u{308}\u{231a}", &["\u{1}\u{308}", "\u{231a}"]),
-    ("\u{1}\u{20}", &["\u{1}", "\u{20}"]),
-    ("\u{1}\u{308}\u{20}", &["\u{1}\u{308}", "\u{20}"]),
-    ("\u{1}\u{ad}", &["\u{1}\u{ad}"]),
-    ("\u{1}\u{308}\u{ad}", &["\u{1}\u{308}\u{ad}"]),
-    ("\u{1}\u{300}", &["\u{1}\u{300}"]),
-    ("\u{1}\u{308}\u{300}", &["\u{1}\u{308}\u{300}"]),
-    ("\u{1}\u{200d}", &["\u{1}\u{200d}"]),
-    ("\u{1}\u{308}\u{200d}", &["\u{1}\u{308}\u{200d}"]),
-    ("\u{1}\u{61}\u{2060}", &["\u{1}", "\u{61}\u{2060}"]),
-    (
-        "\u{1}\u{308}\u{61}\u{2060}",
-        &["\u{1}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{1}\u{61}\u{3a}", &["\u{1}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{1}\u{308}\u{61}\u{3a}",
-        &["\u{1}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{1}\u{61}\u{27}", &["\u{1}", "\u{61}", "\u{27}"]),
-    (
-        "\u{1}\u{308}\u{61}\u{27}",
-        &["\u{1}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{1}\u{61}\u{27}\u{2060}",
-        &["\u{1}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{1}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{1}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{1}\u{61}\u{2c}", &["\u{1}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{1}\u{308}\u{61}\u{2c}",
-        &["\u{1}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{1}\u{31}\u{3a}", &["\u{1}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{1}\u{308}\u{31}\u{3a}",
-        &["\u{1}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{1}\u{31}\u{27}", &["\u{1}", "\u{31}", "\u{27}"]),
-    (
-        "\u{1}\u{308}\u{31}\u{27}",
-        &["\u{1}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{1}\u{31}\u{2c}", &["\u{1}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{1}\u{308}\u{31}\u{2c}",
-        &["\u{1}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{1}\u{31}\u{2e}\u{2060}",
-        &["\u{1}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{1}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{1}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{d}\u{1}", &["\u{d}", "\u{1}"]),
-    ("\u{d}\u{308}\u{1}", &["\u{d}", "\u{308}", "\u{1}"]),
-    ("\u{d}\u{d}", &["\u{d}", "\u{d}"]),
-    ("\u{d}\u{308}\u{d}", &["\u{d}", "\u{308}", "\u{d}"]),
-    ("\u{d}\u{a}", &["\u{d}\u{a}"]),
-    ("\u{d}\u{308}\u{a}", &["\u{d}", "\u{308}", "\u{a}"]),
-    ("\u{d}\u{b}", &["\u{d}", "\u{b}"]),
-    ("\u{d}\u{308}\u{b}", &["\u{d}", "\u{308}", "\u{b}"]),
-    ("\u{d}\u{3031}", &["\u{d}", "\u{3031}"]),
-    ("\u{d}\u{308}\u{3031}", &["\u{d}", "\u{308}", "\u{3031}"]),
-    ("\u{d}\u{41}", &["\u{d}", "\u{41}"]),
-    ("\u{d}\u{308}\u{41}", &["\u{d}", "\u{308}", "\u{41}"]),
-    ("\u{d}\u{3a}", &["\u{d}", "\u{3a}"]),
-    ("\u{d}\u{308}\u{3a}", &["\u{d}", "\u{308}", "\u{3a}"]),
-    ("\u{d}\u{2c}", &["\u{d}", "\u{2c}"]),
-    ("\u{d}\u{308}\u{2c}", &["\u{d}", "\u{308}", "\u{2c}"]),
-    ("\u{d}\u{2e}", &["\u{d}", "\u{2e}"]),
-    ("\u{d}\u{308}\u{2e}", &["\u{d}", "\u{308}", "\u{2e}"]),
-    ("\u{d}\u{30}", &["\u{d}", "\u{30}"]),
-    ("\u{d}\u{308}\u{30}", &["\u{d}", "\u{308}", "\u{30}"]),
-    ("\u{d}\u{5f}", &["\u{d}", "\u{5f}"]),
-    ("\u{d}\u{308}\u{5f}", &["\u{d}", "\u{308}", "\u{5f}"]),
-    ("\u{d}\u{1f1e6}", &["\u{d}", "\u{1f1e6}"]),
-    ("\u{d}\u{308}\u{1f1e6}", &["\u{d}", "\u{308}", "\u{1f1e6}"]),
-    ("\u{d}\u{5d0}", &["\u{d}", "\u{5d0}"]),
-    ("\u{d}\u{308}\u{5d0}", &["\u{d}", "\u{308}", "\u{5d0}"]),
-    ("\u{d}\u{22}", &["\u{d}", "\u{22}"]),
-    ("\u{d}\u{308}\u{22}", &["\u{d}", "\u{308}", "\u{22}"]),
-    ("\u{d}\u{27}", &["\u{d}", "\u{27}"]),
-    ("\u{d}\u{308}\u{27}", &["\u{d}", "\u{308}", "\u{27}"]),
-    ("\u{d}\u{231a}", &["\u{d}", "\u{231a}"]),
-    ("\u{d}\u{308}\u{231a}", &["\u{d}", "\u{308}", "\u{231a}"]),
-    ("\u{d}\u{20}", &["\u{d}", "\u{20}"]),
-    ("\u{d}\u{308}\u{20}", &["\u{d}", "\u{308}", "\u{20}"]),
-    ("\u{d}\u{ad}", &["\u{d}", "\u{ad}"]),
-    ("\u{d}\u{308}\u{ad}", &["\u{d}", "\u{308}\u{ad}"]),
-    ("\u{d}\u{300}", &["\u{d}", "\u{300}"]),
-    ("\u{d}\u{308}\u{300}", &["\u{d}", "\u{308}\u{300}"]),
-    ("\u{d}\u{200d}", &["\u{d}", "\u{200d}"]),
-    ("\u{d}\u{308}\u{200d}", &["\u{d}", "\u{308}\u{200d}"]),
-    ("\u{d}\u{61}\u{2060}", &["\u{d}", "\u{61}\u{2060}"]),
-    (
-        "\u{d}\u{308}\u{61}\u{2060}",
-        &["\u{d}", "\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{d}\u{61}\u{3a}", &["\u{d}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{d}\u{308}\u{61}\u{3a}",
-        &["\u{d}", "\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{d}\u{61}\u{27}", &["\u{d}", "\u{61}", "\u{27}"]),
-    (
-        "\u{d}\u{308}\u{61}\u{27}",
-        &["\u{d}", "\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{d}\u{61}\u{27}\u{2060}",
-        &["\u{d}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{d}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{d}", "\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{d}\u{61}\u{2c}", &["\u{d}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{d}\u{308}\u{61}\u{2c}",
-        &["\u{d}", "\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{d}\u{31}\u{3a}", &["\u{d}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{d}\u{308}\u{31}\u{3a}",
-        &["\u{d}", "\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{d}\u{31}\u{27}", &["\u{d}", "\u{31}", "\u{27}"]),
-    (
-        "\u{d}\u{308}\u{31}\u{27}",
-        &["\u{d}", "\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{d}\u{31}\u{2c}", &["\u{d}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{d}\u{308}\u{31}\u{2c}",
-        &["\u{d}", "\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{d}\u{31}\u{2e}\u{2060}",
-        &["\u{d}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{d}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{d}", "\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{a}\u{1}", &["\u{a}", "\u{1}"]),
-    ("\u{a}\u{308}\u{1}", &["\u{a}", "\u{308}", "\u{1}"]),
-    ("\u{a}\u{d}", &["\u{a}", "\u{d}"]),
-    ("\u{a}\u{308}\u{d}", &["\u{a}", "\u{308}", "\u{d}"]),
-    ("\u{a}\u{a}", &["\u{a}", "\u{a}"]),
-    ("\u{a}\u{308}\u{a}", &["\u{a}", "\u{308}", "\u{a}"]),
-    ("\u{a}\u{b}", &["\u{a}", "\u{b}"]),
-    ("\u{a}\u{308}\u{b}", &["\u{a}", "\u{308}", "\u{b}"]),
-    ("\u{a}\u{3031}", &["\u{a}", "\u{3031}"]),
-    ("\u{a}\u{308}\u{3031}", &["\u{a}", "\u{308}", "\u{3031}"]),
-    ("\u{a}\u{41}", &["\u{a}", "\u{41}"]),
-    ("\u{a}\u{308}\u{41}", &["\u{a}", "\u{308}", "\u{41}"]),
-    ("\u{a}\u{3a}", &["\u{a}", "\u{3a}"]),
-    ("\u{a}\u{308}\u{3a}", &["\u{a}", "\u{308}", "\u{3a}"]),
-    ("\u{a}\u{2c}", &["\u{a}", "\u{2c}"]),
-    ("\u{a}\u{308}\u{2c}", &["\u{a}", "\u{308}", "\u{2c}"]),
-    ("\u{a}\u{2e}", &["\u{a}", "\u{2e}"]),
-    ("\u{a}\u{308}\u{2e}", &["\u{a}", "\u{308}", "\u{2e}"]),
-    ("\u{a}\u{30}", &["\u{a}", "\u{30}"]),
-    ("\u{a}\u{308}\u{30}", &["\u{a}", "\u{308}", "\u{30}"]),
-    ("\u{a}\u{5f}", &["\u{a}", "\u{5f}"]),
-    ("\u{a}\u{308}\u{5f}", &["\u{a}", "\u{308}", "\u{5f}"]),
-    ("\u{a}\u{1f1e6}", &["\u{a}", "\u{1f1e6}"]),
-    ("\u{a}\u{308}\u{1f1e6}", &["\u{a}", "\u{308}", "\u{1f1e6}"]),
-    ("\u{a}\u{5d0}", &["\u{a}", "\u{5d0}"]),
-    ("\u{a}\u{308}\u{5d0}", &["\u{a}", "\u{308}", "\u{5d0}"]),
-    ("\u{a}\u{22}", &["\u{a}", "\u{22}"]),
-    ("\u{a}\u{308}\u{22}", &["\u{a}", "\u{308}", "\u{22}"]),
-    ("\u{a}\u{27}", &["\u{a}", "\u{27}"]),
-    ("\u{a}\u{308}\u{27}", &["\u{a}", "\u{308}", "\u{27}"]),
-    ("\u{a}\u{231a}", &["\u{a}", "\u{231a}"]),
-    ("\u{a}\u{308}\u{231a}", &["\u{a}", "\u{308}", "\u{231a}"]),
-    ("\u{a}\u{20}", &["\u{a}", "\u{20}"]),
-    ("\u{a}\u{308}\u{20}", &["\u{a}", "\u{308}", "\u{20}"]),
-    ("\u{a}\u{ad}", &["\u{a}", "\u{ad}"]),
-    ("\u{a}\u{308}\u{ad}", &["\u{a}", "\u{308}\u{ad}"]),
-    ("\u{a}\u{300}", &["\u{a}", "\u{300}"]),
-    ("\u{a}\u{308}\u{300}", &["\u{a}", "\u{308}\u{300}"]),
-    ("\u{a}\u{200d}", &["\u{a}", "\u{200d}"]),
-    ("\u{a}\u{308}\u{200d}", &["\u{a}", "\u{308}\u{200d}"]),
-    ("\u{a}\u{61}\u{2060}", &["\u{a}", "\u{61}\u{2060}"]),
-    (
-        "\u{a}\u{308}\u{61}\u{2060}",
-        &["\u{a}", "\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{a}\u{61}\u{3a}", &["\u{a}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{a}\u{308}\u{61}\u{3a}",
-        &["\u{a}", "\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{a}\u{61}\u{27}", &["\u{a}", "\u{61}", "\u{27}"]),
-    (
-        "\u{a}\u{308}\u{61}\u{27}",
-        &["\u{a}", "\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{a}\u{61}\u{27}\u{2060}",
-        &["\u{a}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{a}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{a}", "\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{a}\u{61}\u{2c}", &["\u{a}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{a}\u{308}\u{61}\u{2c}",
-        &["\u{a}", "\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{a}\u{31}\u{3a}", &["\u{a}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{a}\u{308}\u{31}\u{3a}",
-        &["\u{a}", "\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{a}\u{31}\u{27}", &["\u{a}", "\u{31}", "\u{27}"]),
-    (
-        "\u{a}\u{308}\u{31}\u{27}",
-        &["\u{a}", "\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{a}\u{31}\u{2c}", &["\u{a}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{a}\u{308}\u{31}\u{2c}",
-        &["\u{a}", "\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{a}\u{31}\u{2e}\u{2060}",
-        &["\u{a}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{a}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{a}", "\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{b}\u{1}", &["\u{b}", "\u{1}"]),
-    ("\u{b}\u{308}\u{1}", &["\u{b}", "\u{308}", "\u{1}"]),
-    ("\u{b}\u{d}", &["\u{b}", "\u{d}"]),
-    ("\u{b}\u{308}\u{d}", &["\u{b}", "\u{308}", "\u{d}"]),
-    ("\u{b}\u{a}", &["\u{b}", "\u{a}"]),
-    ("\u{b}\u{308}\u{a}", &["\u{b}", "\u{308}", "\u{a}"]),
-    ("\u{b}\u{b}", &["\u{b}", "\u{b}"]),
-    ("\u{b}\u{308}\u{b}", &["\u{b}", "\u{308}", "\u{b}"]),
-    ("\u{b}\u{3031}", &["\u{b}", "\u{3031}"]),
-    ("\u{b}\u{308}\u{3031}", &["\u{b}", "\u{308}", "\u{3031}"]),
-    ("\u{b}\u{41}", &["\u{b}", "\u{41}"]),
-    ("\u{b}\u{308}\u{41}", &["\u{b}", "\u{308}", "\u{41}"]),
-    ("\u{b}\u{3a}", &["\u{b}", "\u{3a}"]),
-    ("\u{b}\u{308}\u{3a}", &["\u{b}", "\u{308}", "\u{3a}"]),
-    ("\u{b}\u{2c}", &["\u{b}", "\u{2c}"]),
-    ("\u{b}\u{308}\u{2c}", &["\u{b}", "\u{308}", "\u{2c}"]),
-    ("\u{b}\u{2e}", &["\u{b}", "\u{2e}"]),
-    ("\u{b}\u{308}\u{2e}", &["\u{b}", "\u{308}", "\u{2e}"]),
-    ("\u{b}\u{30}", &["\u{b}", "\u{30}"]),
-    ("\u{b}\u{308}\u{30}", &["\u{b}", "\u{308}", "\u{30}"]),
-    ("\u{b}\u{5f}", &["\u{b}", "\u{5f}"]),
-    ("\u{b}\u{308}\u{5f}", &["\u{b}", "\u{308}", "\u{5f}"]),
-    ("\u{b}\u{1f1e6}", &["\u{b}", "\u{1f1e6}"]),
-    ("\u{b}\u{308}\u{1f1e6}", &["\u{b}", "\u{308}", "\u{1f1e6}"]),
-    ("\u{b}\u{5d0}", &["\u{b}", "\u{5d0}"]),
-    ("\u{b}\u{308}\u{5d0}", &["\u{b}", "\u{308}", "\u{5d0}"]),
-    ("\u{b}\u{22}", &["\u{b}", "\u{22}"]),
-    ("\u{b}\u{308}\u{22}", &["\u{b}", "\u{308}", "\u{22}"]),
-    ("\u{b}\u{27}", &["\u{b}", "\u{27}"]),
-    ("\u{b}\u{308}\u{27}", &["\u{b}", "\u{308}", "\u{27}"]),
-    ("\u{b}\u{231a}", &["\u{b}", "\u{231a}"]),
-    ("\u{b}\u{308}\u{231a}", &["\u{b}", "\u{308}", "\u{231a}"]),
-    ("\u{b}\u{20}", &["\u{b}", "\u{20}"]),
-    ("\u{b}\u{308}\u{20}", &["\u{b}", "\u{308}", "\u{20}"]),
-    ("\u{b}\u{ad}", &["\u{b}", "\u{ad}"]),
-    ("\u{b}\u{308}\u{ad}", &["\u{b}", "\u{308}\u{ad}"]),
-    ("\u{b}\u{300}", &["\u{b}", "\u{300}"]),
-    ("\u{b}\u{308}\u{300}", &["\u{b}", "\u{308}\u{300}"]),
-    ("\u{b}\u{200d}", &["\u{b}", "\u{200d}"]),
-    ("\u{b}\u{308}\u{200d}", &["\u{b}", "\u{308}\u{200d}"]),
-    ("\u{b}\u{61}\u{2060}", &["\u{b}", "\u{61}\u{2060}"]),
-    (
-        "\u{b}\u{308}\u{61}\u{2060}",
-        &["\u{b}", "\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{b}\u{61}\u{3a}", &["\u{b}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{b}\u{308}\u{61}\u{3a}",
-        &["\u{b}", "\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{b}\u{61}\u{27}", &["\u{b}", "\u{61}", "\u{27}"]),
-    (
-        "\u{b}\u{308}\u{61}\u{27}",
-        &["\u{b}", "\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{b}\u{61}\u{27}\u{2060}",
-        &["\u{b}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{b}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{b}", "\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{b}\u{61}\u{2c}", &["\u{b}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{b}\u{308}\u{61}\u{2c}",
-        &["\u{b}", "\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{b}\u{31}\u{3a}", &["\u{b}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{b}\u{308}\u{31}\u{3a}",
-        &["\u{b}", "\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{b}\u{31}\u{27}", &["\u{b}", "\u{31}", "\u{27}"]),
-    (
-        "\u{b}\u{308}\u{31}\u{27}",
-        &["\u{b}", "\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{b}\u{31}\u{2c}", &["\u{b}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{b}\u{308}\u{31}\u{2c}",
-        &["\u{b}", "\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{b}\u{31}\u{2e}\u{2060}",
-        &["\u{b}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{b}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{b}", "\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{3031}\u{1}", &["\u{3031}", "\u{1}"]),
-    ("\u{3031}\u{308}\u{1}", &["\u{3031}\u{308}", "\u{1}"]),
-    ("\u{3031}\u{d}", &["\u{3031}", "\u{d}"]),
-    ("\u{3031}\u{308}\u{d}", &["\u{3031}\u{308}", "\u{d}"]),
-    ("\u{3031}\u{a}", &["\u{3031}", "\u{a}"]),
-    ("\u{3031}\u{308}\u{a}", &["\u{3031}\u{308}", "\u{a}"]),
-    ("\u{3031}\u{b}", &["\u{3031}", "\u{b}"]),
-    ("\u{3031}\u{308}\u{b}", &["\u{3031}\u{308}", "\u{b}"]),
-    ("\u{3031}\u{3031}", &["\u{3031}\u{3031}"]),
-    ("\u{3031}\u{308}\u{3031}", &["\u{3031}\u{308}\u{3031}"]),
-    ("\u{3031}\u{41}", &["\u{3031}", "\u{41}"]),
-    ("\u{3031}\u{308}\u{41}", &["\u{3031}\u{308}", "\u{41}"]),
-    ("\u{3031}\u{3a}", &["\u{3031}", "\u{3a}"]),
-    ("\u{3031}\u{308}\u{3a}", &["\u{3031}\u{308}", "\u{3a}"]),
-    ("\u{3031}\u{2c}", &["\u{3031}", "\u{2c}"]),
-    ("\u{3031}\u{308}\u{2c}", &["\u{3031}\u{308}", "\u{2c}"]),
-    ("\u{3031}\u{2e}", &["\u{3031}", "\u{2e}"]),
-    ("\u{3031}\u{308}\u{2e}", &["\u{3031}\u{308}", "\u{2e}"]),
-    ("\u{3031}\u{30}", &["\u{3031}", "\u{30}"]),
-    ("\u{3031}\u{308}\u{30}", &["\u{3031}\u{308}", "\u{30}"]),
-    ("\u{3031}\u{5f}", &["\u{3031}\u{5f}"]),
-    ("\u{3031}\u{308}\u{5f}", &["\u{3031}\u{308}\u{5f}"]),
-    ("\u{3031}\u{1f1e6}", &["\u{3031}", "\u{1f1e6}"]),
-    (
-        "\u{3031}\u{308}\u{1f1e6}",
-        &["\u{3031}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{3031}\u{5d0}", &["\u{3031}", "\u{5d0}"]),
-    ("\u{3031}\u{308}\u{5d0}", &["\u{3031}\u{308}", "\u{5d0}"]),
-    ("\u{3031}\u{22}", &["\u{3031}", "\u{22}"]),
-    ("\u{3031}\u{308}\u{22}", &["\u{3031}\u{308}", "\u{22}"]),
-    ("\u{3031}\u{27}", &["\u{3031}", "\u{27}"]),
-    ("\u{3031}\u{308}\u{27}", &["\u{3031}\u{308}", "\u{27}"]),
-    ("\u{3031}\u{231a}", &["\u{3031}", "\u{231a}"]),
-    ("\u{3031}\u{308}\u{231a}", &["\u{3031}\u{308}", "\u{231a}"]),
-    ("\u{3031}\u{20}", &["\u{3031}", "\u{20}"]),
-    ("\u{3031}\u{308}\u{20}", &["\u{3031}\u{308}", "\u{20}"]),
-    ("\u{3031}\u{ad}", &["\u{3031}\u{ad}"]),
-    ("\u{3031}\u{308}\u{ad}", &["\u{3031}\u{308}\u{ad}"]),
-    ("\u{3031}\u{300}", &["\u{3031}\u{300}"]),
-    ("\u{3031}\u{308}\u{300}", &["\u{3031}\u{308}\u{300}"]),
-    ("\u{3031}\u{200d}", &["\u{3031}\u{200d}"]),
-    ("\u{3031}\u{308}\u{200d}", &["\u{3031}\u{308}\u{200d}"]),
-    ("\u{3031}\u{61}\u{2060}", &["\u{3031}", "\u{61}\u{2060}"]),
-    (
-        "\u{3031}\u{308}\u{61}\u{2060}",
-        &["\u{3031}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{3031}\u{61}\u{3a}", &["\u{3031}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{3031}\u{308}\u{61}\u{3a}",
-        &["\u{3031}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{3031}\u{61}\u{27}", &["\u{3031}", "\u{61}", "\u{27}"]),
-    (
-        "\u{3031}\u{308}\u{61}\u{27}",
-        &["\u{3031}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{3031}\u{61}\u{27}\u{2060}",
-        &["\u{3031}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{3031}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{3031}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{3031}\u{61}\u{2c}", &["\u{3031}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{3031}\u{308}\u{61}\u{2c}",
-        &["\u{3031}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{3031}\u{31}\u{3a}", &["\u{3031}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{3031}\u{308}\u{31}\u{3a}",
-        &["\u{3031}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{3031}\u{31}\u{27}", &["\u{3031}", "\u{31}", "\u{27}"]),
-    (
-        "\u{3031}\u{308}\u{31}\u{27}",
-        &["\u{3031}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{3031}\u{31}\u{2c}", &["\u{3031}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{3031}\u{308}\u{31}\u{2c}",
-        &["\u{3031}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{3031}\u{31}\u{2e}\u{2060}",
-        &["\u{3031}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{3031}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{3031}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{41}\u{1}", &["\u{41}", "\u{1}"]),
-    ("\u{41}\u{308}\u{1}", &["\u{41}\u{308}", "\u{1}"]),
-    ("\u{41}\u{d}", &["\u{41}", "\u{d}"]),
-    ("\u{41}\u{308}\u{d}", &["\u{41}\u{308}", "\u{d}"]),
-    ("\u{41}\u{a}", &["\u{41}", "\u{a}"]),
-    ("\u{41}\u{308}\u{a}", &["\u{41}\u{308}", "\u{a}"]),
-    ("\u{41}\u{b}", &["\u{41}", "\u{b}"]),
-    ("\u{41}\u{308}\u{b}", &["\u{41}\u{308}", "\u{b}"]),
-    ("\u{41}\u{3031}", &["\u{41}", "\u{3031}"]),
-    ("\u{41}\u{308}\u{3031}", &["\u{41}\u{308}", "\u{3031}"]),
-    ("\u{41}\u{41}", &["\u{41}\u{41}"]),
-    ("\u{41}\u{308}\u{41}", &["\u{41}\u{308}\u{41}"]),
-    ("\u{41}\u{3a}", &["\u{41}", "\u{3a}"]),
-    ("\u{41}\u{308}\u{3a}", &["\u{41}\u{308}", "\u{3a}"]),
-    ("\u{41}\u{2c}", &["\u{41}", "\u{2c}"]),
-    ("\u{41}\u{308}\u{2c}", &["\u{41}\u{308}", "\u{2c}"]),
-    ("\u{41}\u{2e}", &["\u{41}", "\u{2e}"]),
-    ("\u{41}\u{308}\u{2e}", &["\u{41}\u{308}", "\u{2e}"]),
-    ("\u{41}\u{30}", &["\u{41}\u{30}"]),
-    ("\u{41}\u{308}\u{30}", &["\u{41}\u{308}\u{30}"]),
-    ("\u{41}\u{5f}", &["\u{41}\u{5f}"]),
-    ("\u{41}\u{308}\u{5f}", &["\u{41}\u{308}\u{5f}"]),
-    ("\u{41}\u{1f1e6}", &["\u{41}", "\u{1f1e6}"]),
-    ("\u{41}\u{308}\u{1f1e6}", &["\u{41}\u{308}", "\u{1f1e6}"]),
-    ("\u{41}\u{5d0}", &["\u{41}\u{5d0}"]),
-    ("\u{41}\u{308}\u{5d0}", &["\u{41}\u{308}\u{5d0}"]),
-    ("\u{41}\u{22}", &["\u{41}", "\u{22}"]),
-    ("\u{41}\u{308}\u{22}", &["\u{41}\u{308}", "\u{22}"]),
-    ("\u{41}\u{27}", &["\u{41}", "\u{27}"]),
-    ("\u{41}\u{308}\u{27}", &["\u{41}\u{308}", "\u{27}"]),
-    ("\u{41}\u{231a}", &["\u{41}", "\u{231a}"]),
-    ("\u{41}\u{308}\u{231a}", &["\u{41}\u{308}", "\u{231a}"]),
-    ("\u{41}\u{20}", &["\u{41}", "\u{20}"]),
-    ("\u{41}\u{308}\u{20}", &["\u{41}\u{308}", "\u{20}"]),
-    ("\u{41}\u{ad}", &["\u{41}\u{ad}"]),
-    ("\u{41}\u{308}\u{ad}", &["\u{41}\u{308}\u{ad}"]),
-    ("\u{41}\u{300}", &["\u{41}\u{300}"]),
-    ("\u{41}\u{308}\u{300}", &["\u{41}\u{308}\u{300}"]),
-    ("\u{41}\u{200d}", &["\u{41}\u{200d}"]),
-    ("\u{41}\u{308}\u{200d}", &["\u{41}\u{308}\u{200d}"]),
-    ("\u{41}\u{61}\u{2060}", &["\u{41}\u{61}\u{2060}"]),
-    (
-        "\u{41}\u{308}\u{61}\u{2060}",
-        &["\u{41}\u{308}\u{61}\u{2060}"],
-    ),
-    ("\u{41}\u{61}\u{3a}", &["\u{41}\u{61}", "\u{3a}"]),
-    (
-        "\u{41}\u{308}\u{61}\u{3a}",
-        &["\u{41}\u{308}\u{61}", "\u{3a}"],
-    ),
-    ("\u{41}\u{61}\u{27}", &["\u{41}\u{61}", "\u{27}"]),
-    (
-        "\u{41}\u{308}\u{61}\u{27}",
-        &["\u{41}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{41}\u{61}\u{27}\u{2060}",
-        &["\u{41}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{41}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{41}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{41}\u{61}\u{2c}", &["\u{41}\u{61}", "\u{2c}"]),
-    (
-        "\u{41}\u{308}\u{61}\u{2c}",
-        &["\u{41}\u{308}\u{61}", "\u{2c}"],
-    ),
-    ("\u{41}\u{31}\u{3a}", &["\u{41}\u{31}", "\u{3a}"]),
-    (
-        "\u{41}\u{308}\u{31}\u{3a}",
-        &["\u{41}\u{308}\u{31}", "\u{3a}"],
-    ),
-    ("\u{41}\u{31}\u{27}", &["\u{41}\u{31}", "\u{27}"]),
-    (
-        "\u{41}\u{308}\u{31}\u{27}",
-        &["\u{41}\u{308}\u{31}", "\u{27}"],
-    ),
-    ("\u{41}\u{31}\u{2c}", &["\u{41}\u{31}", "\u{2c}"]),
-    (
-        "\u{41}\u{308}\u{31}\u{2c}",
-        &["\u{41}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{41}\u{31}\u{2e}\u{2060}",
-        &["\u{41}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{41}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{41}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{3a}\u{1}", &["\u{3a}", "\u{1}"]),
-    ("\u{3a}\u{308}\u{1}", &["\u{3a}\u{308}", "\u{1}"]),
-    ("\u{3a}\u{d}", &["\u{3a}", "\u{d}"]),
-    ("\u{3a}\u{308}\u{d}", &["\u{3a}\u{308}", "\u{d}"]),
-    ("\u{3a}\u{a}", &["\u{3a}", "\u{a}"]),
-    ("\u{3a}\u{308}\u{a}", &["\u{3a}\u{308}", "\u{a}"]),
-    ("\u{3a}\u{b}", &["\u{3a}", "\u{b}"]),
-    ("\u{3a}\u{308}\u{b}", &["\u{3a}\u{308}", "\u{b}"]),
-    ("\u{3a}\u{3031}", &["\u{3a}", "\u{3031}"]),
-    ("\u{3a}\u{308}\u{3031}", &["\u{3a}\u{308}", "\u{3031}"]),
-    ("\u{3a}\u{41}", &["\u{3a}", "\u{41}"]),
-    ("\u{3a}\u{308}\u{41}", &["\u{3a}\u{308}", "\u{41}"]),
-    ("\u{3a}\u{3a}", &["\u{3a}", "\u{3a}"]),
-    ("\u{3a}\u{308}\u{3a}", &["\u{3a}\u{308}", "\u{3a}"]),
-    ("\u{3a}\u{2c}", &["\u{3a}", "\u{2c}"]),
-    ("\u{3a}\u{308}\u{2c}", &["\u{3a}\u{308}", "\u{2c}"]),
-    ("\u{3a}\u{2e}", &["\u{3a}", "\u{2e}"]),
-    ("\u{3a}\u{308}\u{2e}", &["\u{3a}\u{308}", "\u{2e}"]),
-    ("\u{3a}\u{30}", &["\u{3a}", "\u{30}"]),
-    ("\u{3a}\u{308}\u{30}", &["\u{3a}\u{308}", "\u{30}"]),
-    ("\u{3a}\u{5f}", &["\u{3a}", "\u{5f}"]),
-    ("\u{3a}\u{308}\u{5f}", &["\u{3a}\u{308}", "\u{5f}"]),
-    ("\u{3a}\u{1f1e6}", &["\u{3a}", "\u{1f1e6}"]),
-    ("\u{3a}\u{308}\u{1f1e6}", &["\u{3a}\u{308}", "\u{1f1e6}"]),
-    ("\u{3a}\u{5d0}", &["\u{3a}", "\u{5d0}"]),
-    ("\u{3a}\u{308}\u{5d0}", &["\u{3a}\u{308}", "\u{5d0}"]),
-    ("\u{3a}\u{22}", &["\u{3a}", "\u{22}"]),
-    ("\u{3a}\u{308}\u{22}", &["\u{3a}\u{308}", "\u{22}"]),
-    ("\u{3a}\u{27}", &["\u{3a}", "\u{27}"]),
-    ("\u{3a}\u{308}\u{27}", &["\u{3a}\u{308}", "\u{27}"]),
-    ("\u{3a}\u{231a}", &["\u{3a}", "\u{231a}"]),
-    ("\u{3a}\u{308}\u{231a}", &["\u{3a}\u{308}", "\u{231a}"]),
-    ("\u{3a}\u{20}", &["\u{3a}", "\u{20}"]),
-    ("\u{3a}\u{308}\u{20}", &["\u{3a}\u{308}", "\u{20}"]),
-    ("\u{3a}\u{ad}", &["\u{3a}\u{ad}"]),
-    ("\u{3a}\u{308}\u{ad}", &["\u{3a}\u{308}\u{ad}"]),
-    ("\u{3a}\u{300}", &["\u{3a}\u{300}"]),
-    ("\u{3a}\u{308}\u{300}", &["\u{3a}\u{308}\u{300}"]),
-    ("\u{3a}\u{200d}", &["\u{3a}\u{200d}"]),
-    ("\u{3a}\u{308}\u{200d}", &["\u{3a}\u{308}\u{200d}"]),
-    ("\u{3a}\u{61}\u{2060}", &["\u{3a}", "\u{61}\u{2060}"]),
-    (
-        "\u{3a}\u{308}\u{61}\u{2060}",
-        &["\u{3a}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{3a}\u{61}\u{3a}", &["\u{3a}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{3a}\u{308}\u{61}\u{3a}",
-        &["\u{3a}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{3a}\u{61}\u{27}", &["\u{3a}", "\u{61}", "\u{27}"]),
-    (
-        "\u{3a}\u{308}\u{61}\u{27}",
-        &["\u{3a}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{3a}\u{61}\u{27}\u{2060}",
-        &["\u{3a}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{3a}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{3a}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{3a}\u{61}\u{2c}", &["\u{3a}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{3a}\u{308}\u{61}\u{2c}",
-        &["\u{3a}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{3a}\u{31}\u{3a}", &["\u{3a}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{3a}\u{308}\u{31}\u{3a}",
-        &["\u{3a}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{3a}\u{31}\u{27}", &["\u{3a}", "\u{31}", "\u{27}"]),
-    (
-        "\u{3a}\u{308}\u{31}\u{27}",
-        &["\u{3a}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{3a}\u{31}\u{2c}", &["\u{3a}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{3a}\u{308}\u{31}\u{2c}",
-        &["\u{3a}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{3a}\u{31}\u{2e}\u{2060}",
-        &["\u{3a}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{3a}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{3a}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{2c}\u{1}", &["\u{2c}", "\u{1}"]),
-    ("\u{2c}\u{308}\u{1}", &["\u{2c}\u{308}", "\u{1}"]),
-    ("\u{2c}\u{d}", &["\u{2c}", "\u{d}"]),
-    ("\u{2c}\u{308}\u{d}", &["\u{2c}\u{308}", "\u{d}"]),
-    ("\u{2c}\u{a}", &["\u{2c}", "\u{a}"]),
-    ("\u{2c}\u{308}\u{a}", &["\u{2c}\u{308}", "\u{a}"]),
-    ("\u{2c}\u{b}", &["\u{2c}", "\u{b}"]),
-    ("\u{2c}\u{308}\u{b}", &["\u{2c}\u{308}", "\u{b}"]),
-    ("\u{2c}\u{3031}", &["\u{2c}", "\u{3031}"]),
-    ("\u{2c}\u{308}\u{3031}", &["\u{2c}\u{308}", "\u{3031}"]),
-    ("\u{2c}\u{41}", &["\u{2c}", "\u{41}"]),
-    ("\u{2c}\u{308}\u{41}", &["\u{2c}\u{308}", "\u{41}"]),
-    ("\u{2c}\u{3a}", &["\u{2c}", "\u{3a}"]),
-    ("\u{2c}\u{308}\u{3a}", &["\u{2c}\u{308}", "\u{3a}"]),
-    ("\u{2c}\u{2c}", &["\u{2c}", "\u{2c}"]),
-    ("\u{2c}\u{308}\u{2c}", &["\u{2c}\u{308}", "\u{2c}"]),
-    ("\u{2c}\u{2e}", &["\u{2c}", "\u{2e}"]),
-    ("\u{2c}\u{308}\u{2e}", &["\u{2c}\u{308}", "\u{2e}"]),
-    ("\u{2c}\u{30}", &["\u{2c}", "\u{30}"]),
-    ("\u{2c}\u{308}\u{30}", &["\u{2c}\u{308}", "\u{30}"]),
-    ("\u{2c}\u{5f}", &["\u{2c}", "\u{5f}"]),
-    ("\u{2c}\u{308}\u{5f}", &["\u{2c}\u{308}", "\u{5f}"]),
-    ("\u{2c}\u{1f1e6}", &["\u{2c}", "\u{1f1e6}"]),
-    ("\u{2c}\u{308}\u{1f1e6}", &["\u{2c}\u{308}", "\u{1f1e6}"]),
-    ("\u{2c}\u{5d0}", &["\u{2c}", "\u{5d0}"]),
-    ("\u{2c}\u{308}\u{5d0}", &["\u{2c}\u{308}", "\u{5d0}"]),
-    ("\u{2c}\u{22}", &["\u{2c}", "\u{22}"]),
-    ("\u{2c}\u{308}\u{22}", &["\u{2c}\u{308}", "\u{22}"]),
-    ("\u{2c}\u{27}", &["\u{2c}", "\u{27}"]),
-    ("\u{2c}\u{308}\u{27}", &["\u{2c}\u{308}", "\u{27}"]),
-    ("\u{2c}\u{231a}", &["\u{2c}", "\u{231a}"]),
-    ("\u{2c}\u{308}\u{231a}", &["\u{2c}\u{308}", "\u{231a}"]),
-    ("\u{2c}\u{20}", &["\u{2c}", "\u{20}"]),
-    ("\u{2c}\u{308}\u{20}", &["\u{2c}\u{308}", "\u{20}"]),
-    ("\u{2c}\u{ad}", &["\u{2c}\u{ad}"]),
-    ("\u{2c}\u{308}\u{ad}", &["\u{2c}\u{308}\u{ad}"]),
-    ("\u{2c}\u{300}", &["\u{2c}\u{300}"]),
-    ("\u{2c}\u{308}\u{300}", &["\u{2c}\u{308}\u{300}"]),
-    ("\u{2c}\u{200d}", &["\u{2c}\u{200d}"]),
-    ("\u{2c}\u{308}\u{200d}", &["\u{2c}\u{308}\u{200d}"]),
-    ("\u{2c}\u{61}\u{2060}", &["\u{2c}", "\u{61}\u{2060}"]),
-    (
-        "\u{2c}\u{308}\u{61}\u{2060}",
-        &["\u{2c}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{2c}\u{61}\u{3a}", &["\u{2c}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{2c}\u{308}\u{61}\u{3a}",
-        &["\u{2c}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{2c}\u{61}\u{27}", &["\u{2c}", "\u{61}", "\u{27}"]),
-    (
-        "\u{2c}\u{308}\u{61}\u{27}",
-        &["\u{2c}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{2c}\u{61}\u{27}\u{2060}",
-        &["\u{2c}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{2c}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{2c}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{2c}\u{61}\u{2c}", &["\u{2c}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{2c}\u{308}\u{61}\u{2c}",
-        &["\u{2c}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{2c}\u{31}\u{3a}", &["\u{2c}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{2c}\u{308}\u{31}\u{3a}",
-        &["\u{2c}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{2c}\u{31}\u{27}", &["\u{2c}", "\u{31}", "\u{27}"]),
-    (
-        "\u{2c}\u{308}\u{31}\u{27}",
-        &["\u{2c}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{2c}\u{31}\u{2c}", &["\u{2c}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{2c}\u{308}\u{31}\u{2c}",
-        &["\u{2c}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{2c}\u{31}\u{2e}\u{2060}",
-        &["\u{2c}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{2c}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{2c}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{2e}\u{1}", &["\u{2e}", "\u{1}"]),
-    ("\u{2e}\u{308}\u{1}", &["\u{2e}\u{308}", "\u{1}"]),
-    ("\u{2e}\u{d}", &["\u{2e}", "\u{d}"]),
-    ("\u{2e}\u{308}\u{d}", &["\u{2e}\u{308}", "\u{d}"]),
-    ("\u{2e}\u{a}", &["\u{2e}", "\u{a}"]),
-    ("\u{2e}\u{308}\u{a}", &["\u{2e}\u{308}", "\u{a}"]),
-    ("\u{2e}\u{b}", &["\u{2e}", "\u{b}"]),
-    ("\u{2e}\u{308}\u{b}", &["\u{2e}\u{308}", "\u{b}"]),
-    ("\u{2e}\u{3031}", &["\u{2e}", "\u{3031}"]),
-    ("\u{2e}\u{308}\u{3031}", &["\u{2e}\u{308}", "\u{3031}"]),
-    ("\u{2e}\u{41}", &["\u{2e}", "\u{41}"]),
-    ("\u{2e}\u{308}\u{41}", &["\u{2e}\u{308}", "\u{41}"]),
-    ("\u{2e}\u{3a}", &["\u{2e}", "\u{3a}"]),
-    ("\u{2e}\u{308}\u{3a}", &["\u{2e}\u{308}", "\u{3a}"]),
-    ("\u{2e}\u{2c}", &["\u{2e}", "\u{2c}"]),
-    ("\u{2e}\u{308}\u{2c}", &["\u{2e}\u{308}", "\u{2c}"]),
-    ("\u{2e}\u{2e}", &["\u{2e}", "\u{2e}"]),
-    ("\u{2e}\u{308}\u{2e}", &["\u{2e}\u{308}", "\u{2e}"]),
-    ("\u{2e}\u{30}", &["\u{2e}", "\u{30}"]),
-    ("\u{2e}\u{308}\u{30}", &["\u{2e}\u{308}", "\u{30}"]),
-    ("\u{2e}\u{5f}", &["\u{2e}", "\u{5f}"]),
-    ("\u{2e}\u{308}\u{5f}", &["\u{2e}\u{308}", "\u{5f}"]),
-    ("\u{2e}\u{1f1e6}", &["\u{2e}", "\u{1f1e6}"]),
-    ("\u{2e}\u{308}\u{1f1e6}", &["\u{2e}\u{308}", "\u{1f1e6}"]),
-    ("\u{2e}\u{5d0}", &["\u{2e}", "\u{5d0}"]),
-    ("\u{2e}\u{308}\u{5d0}", &["\u{2e}\u{308}", "\u{5d0}"]),
-    ("\u{2e}\u{22}", &["\u{2e}", "\u{22}"]),
-    ("\u{2e}\u{308}\u{22}", &["\u{2e}\u{308}", "\u{22}"]),
-    ("\u{2e}\u{27}", &["\u{2e}", "\u{27}"]),
-    ("\u{2e}\u{308}\u{27}", &["\u{2e}\u{308}", "\u{27}"]),
-    ("\u{2e}\u{231a}", &["\u{2e}", "\u{231a}"]),
-    ("\u{2e}\u{308}\u{231a}", &["\u{2e}\u{308}", "\u{231a}"]),
-    ("\u{2e}\u{20}", &["\u{2e}", "\u{20}"]),
-    ("\u{2e}\u{308}\u{20}", &["\u{2e}\u{308}", "\u{20}"]),
-    ("\u{2e}\u{ad}", &["\u{2e}\u{ad}"]),
-    ("\u{2e}\u{308}\u{ad}", &["\u{2e}\u{308}\u{ad}"]),
-    ("\u{2e}\u{300}", &["\u{2e}\u{300}"]),
-    ("\u{2e}\u{308}\u{300}", &["\u{2e}\u{308}\u{300}"]),
-    ("\u{2e}\u{200d}", &["\u{2e}\u{200d}"]),
-    ("\u{2e}\u{308}\u{200d}", &["\u{2e}\u{308}\u{200d}"]),
-    ("\u{2e}\u{61}\u{2060}", &["\u{2e}", "\u{61}\u{2060}"]),
-    (
-        "\u{2e}\u{308}\u{61}\u{2060}",
-        &["\u{2e}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{2e}\u{61}\u{3a}", &["\u{2e}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{2e}\u{308}\u{61}\u{3a}",
-        &["\u{2e}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{2e}\u{61}\u{27}", &["\u{2e}", "\u{61}", "\u{27}"]),
-    (
-        "\u{2e}\u{308}\u{61}\u{27}",
-        &["\u{2e}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{2e}\u{61}\u{27}\u{2060}",
-        &["\u{2e}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{2e}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{2e}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{2e}\u{61}\u{2c}", &["\u{2e}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{2e}\u{308}\u{61}\u{2c}",
-        &["\u{2e}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{2e}\u{31}\u{3a}", &["\u{2e}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{2e}\u{308}\u{31}\u{3a}",
-        &["\u{2e}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{2e}\u{31}\u{27}", &["\u{2e}", "\u{31}", "\u{27}"]),
-    (
-        "\u{2e}\u{308}\u{31}\u{27}",
-        &["\u{2e}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{2e}\u{31}\u{2c}", &["\u{2e}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{2e}\u{308}\u{31}\u{2c}",
-        &["\u{2e}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{2e}\u{31}\u{2e}\u{2060}",
-        &["\u{2e}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{2e}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{2e}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{30}\u{1}", &["\u{30}", "\u{1}"]),
-    ("\u{30}\u{308}\u{1}", &["\u{30}\u{308}", "\u{1}"]),
-    ("\u{30}\u{d}", &["\u{30}", "\u{d}"]),
-    ("\u{30}\u{308}\u{d}", &["\u{30}\u{308}", "\u{d}"]),
-    ("\u{30}\u{a}", &["\u{30}", "\u{a}"]),
-    ("\u{30}\u{308}\u{a}", &["\u{30}\u{308}", "\u{a}"]),
-    ("\u{30}\u{b}", &["\u{30}", "\u{b}"]),
-    ("\u{30}\u{308}\u{b}", &["\u{30}\u{308}", "\u{b}"]),
-    ("\u{30}\u{3031}", &["\u{30}", "\u{3031}"]),
-    ("\u{30}\u{308}\u{3031}", &["\u{30}\u{308}", "\u{3031}"]),
-    ("\u{30}\u{41}", &["\u{30}\u{41}"]),
-    ("\u{30}\u{308}\u{41}", &["\u{30}\u{308}\u{41}"]),
-    ("\u{30}\u{3a}", &["\u{30}", "\u{3a}"]),
-    ("\u{30}\u{308}\u{3a}", &["\u{30}\u{308}", "\u{3a}"]),
-    ("\u{30}\u{2c}", &["\u{30}", "\u{2c}"]),
-    ("\u{30}\u{308}\u{2c}", &["\u{30}\u{308}", "\u{2c}"]),
-    ("\u{30}\u{2e}", &["\u{30}", "\u{2e}"]),
-    ("\u{30}\u{308}\u{2e}", &["\u{30}\u{308}", "\u{2e}"]),
-    ("\u{30}\u{30}", &["\u{30}\u{30}"]),
-    ("\u{30}\u{308}\u{30}", &["\u{30}\u{308}\u{30}"]),
-    ("\u{30}\u{5f}", &["\u{30}\u{5f}"]),
-    ("\u{30}\u{308}\u{5f}", &["\u{30}\u{308}\u{5f}"]),
-    ("\u{30}\u{1f1e6}", &["\u{30}", "\u{1f1e6}"]),
-    ("\u{30}\u{308}\u{1f1e6}", &["\u{30}\u{308}", "\u{1f1e6}"]),
-    ("\u{30}\u{5d0}", &["\u{30}\u{5d0}"]),
-    ("\u{30}\u{308}\u{5d0}", &["\u{30}\u{308}\u{5d0}"]),
-    ("\u{30}\u{22}", &["\u{30}", "\u{22}"]),
-    ("\u{30}\u{308}\u{22}", &["\u{30}\u{308}", "\u{22}"]),
-    ("\u{30}\u{27}", &["\u{30}", "\u{27}"]),
-    ("\u{30}\u{308}\u{27}", &["\u{30}\u{308}", "\u{27}"]),
-    ("\u{30}\u{231a}", &["\u{30}", "\u{231a}"]),
-    ("\u{30}\u{308}\u{231a}", &["\u{30}\u{308}", "\u{231a}"]),
-    ("\u{30}\u{20}", &["\u{30}", "\u{20}"]),
-    ("\u{30}\u{308}\u{20}", &["\u{30}\u{308}", "\u{20}"]),
-    ("\u{30}\u{ad}", &["\u{30}\u{ad}"]),
-    ("\u{30}\u{308}\u{ad}", &["\u{30}\u{308}\u{ad}"]),
-    ("\u{30}\u{300}", &["\u{30}\u{300}"]),
-    ("\u{30}\u{308}\u{300}", &["\u{30}\u{308}\u{300}"]),
-    ("\u{30}\u{200d}", &["\u{30}\u{200d}"]),
-    ("\u{30}\u{308}\u{200d}", &["\u{30}\u{308}\u{200d}"]),
-    ("\u{30}\u{61}\u{2060}", &["\u{30}\u{61}\u{2060}"]),
-    (
-        "\u{30}\u{308}\u{61}\u{2060}",
-        &["\u{30}\u{308}\u{61}\u{2060}"],
-    ),
-    ("\u{30}\u{61}\u{3a}", &["\u{30}\u{61}", "\u{3a}"]),
-    (
-        "\u{30}\u{308}\u{61}\u{3a}",
-        &["\u{30}\u{308}\u{61}", "\u{3a}"],
-    ),
-    ("\u{30}\u{61}\u{27}", &["\u{30}\u{61}", "\u{27}"]),
-    (
-        "\u{30}\u{308}\u{61}\u{27}",
-        &["\u{30}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{30}\u{61}\u{27}\u{2060}",
-        &["\u{30}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{30}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{30}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{30}\u{61}\u{2c}", &["\u{30}\u{61}", "\u{2c}"]),
-    (
-        "\u{30}\u{308}\u{61}\u{2c}",
-        &["\u{30}\u{308}\u{61}", "\u{2c}"],
-    ),
-    ("\u{30}\u{31}\u{3a}", &["\u{30}\u{31}", "\u{3a}"]),
-    (
-        "\u{30}\u{308}\u{31}\u{3a}",
-        &["\u{30}\u{308}\u{31}", "\u{3a}"],
-    ),
-    ("\u{30}\u{31}\u{27}", &["\u{30}\u{31}", "\u{27}"]),
-    (
-        "\u{30}\u{308}\u{31}\u{27}",
-        &["\u{30}\u{308}\u{31}", "\u{27}"],
-    ),
-    ("\u{30}\u{31}\u{2c}", &["\u{30}\u{31}", "\u{2c}"]),
-    (
-        "\u{30}\u{308}\u{31}\u{2c}",
-        &["\u{30}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{30}\u{31}\u{2e}\u{2060}",
-        &["\u{30}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{30}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{30}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{5f}\u{1}", &["\u{5f}", "\u{1}"]),
-    ("\u{5f}\u{308}\u{1}", &["\u{5f}\u{308}", "\u{1}"]),
-    ("\u{5f}\u{d}", &["\u{5f}", "\u{d}"]),
-    ("\u{5f}\u{308}\u{d}", &["\u{5f}\u{308}", "\u{d}"]),
-    ("\u{5f}\u{a}", &["\u{5f}", "\u{a}"]),
-    ("\u{5f}\u{308}\u{a}", &["\u{5f}\u{308}", "\u{a}"]),
-    ("\u{5f}\u{b}", &["\u{5f}", "\u{b}"]),
-    ("\u{5f}\u{308}\u{b}", &["\u{5f}\u{308}", "\u{b}"]),
-    ("\u{5f}\u{3031}", &["\u{5f}\u{3031}"]),
-    ("\u{5f}\u{308}\u{3031}", &["\u{5f}\u{308}\u{3031}"]),
-    ("\u{5f}\u{41}", &["\u{5f}\u{41}"]),
-    ("\u{5f}\u{308}\u{41}", &["\u{5f}\u{308}\u{41}"]),
-    ("\u{5f}\u{3a}", &["\u{5f}", "\u{3a}"]),
-    ("\u{5f}\u{308}\u{3a}", &["\u{5f}\u{308}", "\u{3a}"]),
-    ("\u{5f}\u{2c}", &["\u{5f}", "\u{2c}"]),
-    ("\u{5f}\u{308}\u{2c}", &["\u{5f}\u{308}", "\u{2c}"]),
-    ("\u{5f}\u{2e}", &["\u{5f}", "\u{2e}"]),
-    ("\u{5f}\u{308}\u{2e}", &["\u{5f}\u{308}", "\u{2e}"]),
-    ("\u{5f}\u{30}", &["\u{5f}\u{30}"]),
-    ("\u{5f}\u{308}\u{30}", &["\u{5f}\u{308}\u{30}"]),
-    ("\u{5f}\u{5f}", &["\u{5f}\u{5f}"]),
-    ("\u{5f}\u{308}\u{5f}", &["\u{5f}\u{308}\u{5f}"]),
-    ("\u{5f}\u{1f1e6}", &["\u{5f}", "\u{1f1e6}"]),
-    ("\u{5f}\u{308}\u{1f1e6}", &["\u{5f}\u{308}", "\u{1f1e6}"]),
-    ("\u{5f}\u{5d0}", &["\u{5f}\u{5d0}"]),
-    ("\u{5f}\u{308}\u{5d0}", &["\u{5f}\u{308}\u{5d0}"]),
-    ("\u{5f}\u{22}", &["\u{5f}", "\u{22}"]),
-    ("\u{5f}\u{308}\u{22}", &["\u{5f}\u{308}", "\u{22}"]),
-    ("\u{5f}\u{27}", &["\u{5f}", "\u{27}"]),
-    ("\u{5f}\u{308}\u{27}", &["\u{5f}\u{308}", "\u{27}"]),
-    ("\u{5f}\u{231a}", &["\u{5f}", "\u{231a}"]),
-    ("\u{5f}\u{308}\u{231a}", &["\u{5f}\u{308}", "\u{231a}"]),
-    ("\u{5f}\u{20}", &["\u{5f}", "\u{20}"]),
-    ("\u{5f}\u{308}\u{20}", &["\u{5f}\u{308}", "\u{20}"]),
-    ("\u{5f}\u{ad}", &["\u{5f}\u{ad}"]),
-    ("\u{5f}\u{308}\u{ad}", &["\u{5f}\u{308}\u{ad}"]),
-    ("\u{5f}\u{300}", &["\u{5f}\u{300}"]),
-    ("\u{5f}\u{308}\u{300}", &["\u{5f}\u{308}\u{300}"]),
-    ("\u{5f}\u{200d}", &["\u{5f}\u{200d}"]),
-    ("\u{5f}\u{308}\u{200d}", &["\u{5f}\u{308}\u{200d}"]),
-    ("\u{5f}\u{61}\u{2060}", &["\u{5f}\u{61}\u{2060}"]),
-    (
-        "\u{5f}\u{308}\u{61}\u{2060}",
-        &["\u{5f}\u{308}\u{61}\u{2060}"],
-    ),
-    ("\u{5f}\u{61}\u{3a}", &["\u{5f}\u{61}", "\u{3a}"]),
-    (
-        "\u{5f}\u{308}\u{61}\u{3a}",
-        &["\u{5f}\u{308}\u{61}", "\u{3a}"],
-    ),
-    ("\u{5f}\u{61}\u{27}", &["\u{5f}\u{61}", "\u{27}"]),
-    (
-        "\u{5f}\u{308}\u{61}\u{27}",
-        &["\u{5f}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{5f}\u{61}\u{27}\u{2060}",
-        &["\u{5f}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{5f}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{5f}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{5f}\u{61}\u{2c}", &["\u{5f}\u{61}", "\u{2c}"]),
-    (
-        "\u{5f}\u{308}\u{61}\u{2c}",
-        &["\u{5f}\u{308}\u{61}", "\u{2c}"],
-    ),
-    ("\u{5f}\u{31}\u{3a}", &["\u{5f}\u{31}", "\u{3a}"]),
-    (
-        "\u{5f}\u{308}\u{31}\u{3a}",
-        &["\u{5f}\u{308}\u{31}", "\u{3a}"],
-    ),
-    ("\u{5f}\u{31}\u{27}", &["\u{5f}\u{31}", "\u{27}"]),
-    (
-        "\u{5f}\u{308}\u{31}\u{27}",
-        &["\u{5f}\u{308}\u{31}", "\u{27}"],
-    ),
-    ("\u{5f}\u{31}\u{2c}", &["\u{5f}\u{31}", "\u{2c}"]),
-    (
-        "\u{5f}\u{308}\u{31}\u{2c}",
-        &["\u{5f}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{5f}\u{31}\u{2e}\u{2060}",
-        &["\u{5f}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{5f}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{5f}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{1f1e6}\u{1}", &["\u{1f1e6}", "\u{1}"]),
-    ("\u{1f1e6}\u{308}\u{1}", &["\u{1f1e6}\u{308}", "\u{1}"]),
-    ("\u{1f1e6}\u{d}", &["\u{1f1e6}", "\u{d}"]),
-    ("\u{1f1e6}\u{308}\u{d}", &["\u{1f1e6}\u{308}", "\u{d}"]),
-    ("\u{1f1e6}\u{a}", &["\u{1f1e6}", "\u{a}"]),
-    ("\u{1f1e6}\u{308}\u{a}", &["\u{1f1e6}\u{308}", "\u{a}"]),
-    ("\u{1f1e6}\u{b}", &["\u{1f1e6}", "\u{b}"]),
-    ("\u{1f1e6}\u{308}\u{b}", &["\u{1f1e6}\u{308}", "\u{b}"]),
-    ("\u{1f1e6}\u{3031}", &["\u{1f1e6}", "\u{3031}"]),
-    (
-        "\u{1f1e6}\u{308}\u{3031}",
-        &["\u{1f1e6}\u{308}", "\u{3031}"],
-    ),
-    ("\u{1f1e6}\u{41}", &["\u{1f1e6}", "\u{41}"]),
-    ("\u{1f1e6}\u{308}\u{41}", &["\u{1f1e6}\u{308}", "\u{41}"]),
-    ("\u{1f1e6}\u{3a}", &["\u{1f1e6}", "\u{3a}"]),
-    ("\u{1f1e6}\u{308}\u{3a}", &["\u{1f1e6}\u{308}", "\u{3a}"]),
-    ("\u{1f1e6}\u{2c}", &["\u{1f1e6}", "\u{2c}"]),
-    ("\u{1f1e6}\u{308}\u{2c}", &["\u{1f1e6}\u{308}", "\u{2c}"]),
-    ("\u{1f1e6}\u{2e}", &["\u{1f1e6}", "\u{2e}"]),
-    ("\u{1f1e6}\u{308}\u{2e}", &["\u{1f1e6}\u{308}", "\u{2e}"]),
-    ("\u{1f1e6}\u{30}", &["\u{1f1e6}", "\u{30}"]),
-    ("\u{1f1e6}\u{308}\u{30}", &["\u{1f1e6}\u{308}", "\u{30}"]),
-    ("\u{1f1e6}\u{5f}", &["\u{1f1e6}", "\u{5f}"]),
-    ("\u{1f1e6}\u{308}\u{5f}", &["\u{1f1e6}\u{308}", "\u{5f}"]),
-    ("\u{1f1e6}\u{1f1e6}", &["\u{1f1e6}\u{1f1e6}"]),
-    ("\u{1f1e6}\u{308}\u{1f1e6}", &["\u{1f1e6}\u{308}\u{1f1e6}"]),
-    ("\u{1f1e6}\u{5d0}", &["\u{1f1e6}", "\u{5d0}"]),
-    ("\u{1f1e6}\u{308}\u{5d0}", &["\u{1f1e6}\u{308}", "\u{5d0}"]),
-    ("\u{1f1e6}\u{22}", &["\u{1f1e6}", "\u{22}"]),
-    ("\u{1f1e6}\u{308}\u{22}", &["\u{1f1e6}\u{308}", "\u{22}"]),
-    ("\u{1f1e6}\u{27}", &["\u{1f1e6}", "\u{27}"]),
-    ("\u{1f1e6}\u{308}\u{27}", &["\u{1f1e6}\u{308}", "\u{27}"]),
-    ("\u{1f1e6}\u{231a}", &["\u{1f1e6}", "\u{231a}"]),
-    (
-        "\u{1f1e6}\u{308}\u{231a}",
-        &["\u{1f1e6}\u{308}", "\u{231a}"],
-    ),
-    ("\u{1f1e6}\u{20}", &["\u{1f1e6}", "\u{20}"]),
-    ("\u{1f1e6}\u{308}\u{20}", &["\u{1f1e6}\u{308}", "\u{20}"]),
-    ("\u{1f1e6}\u{ad}", &["\u{1f1e6}\u{ad}"]),
-    ("\u{1f1e6}\u{308}\u{ad}", &["\u{1f1e6}\u{308}\u{ad}"]),
-    ("\u{1f1e6}\u{300}", &["\u{1f1e6}\u{300}"]),
-    ("\u{1f1e6}\u{308}\u{300}", &["\u{1f1e6}\u{308}\u{300}"]),
-    ("\u{1f1e6}\u{200d}", &["\u{1f1e6}\u{200d}"]),
-    ("\u{1f1e6}\u{308}\u{200d}", &["\u{1f1e6}\u{308}\u{200d}"]),
-    ("\u{1f1e6}\u{61}\u{2060}", &["\u{1f1e6}", "\u{61}\u{2060}"]),
-    (
-        "\u{1f1e6}\u{308}\u{61}\u{2060}",
-        &["\u{1f1e6}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{1f1e6}\u{61}\u{3a}", &["\u{1f1e6}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{1f1e6}\u{308}\u{61}\u{3a}",
-        &["\u{1f1e6}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{1f1e6}\u{61}\u{27}", &["\u{1f1e6}", "\u{61}", "\u{27}"]),
-    (
-        "\u{1f1e6}\u{308}\u{61}\u{27}",
-        &["\u{1f1e6}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{1f1e6}\u{61}\u{27}\u{2060}",
-        &["\u{1f1e6}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{1f1e6}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{1f1e6}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{1f1e6}\u{61}\u{2c}", &["\u{1f1e6}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{1f1e6}\u{308}\u{61}\u{2c}",
-        &["\u{1f1e6}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{1f1e6}\u{31}\u{3a}", &["\u{1f1e6}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{1f1e6}\u{308}\u{31}\u{3a}",
-        &["\u{1f1e6}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{1f1e6}\u{31}\u{27}", &["\u{1f1e6}", "\u{31}", "\u{27}"]),
-    (
-        "\u{1f1e6}\u{308}\u{31}\u{27}",
-        &["\u{1f1e6}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{1f1e6}\u{31}\u{2c}", &["\u{1f1e6}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{1f1e6}\u{308}\u{31}\u{2c}",
-        &["\u{1f1e6}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{1f1e6}\u{31}\u{2e}\u{2060}",
-        &["\u{1f1e6}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{1f1e6}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{1f1e6}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{5d0}\u{1}", &["\u{5d0}", "\u{1}"]),
-    ("\u{5d0}\u{308}\u{1}", &["\u{5d0}\u{308}", "\u{1}"]),
-    ("\u{5d0}\u{d}", &["\u{5d0}", "\u{d}"]),
-    ("\u{5d0}\u{308}\u{d}", &["\u{5d0}\u{308}", "\u{d}"]),
-    ("\u{5d0}\u{a}", &["\u{5d0}", "\u{a}"]),
-    ("\u{5d0}\u{308}\u{a}", &["\u{5d0}\u{308}", "\u{a}"]),
-    ("\u{5d0}\u{b}", &["\u{5d0}", "\u{b}"]),
-    ("\u{5d0}\u{308}\u{b}", &["\u{5d0}\u{308}", "\u{b}"]),
-    ("\u{5d0}\u{3031}", &["\u{5d0}", "\u{3031}"]),
-    ("\u{5d0}\u{308}\u{3031}", &["\u{5d0}\u{308}", "\u{3031}"]),
-    ("\u{5d0}\u{41}", &["\u{5d0}\u{41}"]),
-    ("\u{5d0}\u{308}\u{41}", &["\u{5d0}\u{308}\u{41}"]),
-    ("\u{5d0}\u{3a}", &["\u{5d0}", "\u{3a}"]),
-    ("\u{5d0}\u{308}\u{3a}", &["\u{5d0}\u{308}", "\u{3a}"]),
-    ("\u{5d0}\u{2c}", &["\u{5d0}", "\u{2c}"]),
-    ("\u{5d0}\u{308}\u{2c}", &["\u{5d0}\u{308}", "\u{2c}"]),
-    ("\u{5d0}\u{2e}", &["\u{5d0}", "\u{2e}"]),
-    ("\u{5d0}\u{308}\u{2e}", &["\u{5d0}\u{308}", "\u{2e}"]),
-    ("\u{5d0}\u{30}", &["\u{5d0}\u{30}"]),
-    ("\u{5d0}\u{308}\u{30}", &["\u{5d0}\u{308}\u{30}"]),
-    ("\u{5d0}\u{5f}", &["\u{5d0}\u{5f}"]),
-    ("\u{5d0}\u{308}\u{5f}", &["\u{5d0}\u{308}\u{5f}"]),
-    ("\u{5d0}\u{1f1e6}", &["\u{5d0}", "\u{1f1e6}"]),
-    ("\u{5d0}\u{308}\u{1f1e6}", &["\u{5d0}\u{308}", "\u{1f1e6}"]),
-    ("\u{5d0}\u{5d0}", &["\u{5d0}\u{5d0}"]),
-    ("\u{5d0}\u{308}\u{5d0}", &["\u{5d0}\u{308}\u{5d0}"]),
-    ("\u{5d0}\u{22}", &["\u{5d0}", "\u{22}"]),
-    ("\u{5d0}\u{308}\u{22}", &["\u{5d0}\u{308}", "\u{22}"]),
-    ("\u{5d0}\u{27}", &["\u{5d0}\u{27}"]),
-    ("\u{5d0}\u{308}\u{27}", &["\u{5d0}\u{308}\u{27}"]),
-    ("\u{5d0}\u{231a}", &["\u{5d0}", "\u{231a}"]),
-    ("\u{5d0}\u{308}\u{231a}", &["\u{5d0}\u{308}", "\u{231a}"]),
-    ("\u{5d0}\u{20}", &["\u{5d0}", "\u{20}"]),
-    ("\u{5d0}\u{308}\u{20}", &["\u{5d0}\u{308}", "\u{20}"]),
-    ("\u{5d0}\u{ad}", &["\u{5d0}\u{ad}"]),
-    ("\u{5d0}\u{308}\u{ad}", &["\u{5d0}\u{308}\u{ad}"]),
-    ("\u{5d0}\u{300}", &["\u{5d0}\u{300}"]),
-    ("\u{5d0}\u{308}\u{300}", &["\u{5d0}\u{308}\u{300}"]),
-    ("\u{5d0}\u{200d}", &["\u{5d0}\u{200d}"]),
-    ("\u{5d0}\u{308}\u{200d}", &["\u{5d0}\u{308}\u{200d}"]),
-    ("\u{5d0}\u{61}\u{2060}", &["\u{5d0}\u{61}\u{2060}"]),
-    (
-        "\u{5d0}\u{308}\u{61}\u{2060}",
-        &["\u{5d0}\u{308}\u{61}\u{2060}"],
-    ),
-    ("\u{5d0}\u{61}\u{3a}", &["\u{5d0}\u{61}", "\u{3a}"]),
-    (
-        "\u{5d0}\u{308}\u{61}\u{3a}",
-        &["\u{5d0}\u{308}\u{61}", "\u{3a}"],
-    ),
-    ("\u{5d0}\u{61}\u{27}", &["\u{5d0}\u{61}", "\u{27}"]),
-    (
-        "\u{5d0}\u{308}\u{61}\u{27}",
-        &["\u{5d0}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{5d0}\u{61}\u{27}\u{2060}",
-        &["\u{5d0}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{5d0}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{5d0}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{5d0}\u{61}\u{2c}", &["\u{5d0}\u{61}", "\u{2c}"]),
-    (
-        "\u{5d0}\u{308}\u{61}\u{2c}",
-        &["\u{5d0}\u{308}\u{61}", "\u{2c}"],
-    ),
-    ("\u{5d0}\u{31}\u{3a}", &["\u{5d0}\u{31}", "\u{3a}"]),
-    (
-        "\u{5d0}\u{308}\u{31}\u{3a}",
-        &["\u{5d0}\u{308}\u{31}", "\u{3a}"],
-    ),
-    ("\u{5d0}\u{31}\u{27}", &["\u{5d0}\u{31}", "\u{27}"]),
-    (
-        "\u{5d0}\u{308}\u{31}\u{27}",
-        &["\u{5d0}\u{308}\u{31}", "\u{27}"],
-    ),
-    ("\u{5d0}\u{31}\u{2c}", &["\u{5d0}\u{31}", "\u{2c}"]),
-    (
-        "\u{5d0}\u{308}\u{31}\u{2c}",
-        &["\u{5d0}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{5d0}\u{31}\u{2e}\u{2060}",
-        &["\u{5d0}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{5d0}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{5d0}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{22}\u{1}", &["\u{22}", "\u{1}"]),
-    ("\u{22}\u{308}\u{1}", &["\u{22}\u{308}", "\u{1}"]),
-    ("\u{22}\u{d}", &["\u{22}", "\u{d}"]),
-    ("\u{22}\u{308}\u{d}", &["\u{22}\u{308}", "\u{d}"]),
-    ("\u{22}\u{a}", &["\u{22}", "\u{a}"]),
-    ("\u{22}\u{308}\u{a}", &["\u{22}\u{308}", "\u{a}"]),
-    ("\u{22}\u{b}", &["\u{22}", "\u{b}"]),
-    ("\u{22}\u{308}\u{b}", &["\u{22}\u{308}", "\u{b}"]),
-    ("\u{22}\u{3031}", &["\u{22}", "\u{3031}"]),
-    ("\u{22}\u{308}\u{3031}", &["\u{22}\u{308}", "\u{3031}"]),
-    ("\u{22}\u{41}", &["\u{22}", "\u{41}"]),
-    ("\u{22}\u{308}\u{41}", &["\u{22}\u{308}", "\u{41}"]),
-    ("\u{22}\u{3a}", &["\u{22}", "\u{3a}"]),
-    ("\u{22}\u{308}\u{3a}", &["\u{22}\u{308}", "\u{3a}"]),
-    ("\u{22}\u{2c}", &["\u{22}", "\u{2c}"]),
-    ("\u{22}\u{308}\u{2c}", &["\u{22}\u{308}", "\u{2c}"]),
-    ("\u{22}\u{2e}", &["\u{22}", "\u{2e}"]),
-    ("\u{22}\u{308}\u{2e}", &["\u{22}\u{308}", "\u{2e}"]),
-    ("\u{22}\u{30}", &["\u{22}", "\u{30}"]),
-    ("\u{22}\u{308}\u{30}", &["\u{22}\u{308}", "\u{30}"]),
-    ("\u{22}\u{5f}", &["\u{22}", "\u{5f}"]),
-    ("\u{22}\u{308}\u{5f}", &["\u{22}\u{308}", "\u{5f}"]),
-    ("\u{22}\u{1f1e6}", &["\u{22}", "\u{1f1e6}"]),
-    ("\u{22}\u{308}\u{1f1e6}", &["\u{22}\u{308}", "\u{1f1e6}"]),
-    ("\u{22}\u{5d0}", &["\u{22}", "\u{5d0}"]),
-    ("\u{22}\u{308}\u{5d0}", &["\u{22}\u{308}", "\u{5d0}"]),
-    ("\u{22}\u{22}", &["\u{22}", "\u{22}"]),
-    ("\u{22}\u{308}\u{22}", &["\u{22}\u{308}", "\u{22}"]),
-    ("\u{22}\u{27}", &["\u{22}", "\u{27}"]),
-    ("\u{22}\u{308}\u{27}", &["\u{22}\u{308}", "\u{27}"]),
-    ("\u{22}\u{231a}", &["\u{22}", "\u{231a}"]),
-    ("\u{22}\u{308}\u{231a}", &["\u{22}\u{308}", "\u{231a}"]),
-    ("\u{22}\u{20}", &["\u{22}", "\u{20}"]),
-    ("\u{22}\u{308}\u{20}", &["\u{22}\u{308}", "\u{20}"]),
-    ("\u{22}\u{ad}", &["\u{22}\u{ad}"]),
-    ("\u{22}\u{308}\u{ad}", &["\u{22}\u{308}\u{ad}"]),
-    ("\u{22}\u{300}", &["\u{22}\u{300}"]),
-    ("\u{22}\u{308}\u{300}", &["\u{22}\u{308}\u{300}"]),
-    ("\u{22}\u{200d}", &["\u{22}\u{200d}"]),
-    ("\u{22}\u{308}\u{200d}", &["\u{22}\u{308}\u{200d}"]),
-    ("\u{22}\u{61}\u{2060}", &["\u{22}", "\u{61}\u{2060}"]),
-    (
-        "\u{22}\u{308}\u{61}\u{2060}",
-        &["\u{22}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{22}\u{61}\u{3a}", &["\u{22}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{22}\u{308}\u{61}\u{3a}",
-        &["\u{22}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{22}\u{61}\u{27}", &["\u{22}", "\u{61}", "\u{27}"]),
-    (
-        "\u{22}\u{308}\u{61}\u{27}",
-        &["\u{22}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{22}\u{61}\u{27}\u{2060}",
-        &["\u{22}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{22}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{22}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{22}\u{61}\u{2c}", &["\u{22}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{22}\u{308}\u{61}\u{2c}",
-        &["\u{22}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{22}\u{31}\u{3a}", &["\u{22}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{22}\u{308}\u{31}\u{3a}",
-        &["\u{22}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{22}\u{31}\u{27}", &["\u{22}", "\u{31}", "\u{27}"]),
-    (
-        "\u{22}\u{308}\u{31}\u{27}",
-        &["\u{22}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{22}\u{31}\u{2c}", &["\u{22}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{22}\u{308}\u{31}\u{2c}",
-        &["\u{22}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{22}\u{31}\u{2e}\u{2060}",
-        &["\u{22}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{22}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{22}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{27}\u{1}", &["\u{27}", "\u{1}"]),
-    ("\u{27}\u{308}\u{1}", &["\u{27}\u{308}", "\u{1}"]),
-    ("\u{27}\u{d}", &["\u{27}", "\u{d}"]),
-    ("\u{27}\u{308}\u{d}", &["\u{27}\u{308}", "\u{d}"]),
-    ("\u{27}\u{a}", &["\u{27}", "\u{a}"]),
-    ("\u{27}\u{308}\u{a}", &["\u{27}\u{308}", "\u{a}"]),
-    ("\u{27}\u{b}", &["\u{27}", "\u{b}"]),
-    ("\u{27}\u{308}\u{b}", &["\u{27}\u{308}", "\u{b}"]),
-    ("\u{27}\u{3031}", &["\u{27}", "\u{3031}"]),
-    ("\u{27}\u{308}\u{3031}", &["\u{27}\u{308}", "\u{3031}"]),
-    ("\u{27}\u{41}", &["\u{27}", "\u{41}"]),
-    ("\u{27}\u{308}\u{41}", &["\u{27}\u{308}", "\u{41}"]),
-    ("\u{27}\u{3a}", &["\u{27}", "\u{3a}"]),
-    ("\u{27}\u{308}\u{3a}", &["\u{27}\u{308}", "\u{3a}"]),
-    ("\u{27}\u{2c}", &["\u{27}", "\u{2c}"]),
-    ("\u{27}\u{308}\u{2c}", &["\u{27}\u{308}", "\u{2c}"]),
-    ("\u{27}\u{2e}", &["\u{27}", "\u{2e}"]),
-    ("\u{27}\u{308}\u{2e}", &["\u{27}\u{308}", "\u{2e}"]),
-    ("\u{27}\u{30}", &["\u{27}", "\u{30}"]),
-    ("\u{27}\u{308}\u{30}", &["\u{27}\u{308}", "\u{30}"]),
-    ("\u{27}\u{5f}", &["\u{27}", "\u{5f}"]),
-    ("\u{27}\u{308}\u{5f}", &["\u{27}\u{308}", "\u{5f}"]),
-    ("\u{27}\u{1f1e6}", &["\u{27}", "\u{1f1e6}"]),
-    ("\u{27}\u{308}\u{1f1e6}", &["\u{27}\u{308}", "\u{1f1e6}"]),
-    ("\u{27}\u{5d0}", &["\u{27}", "\u{5d0}"]),
-    ("\u{27}\u{308}\u{5d0}", &["\u{27}\u{308}", "\u{5d0}"]),
-    ("\u{27}\u{22}", &["\u{27}", "\u{22}"]),
-    ("\u{27}\u{308}\u{22}", &["\u{27}\u{308}", "\u{22}"]),
-    ("\u{27}\u{27}", &["\u{27}", "\u{27}"]),
-    ("\u{27}\u{308}\u{27}", &["\u{27}\u{308}", "\u{27}"]),
-    ("\u{27}\u{231a}", &["\u{27}", "\u{231a}"]),
-    ("\u{27}\u{308}\u{231a}", &["\u{27}\u{308}", "\u{231a}"]),
-    ("\u{27}\u{20}", &["\u{27}", "\u{20}"]),
-    ("\u{27}\u{308}\u{20}", &["\u{27}\u{308}", "\u{20}"]),
-    ("\u{27}\u{ad}", &["\u{27}\u{ad}"]),
-    ("\u{27}\u{308}\u{ad}", &["\u{27}\u{308}\u{ad}"]),
-    ("\u{27}\u{300}", &["\u{27}\u{300}"]),
-    ("\u{27}\u{308}\u{300}", &["\u{27}\u{308}\u{300}"]),
-    ("\u{27}\u{200d}", &["\u{27}\u{200d}"]),
-    ("\u{27}\u{308}\u{200d}", &["\u{27}\u{308}\u{200d}"]),
-    ("\u{27}\u{61}\u{2060}", &["\u{27}", "\u{61}\u{2060}"]),
-    (
-        "\u{27}\u{308}\u{61}\u{2060}",
-        &["\u{27}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{27}\u{61}\u{3a}", &["\u{27}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{27}\u{308}\u{61}\u{3a}",
-        &["\u{27}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{27}\u{61}\u{27}", &["\u{27}", "\u{61}", "\u{27}"]),
-    (
-        "\u{27}\u{308}\u{61}\u{27}",
-        &["\u{27}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{27}\u{61}\u{27}\u{2060}",
-        &["\u{27}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{27}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{27}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{27}\u{61}\u{2c}", &["\u{27}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{27}\u{308}\u{61}\u{2c}",
-        &["\u{27}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{27}\u{31}\u{3a}", &["\u{27}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{27}\u{308}\u{31}\u{3a}",
-        &["\u{27}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{27}\u{31}\u{27}", &["\u{27}", "\u{31}", "\u{27}"]),
-    (
-        "\u{27}\u{308}\u{31}\u{27}",
-        &["\u{27}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{27}\u{31}\u{2c}", &["\u{27}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{27}\u{308}\u{31}\u{2c}",
-        &["\u{27}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{27}\u{31}\u{2e}\u{2060}",
-        &["\u{27}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{27}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{27}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{231a}\u{1}", &["\u{231a}", "\u{1}"]),
-    ("\u{231a}\u{308}\u{1}", &["\u{231a}\u{308}", "\u{1}"]),
-    ("\u{231a}\u{d}", &["\u{231a}", "\u{d}"]),
-    ("\u{231a}\u{308}\u{d}", &["\u{231a}\u{308}", "\u{d}"]),
-    ("\u{231a}\u{a}", &["\u{231a}", "\u{a}"]),
-    ("\u{231a}\u{308}\u{a}", &["\u{231a}\u{308}", "\u{a}"]),
-    ("\u{231a}\u{b}", &["\u{231a}", "\u{b}"]),
-    ("\u{231a}\u{308}\u{b}", &["\u{231a}\u{308}", "\u{b}"]),
-    ("\u{231a}\u{3031}", &["\u{231a}", "\u{3031}"]),
-    ("\u{231a}\u{308}\u{3031}", &["\u{231a}\u{308}", "\u{3031}"]),
-    ("\u{231a}\u{41}", &["\u{231a}", "\u{41}"]),
-    ("\u{231a}\u{308}\u{41}", &["\u{231a}\u{308}", "\u{41}"]),
-    ("\u{231a}\u{3a}", &["\u{231a}", "\u{3a}"]),
-    ("\u{231a}\u{308}\u{3a}", &["\u{231a}\u{308}", "\u{3a}"]),
-    ("\u{231a}\u{2c}", &["\u{231a}", "\u{2c}"]),
-    ("\u{231a}\u{308}\u{2c}", &["\u{231a}\u{308}", "\u{2c}"]),
-    ("\u{231a}\u{2e}", &["\u{231a}", "\u{2e}"]),
-    ("\u{231a}\u{308}\u{2e}", &["\u{231a}\u{308}", "\u{2e}"]),
-    ("\u{231a}\u{30}", &["\u{231a}", "\u{30}"]),
-    ("\u{231a}\u{308}\u{30}", &["\u{231a}\u{308}", "\u{30}"]),
-    ("\u{231a}\u{5f}", &["\u{231a}", "\u{5f}"]),
-    ("\u{231a}\u{308}\u{5f}", &["\u{231a}\u{308}", "\u{5f}"]),
-    ("\u{231a}\u{1f1e6}", &["\u{231a}", "\u{1f1e6}"]),
-    (
-        "\u{231a}\u{308}\u{1f1e6}",
-        &["\u{231a}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{231a}\u{5d0}", &["\u{231a}", "\u{5d0}"]),
-    ("\u{231a}\u{308}\u{5d0}", &["\u{231a}\u{308}", "\u{5d0}"]),
-    ("\u{231a}\u{22}", &["\u{231a}", "\u{22}"]),
-    ("\u{231a}\u{308}\u{22}", &["\u{231a}\u{308}", "\u{22}"]),
-    ("\u{231a}\u{27}", &["\u{231a}", "\u{27}"]),
-    ("\u{231a}\u{308}\u{27}", &["\u{231a}\u{308}", "\u{27}"]),
-    ("\u{231a}\u{231a}", &["\u{231a}", "\u{231a}"]),
-    ("\u{231a}\u{308}\u{231a}", &["\u{231a}\u{308}", "\u{231a}"]),
-    ("\u{231a}\u{20}", &["\u{231a}", "\u{20}"]),
-    ("\u{231a}\u{308}\u{20}", &["\u{231a}\u{308}", "\u{20}"]),
-    ("\u{231a}\u{ad}", &["\u{231a}\u{ad}"]),
-    ("\u{231a}\u{308}\u{ad}", &["\u{231a}\u{308}\u{ad}"]),
-    ("\u{231a}\u{300}", &["\u{231a}\u{300}"]),
-    ("\u{231a}\u{308}\u{300}", &["\u{231a}\u{308}\u{300}"]),
-    ("\u{231a}\u{200d}", &["\u{231a}\u{200d}"]),
-    ("\u{231a}\u{308}\u{200d}", &["\u{231a}\u{308}\u{200d}"]),
-    ("\u{231a}\u{61}\u{2060}", &["\u{231a}", "\u{61}\u{2060}"]),
-    (
-        "\u{231a}\u{308}\u{61}\u{2060}",
-        &["\u{231a}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{231a}\u{61}\u{3a}", &["\u{231a}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{231a}\u{308}\u{61}\u{3a}",
-        &["\u{231a}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{231a}\u{61}\u{27}", &["\u{231a}", "\u{61}", "\u{27}"]),
-    (
-        "\u{231a}\u{308}\u{61}\u{27}",
-        &["\u{231a}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{231a}\u{61}\u{27}\u{2060}",
-        &["\u{231a}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{231a}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{231a}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{231a}\u{61}\u{2c}", &["\u{231a}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{231a}\u{308}\u{61}\u{2c}",
-        &["\u{231a}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{231a}\u{31}\u{3a}", &["\u{231a}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{231a}\u{308}\u{31}\u{3a}",
-        &["\u{231a}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{231a}\u{31}\u{27}", &["\u{231a}", "\u{31}", "\u{27}"]),
-    (
-        "\u{231a}\u{308}\u{31}\u{27}",
-        &["\u{231a}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{231a}\u{31}\u{2c}", &["\u{231a}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{231a}\u{308}\u{31}\u{2c}",
-        &["\u{231a}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{231a}\u{31}\u{2e}\u{2060}",
-        &["\u{231a}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{231a}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{231a}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{20}\u{1}", &["\u{20}", "\u{1}"]),
-    ("\u{20}\u{308}\u{1}", &["\u{20}\u{308}", "\u{1}"]),
-    ("\u{20}\u{d}", &["\u{20}", "\u{d}"]),
-    ("\u{20}\u{308}\u{d}", &["\u{20}\u{308}", "\u{d}"]),
-    ("\u{20}\u{a}", &["\u{20}", "\u{a}"]),
-    ("\u{20}\u{308}\u{a}", &["\u{20}\u{308}", "\u{a}"]),
-    ("\u{20}\u{b}", &["\u{20}", "\u{b}"]),
-    ("\u{20}\u{308}\u{b}", &["\u{20}\u{308}", "\u{b}"]),
-    ("\u{20}\u{3031}", &["\u{20}", "\u{3031}"]),
-    ("\u{20}\u{308}\u{3031}", &["\u{20}\u{308}", "\u{3031}"]),
-    ("\u{20}\u{41}", &["\u{20}", "\u{41}"]),
-    ("\u{20}\u{308}\u{41}", &["\u{20}\u{308}", "\u{41}"]),
-    ("\u{20}\u{3a}", &["\u{20}", "\u{3a}"]),
-    ("\u{20}\u{308}\u{3a}", &["\u{20}\u{308}", "\u{3a}"]),
-    ("\u{20}\u{2c}", &["\u{20}", "\u{2c}"]),
-    ("\u{20}\u{308}\u{2c}", &["\u{20}\u{308}", "\u{2c}"]),
-    ("\u{20}\u{2e}", &["\u{20}", "\u{2e}"]),
-    ("\u{20}\u{308}\u{2e}", &["\u{20}\u{308}", "\u{2e}"]),
-    ("\u{20}\u{30}", &["\u{20}", "\u{30}"]),
-    ("\u{20}\u{308}\u{30}", &["\u{20}\u{308}", "\u{30}"]),
-    ("\u{20}\u{5f}", &["\u{20}", "\u{5f}"]),
-    ("\u{20}\u{308}\u{5f}", &["\u{20}\u{308}", "\u{5f}"]),
-    ("\u{20}\u{1f1e6}", &["\u{20}", "\u{1f1e6}"]),
-    ("\u{20}\u{308}\u{1f1e6}", &["\u{20}\u{308}", "\u{1f1e6}"]),
-    ("\u{20}\u{5d0}", &["\u{20}", "\u{5d0}"]),
-    ("\u{20}\u{308}\u{5d0}", &["\u{20}\u{308}", "\u{5d0}"]),
-    ("\u{20}\u{22}", &["\u{20}", "\u{22}"]),
-    ("\u{20}\u{308}\u{22}", &["\u{20}\u{308}", "\u{22}"]),
-    ("\u{20}\u{27}", &["\u{20}", "\u{27}"]),
-    ("\u{20}\u{308}\u{27}", &["\u{20}\u{308}", "\u{27}"]),
-    ("\u{20}\u{231a}", &["\u{20}", "\u{231a}"]),
-    ("\u{20}\u{308}\u{231a}", &["\u{20}\u{308}", "\u{231a}"]),
-    ("\u{20}\u{20}", &["\u{20}\u{20}"]),
-    ("\u{20}\u{308}\u{20}", &["\u{20}\u{308}", "\u{20}"]),
-    ("\u{20}\u{ad}", &["\u{20}\u{ad}"]),
-    ("\u{20}\u{308}\u{ad}", &["\u{20}\u{308}\u{ad}"]),
-    ("\u{20}\u{300}", &["\u{20}\u{300}"]),
-    ("\u{20}\u{308}\u{300}", &["\u{20}\u{308}\u{300}"]),
-    ("\u{20}\u{200d}", &["\u{20}\u{200d}"]),
-    ("\u{20}\u{308}\u{200d}", &["\u{20}\u{308}\u{200d}"]),
-    ("\u{20}\u{61}\u{2060}", &["\u{20}", "\u{61}\u{2060}"]),
-    (
-        "\u{20}\u{308}\u{61}\u{2060}",
-        &["\u{20}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{20}\u{61}\u{3a}", &["\u{20}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{20}\u{308}\u{61}\u{3a}",
-        &["\u{20}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{20}\u{61}\u{27}", &["\u{20}", "\u{61}", "\u{27}"]),
-    (
-        "\u{20}\u{308}\u{61}\u{27}",
-        &["\u{20}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{20}\u{61}\u{27}\u{2060}",
-        &["\u{20}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{20}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{20}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{20}\u{61}\u{2c}", &["\u{20}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{20}\u{308}\u{61}\u{2c}",
-        &["\u{20}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{20}\u{31}\u{3a}", &["\u{20}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{20}\u{308}\u{31}\u{3a}",
-        &["\u{20}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{20}\u{31}\u{27}", &["\u{20}", "\u{31}", "\u{27}"]),
-    (
-        "\u{20}\u{308}\u{31}\u{27}",
-        &["\u{20}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{20}\u{31}\u{2c}", &["\u{20}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{20}\u{308}\u{31}\u{2c}",
-        &["\u{20}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{20}\u{31}\u{2e}\u{2060}",
-        &["\u{20}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{20}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{20}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{ad}\u{1}", &["\u{ad}", "\u{1}"]),
-    ("\u{ad}\u{308}\u{1}", &["\u{ad}\u{308}", "\u{1}"]),
-    ("\u{ad}\u{d}", &["\u{ad}", "\u{d}"]),
-    ("\u{ad}\u{308}\u{d}", &["\u{ad}\u{308}", "\u{d}"]),
-    ("\u{ad}\u{a}", &["\u{ad}", "\u{a}"]),
-    ("\u{ad}\u{308}\u{a}", &["\u{ad}\u{308}", "\u{a}"]),
-    ("\u{ad}\u{b}", &["\u{ad}", "\u{b}"]),
-    ("\u{ad}\u{308}\u{b}", &["\u{ad}\u{308}", "\u{b}"]),
-    ("\u{ad}\u{3031}", &["\u{ad}", "\u{3031}"]),
-    ("\u{ad}\u{308}\u{3031}", &["\u{ad}\u{308}", "\u{3031}"]),
-    ("\u{ad}\u{41}", &["\u{ad}", "\u{41}"]),
-    ("\u{ad}\u{308}\u{41}", &["\u{ad}\u{308}", "\u{41}"]),
-    ("\u{ad}\u{3a}", &["\u{ad}", "\u{3a}"]),
-    ("\u{ad}\u{308}\u{3a}", &["\u{ad}\u{308}", "\u{3a}"]),
-    ("\u{ad}\u{2c}", &["\u{ad}", "\u{2c}"]),
-    ("\u{ad}\u{308}\u{2c}", &["\u{ad}\u{308}", "\u{2c}"]),
-    ("\u{ad}\u{2e}", &["\u{ad}", "\u{2e}"]),
-    ("\u{ad}\u{308}\u{2e}", &["\u{ad}\u{308}", "\u{2e}"]),
-    ("\u{ad}\u{30}", &["\u{ad}", "\u{30}"]),
-    ("\u{ad}\u{308}\u{30}", &["\u{ad}\u{308}", "\u{30}"]),
-    ("\u{ad}\u{5f}", &["\u{ad}", "\u{5f}"]),
-    ("\u{ad}\u{308}\u{5f}", &["\u{ad}\u{308}", "\u{5f}"]),
-    ("\u{ad}\u{1f1e6}", &["\u{ad}", "\u{1f1e6}"]),
-    ("\u{ad}\u{308}\u{1f1e6}", &["\u{ad}\u{308}", "\u{1f1e6}"]),
-    ("\u{ad}\u{5d0}", &["\u{ad}", "\u{5d0}"]),
-    ("\u{ad}\u{308}\u{5d0}", &["\u{ad}\u{308}", "\u{5d0}"]),
-    ("\u{ad}\u{22}", &["\u{ad}", "\u{22}"]),
-    ("\u{ad}\u{308}\u{22}", &["\u{ad}\u{308}", "\u{22}"]),
-    ("\u{ad}\u{27}", &["\u{ad}", "\u{27}"]),
-    ("\u{ad}\u{308}\u{27}", &["\u{ad}\u{308}", "\u{27}"]),
-    ("\u{ad}\u{231a}", &["\u{ad}", "\u{231a}"]),
-    ("\u{ad}\u{308}\u{231a}", &["\u{ad}\u{308}", "\u{231a}"]),
-    ("\u{ad}\u{20}", &["\u{ad}", "\u{20}"]),
-    ("\u{ad}\u{308}\u{20}", &["\u{ad}\u{308}", "\u{20}"]),
-    ("\u{ad}\u{ad}", &["\u{ad}\u{ad}"]),
-    ("\u{ad}\u{308}\u{ad}", &["\u{ad}\u{308}\u{ad}"]),
-    ("\u{ad}\u{300}", &["\u{ad}\u{300}"]),
-    ("\u{ad}\u{308}\u{300}", &["\u{ad}\u{308}\u{300}"]),
-    ("\u{ad}\u{200d}", &["\u{ad}\u{200d}"]),
-    ("\u{ad}\u{308}\u{200d}", &["\u{ad}\u{308}\u{200d}"]),
-    ("\u{ad}\u{61}\u{2060}", &["\u{ad}", "\u{61}\u{2060}"]),
-    (
-        "\u{ad}\u{308}\u{61}\u{2060}",
-        &["\u{ad}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{ad}\u{61}\u{3a}", &["\u{ad}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{ad}\u{308}\u{61}\u{3a}",
-        &["\u{ad}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{ad}\u{61}\u{27}", &["\u{ad}", "\u{61}", "\u{27}"]),
-    (
-        "\u{ad}\u{308}\u{61}\u{27}",
-        &["\u{ad}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{ad}\u{61}\u{27}\u{2060}",
-        &["\u{ad}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{ad}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{ad}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{ad}\u{61}\u{2c}", &["\u{ad}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{ad}\u{308}\u{61}\u{2c}",
-        &["\u{ad}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{ad}\u{31}\u{3a}", &["\u{ad}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{ad}\u{308}\u{31}\u{3a}",
-        &["\u{ad}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{ad}\u{31}\u{27}", &["\u{ad}", "\u{31}", "\u{27}"]),
-    (
-        "\u{ad}\u{308}\u{31}\u{27}",
-        &["\u{ad}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{ad}\u{31}\u{2c}", &["\u{ad}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{ad}\u{308}\u{31}\u{2c}",
-        &["\u{ad}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{ad}\u{31}\u{2e}\u{2060}",
-        &["\u{ad}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{ad}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{ad}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{300}\u{1}", &["\u{300}", "\u{1}"]),
-    ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}", "\u{1}"]),
-    ("\u{300}\u{d}", &["\u{300}", "\u{d}"]),
-    ("\u{300}\u{308}\u{d}", &["\u{300}\u{308}", "\u{d}"]),
-    ("\u{300}\u{a}", &["\u{300}", "\u{a}"]),
-    ("\u{300}\u{308}\u{a}", &["\u{300}\u{308}", "\u{a}"]),
-    ("\u{300}\u{b}", &["\u{300}", "\u{b}"]),
-    ("\u{300}\u{308}\u{b}", &["\u{300}\u{308}", "\u{b}"]),
-    ("\u{300}\u{3031}", &["\u{300}", "\u{3031}"]),
-    ("\u{300}\u{308}\u{3031}", &["\u{300}\u{308}", "\u{3031}"]),
-    ("\u{300}\u{41}", &["\u{300}", "\u{41}"]),
-    ("\u{300}\u{308}\u{41}", &["\u{300}\u{308}", "\u{41}"]),
-    ("\u{300}\u{3a}", &["\u{300}", "\u{3a}"]),
-    ("\u{300}\u{308}\u{3a}", &["\u{300}\u{308}", "\u{3a}"]),
-    ("\u{300}\u{2c}", &["\u{300}", "\u{2c}"]),
-    ("\u{300}\u{308}\u{2c}", &["\u{300}\u{308}", "\u{2c}"]),
-    ("\u{300}\u{2e}", &["\u{300}", "\u{2e}"]),
-    ("\u{300}\u{308}\u{2e}", &["\u{300}\u{308}", "\u{2e}"]),
-    ("\u{300}\u{30}", &["\u{300}", "\u{30}"]),
-    ("\u{300}\u{308}\u{30}", &["\u{300}\u{308}", "\u{30}"]),
-    ("\u{300}\u{5f}", &["\u{300}", "\u{5f}"]),
-    ("\u{300}\u{308}\u{5f}", &["\u{300}\u{308}", "\u{5f}"]),
-    ("\u{300}\u{1f1e6}", &["\u{300}", "\u{1f1e6}"]),
-    ("\u{300}\u{308}\u{1f1e6}", &["\u{300}\u{308}", "\u{1f1e6}"]),
-    ("\u{300}\u{5d0}", &["\u{300}", "\u{5d0}"]),
-    ("\u{300}\u{308}\u{5d0}", &["\u{300}\u{308}", "\u{5d0}"]),
-    ("\u{300}\u{22}", &["\u{300}", "\u{22}"]),
-    ("\u{300}\u{308}\u{22}", &["\u{300}\u{308}", "\u{22}"]),
-    ("\u{300}\u{27}", &["\u{300}", "\u{27}"]),
-    ("\u{300}\u{308}\u{27}", &["\u{300}\u{308}", "\u{27}"]),
-    ("\u{300}\u{231a}", &["\u{300}", "\u{231a}"]),
-    ("\u{300}\u{308}\u{231a}", &["\u{300}\u{308}", "\u{231a}"]),
-    ("\u{300}\u{20}", &["\u{300}", "\u{20}"]),
-    ("\u{300}\u{308}\u{20}", &["\u{300}\u{308}", "\u{20}"]),
-    ("\u{300}\u{ad}", &["\u{300}\u{ad}"]),
-    ("\u{300}\u{308}\u{ad}", &["\u{300}\u{308}\u{ad}"]),
-    ("\u{300}\u{300}", &["\u{300}\u{300}"]),
-    ("\u{300}\u{308}\u{300}", &["\u{300}\u{308}\u{300}"]),
-    ("\u{300}\u{200d}", &["\u{300}\u{200d}"]),
-    ("\u{300}\u{308}\u{200d}", &["\u{300}\u{308}\u{200d}"]),
-    ("\u{300}\u{61}\u{2060}", &["\u{300}", "\u{61}\u{2060}"]),
-    (
-        "\u{300}\u{308}\u{61}\u{2060}",
-        &["\u{300}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{300}\u{61}\u{3a}", &["\u{300}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{300}\u{308}\u{61}\u{3a}",
-        &["\u{300}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{300}\u{61}\u{27}", &["\u{300}", "\u{61}", "\u{27}"]),
-    (
-        "\u{300}\u{308}\u{61}\u{27}",
-        &["\u{300}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{300}\u{61}\u{27}\u{2060}",
-        &["\u{300}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{300}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{300}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{300}\u{61}\u{2c}", &["\u{300}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{300}\u{308}\u{61}\u{2c}",
-        &["\u{300}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{300}\u{31}\u{3a}", &["\u{300}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{300}\u{308}\u{31}\u{3a}",
-        &["\u{300}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{300}\u{31}\u{27}", &["\u{300}", "\u{31}", "\u{27}"]),
-    (
-        "\u{300}\u{308}\u{31}\u{27}",
-        &["\u{300}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{300}\u{31}\u{2c}", &["\u{300}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{300}\u{308}\u{31}\u{2c}",
-        &["\u{300}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{300}\u{31}\u{2e}\u{2060}",
-        &["\u{300}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{300}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{300}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{200d}\u{1}", &["\u{200d}", "\u{1}"]),
-    ("\u{200d}\u{308}\u{1}", &["\u{200d}\u{308}", "\u{1}"]),
-    ("\u{200d}\u{d}", &["\u{200d}", "\u{d}"]),
-    ("\u{200d}\u{308}\u{d}", &["\u{200d}\u{308}", "\u{d}"]),
-    ("\u{200d}\u{a}", &["\u{200d}", "\u{a}"]),
-    ("\u{200d}\u{308}\u{a}", &["\u{200d}\u{308}", "\u{a}"]),
-    ("\u{200d}\u{b}", &["\u{200d}", "\u{b}"]),
-    ("\u{200d}\u{308}\u{b}", &["\u{200d}\u{308}", "\u{b}"]),
-    ("\u{200d}\u{3031}", &["\u{200d}", "\u{3031}"]),
-    ("\u{200d}\u{308}\u{3031}", &["\u{200d}\u{308}", "\u{3031}"]),
-    ("\u{200d}\u{41}", &["\u{200d}", "\u{41}"]),
-    ("\u{200d}\u{308}\u{41}", &["\u{200d}\u{308}", "\u{41}"]),
-    ("\u{200d}\u{3a}", &["\u{200d}", "\u{3a}"]),
-    ("\u{200d}\u{308}\u{3a}", &["\u{200d}\u{308}", "\u{3a}"]),
-    ("\u{200d}\u{2c}", &["\u{200d}", "\u{2c}"]),
-    ("\u{200d}\u{308}\u{2c}", &["\u{200d}\u{308}", "\u{2c}"]),
-    ("\u{200d}\u{2e}", &["\u{200d}", "\u{2e}"]),
-    ("\u{200d}\u{308}\u{2e}", &["\u{200d}\u{308}", "\u{2e}"]),
-    ("\u{200d}\u{30}", &["\u{200d}", "\u{30}"]),
-    ("\u{200d}\u{308}\u{30}", &["\u{200d}\u{308}", "\u{30}"]),
-    ("\u{200d}\u{5f}", &["\u{200d}", "\u{5f}"]),
-    ("\u{200d}\u{308}\u{5f}", &["\u{200d}\u{308}", "\u{5f}"]),
-    ("\u{200d}\u{1f1e6}", &["\u{200d}", "\u{1f1e6}"]),
-    (
-        "\u{200d}\u{308}\u{1f1e6}",
-        &["\u{200d}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{200d}\u{5d0}", &["\u{200d}", "\u{5d0}"]),
-    ("\u{200d}\u{308}\u{5d0}", &["\u{200d}\u{308}", "\u{5d0}"]),
-    ("\u{200d}\u{22}", &["\u{200d}", "\u{22}"]),
-    ("\u{200d}\u{308}\u{22}", &["\u{200d}\u{308}", "\u{22}"]),
-    ("\u{200d}\u{27}", &["\u{200d}", "\u{27}"]),
-    ("\u{200d}\u{308}\u{27}", &["\u{200d}\u{308}", "\u{27}"]),
-    ("\u{200d}\u{231a}", &["\u{200d}\u{231a}"]),
-    ("\u{200d}\u{308}\u{231a}", &["\u{200d}\u{308}", "\u{231a}"]),
-    ("\u{200d}\u{20}", &["\u{200d}", "\u{20}"]),
-    ("\u{200d}\u{308}\u{20}", &["\u{200d}\u{308}", "\u{20}"]),
-    ("\u{200d}\u{ad}", &["\u{200d}\u{ad}"]),
-    ("\u{200d}\u{308}\u{ad}", &["\u{200d}\u{308}\u{ad}"]),
-    ("\u{200d}\u{300}", &["\u{200d}\u{300}"]),
-    ("\u{200d}\u{308}\u{300}", &["\u{200d}\u{308}\u{300}"]),
-    ("\u{200d}\u{200d}", &["\u{200d}\u{200d}"]),
-    ("\u{200d}\u{308}\u{200d}", &["\u{200d}\u{308}\u{200d}"]),
-    ("\u{200d}\u{61}\u{2060}", &["\u{200d}", "\u{61}\u{2060}"]),
-    (
-        "\u{200d}\u{308}\u{61}\u{2060}",
-        &["\u{200d}\u{308}", "\u{61}\u{2060}"],
-    ),
-    ("\u{200d}\u{61}\u{3a}", &["\u{200d}", "\u{61}", "\u{3a}"]),
-    (
-        "\u{200d}\u{308}\u{61}\u{3a}",
-        &["\u{200d}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    ("\u{200d}\u{61}\u{27}", &["\u{200d}", "\u{61}", "\u{27}"]),
-    (
-        "\u{200d}\u{308}\u{61}\u{27}",
-        &["\u{200d}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{200d}\u{61}\u{27}\u{2060}",
-        &["\u{200d}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{200d}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{200d}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    ("\u{200d}\u{61}\u{2c}", &["\u{200d}", "\u{61}", "\u{2c}"]),
-    (
-        "\u{200d}\u{308}\u{61}\u{2c}",
-        &["\u{200d}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    ("\u{200d}\u{31}\u{3a}", &["\u{200d}", "\u{31}", "\u{3a}"]),
-    (
-        "\u{200d}\u{308}\u{31}\u{3a}",
-        &["\u{200d}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    ("\u{200d}\u{31}\u{27}", &["\u{200d}", "\u{31}", "\u{27}"]),
-    (
-        "\u{200d}\u{308}\u{31}\u{27}",
-        &["\u{200d}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    ("\u{200d}\u{31}\u{2c}", &["\u{200d}", "\u{31}", "\u{2c}"]),
-    (
-        "\u{200d}\u{308}\u{31}\u{2c}",
-        &["\u{200d}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{200d}\u{31}\u{2e}\u{2060}",
-        &["\u{200d}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{200d}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{200d}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{61}\u{2060}\u{1}", &["\u{61}\u{2060}", "\u{1}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{1}",
-        &["\u{61}\u{2060}\u{308}", "\u{1}"],
-    ),
-    ("\u{61}\u{2060}\u{d}", &["\u{61}\u{2060}", "\u{d}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{d}",
-        &["\u{61}\u{2060}\u{308}", "\u{d}"],
-    ),
-    ("\u{61}\u{2060}\u{a}", &["\u{61}\u{2060}", "\u{a}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{a}",
-        &["\u{61}\u{2060}\u{308}", "\u{a}"],
-    ),
-    ("\u{61}\u{2060}\u{b}", &["\u{61}\u{2060}", "\u{b}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{b}",
-        &["\u{61}\u{2060}\u{308}", "\u{b}"],
-    ),
-    ("\u{61}\u{2060}\u{3031}", &["\u{61}\u{2060}", "\u{3031}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{3031}",
-        &["\u{61}\u{2060}\u{308}", "\u{3031}"],
-    ),
-    ("\u{61}\u{2060}\u{41}", &["\u{61}\u{2060}\u{41}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{41}",
-        &["\u{61}\u{2060}\u{308}\u{41}"],
-    ),
-    ("\u{61}\u{2060}\u{3a}", &["\u{61}\u{2060}", "\u{3a}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{3a}",
-        &["\u{61}\u{2060}\u{308}", "\u{3a}"],
-    ),
-    ("\u{61}\u{2060}\u{2c}", &["\u{61}\u{2060}", "\u{2c}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{2c}",
-        &["\u{61}\u{2060}\u{308}", "\u{2c}"],
-    ),
-    ("\u{61}\u{2060}\u{2e}", &["\u{61}\u{2060}", "\u{2e}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{2e}",
-        &["\u{61}\u{2060}\u{308}", "\u{2e}"],
-    ),
-    ("\u{61}\u{2060}\u{30}", &["\u{61}\u{2060}\u{30}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{30}",
-        &["\u{61}\u{2060}\u{308}\u{30}"],
-    ),
-    ("\u{61}\u{2060}\u{5f}", &["\u{61}\u{2060}\u{5f}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{5f}",
-        &["\u{61}\u{2060}\u{308}\u{5f}"],
-    ),
-    ("\u{61}\u{2060}\u{1f1e6}", &["\u{61}\u{2060}", "\u{1f1e6}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{1f1e6}",
-        &["\u{61}\u{2060}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{61}\u{2060}\u{5d0}", &["\u{61}\u{2060}\u{5d0}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{5d0}",
-        &["\u{61}\u{2060}\u{308}\u{5d0}"],
-    ),
-    ("\u{61}\u{2060}\u{22}", &["\u{61}\u{2060}", "\u{22}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{22}",
-        &["\u{61}\u{2060}\u{308}", "\u{22}"],
-    ),
-    ("\u{61}\u{2060}\u{27}", &["\u{61}\u{2060}", "\u{27}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{27}",
-        &["\u{61}\u{2060}\u{308}", "\u{27}"],
-    ),
-    ("\u{61}\u{2060}\u{231a}", &["\u{61}\u{2060}", "\u{231a}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{231a}",
-        &["\u{61}\u{2060}\u{308}", "\u{231a}"],
-    ),
-    ("\u{61}\u{2060}\u{20}", &["\u{61}\u{2060}", "\u{20}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{20}",
-        &["\u{61}\u{2060}\u{308}", "\u{20}"],
-    ),
-    ("\u{61}\u{2060}\u{ad}", &["\u{61}\u{2060}\u{ad}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{ad}",
-        &["\u{61}\u{2060}\u{308}\u{ad}"],
-    ),
-    ("\u{61}\u{2060}\u{300}", &["\u{61}\u{2060}\u{300}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{300}",
-        &["\u{61}\u{2060}\u{308}\u{300}"],
-    ),
-    ("\u{61}\u{2060}\u{200d}", &["\u{61}\u{2060}\u{200d}"]),
-    (
-        "\u{61}\u{2060}\u{308}\u{200d}",
-        &["\u{61}\u{2060}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{61}\u{2060}",
-        &["\u{61}\u{2060}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{61}\u{2060}",
-        &["\u{61}\u{2060}\u{308}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{61}\u{3a}",
-        &["\u{61}\u{2060}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{61}\u{3a}",
-        &["\u{61}\u{2060}\u{308}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{61}\u{27}",
-        &["\u{61}\u{2060}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{61}\u{27}",
-        &["\u{61}\u{2060}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{2060}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{2060}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{61}\u{2c}",
-        &["\u{61}\u{2060}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{61}\u{2c}",
-        &["\u{61}\u{2060}\u{308}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{31}\u{3a}",
-        &["\u{61}\u{2060}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{31}\u{3a}",
-        &["\u{61}\u{2060}\u{308}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{31}\u{27}",
-        &["\u{61}\u{2060}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{31}\u{27}",
-        &["\u{61}\u{2060}\u{308}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{31}\u{2c}",
-        &["\u{61}\u{2060}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{31}\u{2c}",
-        &["\u{61}\u{2060}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{31}\u{2e}\u{2060}",
-        &["\u{61}\u{2060}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2060}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{61}\u{2060}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{61}\u{3a}\u{1}", &["\u{61}", "\u{3a}", "\u{1}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{1}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{1}"],
-    ),
-    ("\u{61}\u{3a}\u{d}", &["\u{61}", "\u{3a}", "\u{d}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{d}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{d}"],
-    ),
-    ("\u{61}\u{3a}\u{a}", &["\u{61}", "\u{3a}", "\u{a}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{a}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{a}"],
-    ),
-    ("\u{61}\u{3a}\u{b}", &["\u{61}", "\u{3a}", "\u{b}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{b}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{b}"],
-    ),
-    ("\u{61}\u{3a}\u{3031}", &["\u{61}", "\u{3a}", "\u{3031}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{3031}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{3031}"],
-    ),
-    ("\u{61}\u{3a}\u{41}", &["\u{61}\u{3a}\u{41}"]),
-    ("\u{61}\u{3a}\u{308}\u{41}", &["\u{61}\u{3a}\u{308}\u{41}"]),
-    ("\u{61}\u{3a}\u{3a}", &["\u{61}", "\u{3a}", "\u{3a}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{3a}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{3a}"],
-    ),
-    ("\u{61}\u{3a}\u{2c}", &["\u{61}", "\u{3a}", "\u{2c}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{2c}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{2c}"],
-    ),
-    ("\u{61}\u{3a}\u{2e}", &["\u{61}", "\u{3a}", "\u{2e}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{2e}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{2e}"],
-    ),
-    ("\u{61}\u{3a}\u{30}", &["\u{61}", "\u{3a}", "\u{30}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{30}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{30}"],
-    ),
-    ("\u{61}\u{3a}\u{5f}", &["\u{61}", "\u{3a}", "\u{5f}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{5f}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{5f}"],
-    ),
-    ("\u{61}\u{3a}\u{1f1e6}", &["\u{61}", "\u{3a}", "\u{1f1e6}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{1f1e6}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{61}\u{3a}\u{5d0}", &["\u{61}\u{3a}\u{5d0}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{5d0}",
-        &["\u{61}\u{3a}\u{308}\u{5d0}"],
-    ),
-    ("\u{61}\u{3a}\u{22}", &["\u{61}", "\u{3a}", "\u{22}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{22}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{22}"],
-    ),
-    ("\u{61}\u{3a}\u{27}", &["\u{61}", "\u{3a}", "\u{27}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{27}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{27}"],
-    ),
-    ("\u{61}\u{3a}\u{231a}", &["\u{61}", "\u{3a}", "\u{231a}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{231a}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{231a}"],
-    ),
-    ("\u{61}\u{3a}\u{20}", &["\u{61}", "\u{3a}", "\u{20}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{20}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{20}"],
-    ),
-    ("\u{61}\u{3a}\u{ad}", &["\u{61}", "\u{3a}\u{ad}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{ad}",
-        &["\u{61}", "\u{3a}\u{308}\u{ad}"],
-    ),
-    ("\u{61}\u{3a}\u{300}", &["\u{61}", "\u{3a}\u{300}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{300}",
-        &["\u{61}", "\u{3a}\u{308}\u{300}"],
-    ),
-    ("\u{61}\u{3a}\u{200d}", &["\u{61}", "\u{3a}\u{200d}"]),
-    (
-        "\u{61}\u{3a}\u{308}\u{200d}",
-        &["\u{61}", "\u{3a}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{61}\u{2060}",
-        &["\u{61}\u{3a}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{61}\u{2060}",
-        &["\u{61}\u{3a}\u{308}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{61}\u{3a}",
-        &["\u{61}\u{3a}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{61}\u{3a}",
-        &["\u{61}\u{3a}\u{308}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{61}\u{27}",
-        &["\u{61}\u{3a}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{61}\u{27}",
-        &["\u{61}\u{3a}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{3a}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{3a}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{61}\u{2c}",
-        &["\u{61}\u{3a}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{61}\u{2c}",
-        &["\u{61}\u{3a}\u{308}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{31}\u{3a}",
-        &["\u{61}", "\u{3a}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{31}\u{3a}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{31}\u{27}",
-        &["\u{61}", "\u{3a}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{31}\u{27}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{31}\u{2c}",
-        &["\u{61}", "\u{3a}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{31}\u{2c}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{3a}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{61}\u{27}\u{1}", &["\u{61}", "\u{27}", "\u{1}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{1}",
-        &["\u{61}", "\u{27}\u{308}", "\u{1}"],
-    ),
-    ("\u{61}\u{27}\u{d}", &["\u{61}", "\u{27}", "\u{d}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{d}",
-        &["\u{61}", "\u{27}\u{308}", "\u{d}"],
-    ),
-    ("\u{61}\u{27}\u{a}", &["\u{61}", "\u{27}", "\u{a}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{a}",
-        &["\u{61}", "\u{27}\u{308}", "\u{a}"],
-    ),
-    ("\u{61}\u{27}\u{b}", &["\u{61}", "\u{27}", "\u{b}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{b}",
-        &["\u{61}", "\u{27}\u{308}", "\u{b}"],
-    ),
-    ("\u{61}\u{27}\u{3031}", &["\u{61}", "\u{27}", "\u{3031}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{3031}",
-        &["\u{61}", "\u{27}\u{308}", "\u{3031}"],
-    ),
-    ("\u{61}\u{27}\u{41}", &["\u{61}\u{27}\u{41}"]),
-    ("\u{61}\u{27}\u{308}\u{41}", &["\u{61}\u{27}\u{308}\u{41}"]),
-    ("\u{61}\u{27}\u{3a}", &["\u{61}", "\u{27}", "\u{3a}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{3a}",
-        &["\u{61}", "\u{27}\u{308}", "\u{3a}"],
-    ),
-    ("\u{61}\u{27}\u{2c}", &["\u{61}", "\u{27}", "\u{2c}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{2c}",
-        &["\u{61}", "\u{27}\u{308}", "\u{2c}"],
-    ),
-    ("\u{61}\u{27}\u{2e}", &["\u{61}", "\u{27}", "\u{2e}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{2e}",
-        &["\u{61}", "\u{27}\u{308}", "\u{2e}"],
-    ),
-    ("\u{61}\u{27}\u{30}", &["\u{61}", "\u{27}", "\u{30}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{30}",
-        &["\u{61}", "\u{27}\u{308}", "\u{30}"],
-    ),
-    ("\u{61}\u{27}\u{5f}", &["\u{61}", "\u{27}", "\u{5f}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{5f}",
-        &["\u{61}", "\u{27}\u{308}", "\u{5f}"],
-    ),
-    ("\u{61}\u{27}\u{1f1e6}", &["\u{61}", "\u{27}", "\u{1f1e6}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{1f1e6}",
-        &["\u{61}", "\u{27}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{61}\u{27}\u{5d0}", &["\u{61}\u{27}\u{5d0}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{5d0}",
-        &["\u{61}\u{27}\u{308}\u{5d0}"],
-    ),
-    ("\u{61}\u{27}\u{22}", &["\u{61}", "\u{27}", "\u{22}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{22}",
-        &["\u{61}", "\u{27}\u{308}", "\u{22}"],
-    ),
-    ("\u{61}\u{27}\u{27}", &["\u{61}", "\u{27}", "\u{27}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{27}",
-        &["\u{61}", "\u{27}\u{308}", "\u{27}"],
-    ),
-    ("\u{61}\u{27}\u{231a}", &["\u{61}", "\u{27}", "\u{231a}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{231a}",
-        &["\u{61}", "\u{27}\u{308}", "\u{231a}"],
-    ),
-    ("\u{61}\u{27}\u{20}", &["\u{61}", "\u{27}", "\u{20}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{20}",
-        &["\u{61}", "\u{27}\u{308}", "\u{20}"],
-    ),
-    ("\u{61}\u{27}\u{ad}", &["\u{61}", "\u{27}\u{ad}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{ad}",
-        &["\u{61}", "\u{27}\u{308}\u{ad}"],
-    ),
-    ("\u{61}\u{27}\u{300}", &["\u{61}", "\u{27}\u{300}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{300}",
-        &["\u{61}", "\u{27}\u{308}\u{300}"],
-    ),
-    ("\u{61}\u{27}\u{200d}", &["\u{61}", "\u{27}\u{200d}"]),
-    (
-        "\u{61}\u{27}\u{308}\u{200d}",
-        &["\u{61}", "\u{27}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{61}\u{27}\u{61}\u{2060}",
-        &["\u{61}\u{27}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{61}\u{2060}",
-        &["\u{61}\u{27}\u{308}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{61}\u{3a}",
-        &["\u{61}\u{27}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{61}\u{3a}",
-        &["\u{61}\u{27}\u{308}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{61}\u{27}",
-        &["\u{61}\u{27}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{61}\u{27}",
-        &["\u{61}\u{27}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{27}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{27}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{61}\u{2c}",
-        &["\u{61}\u{27}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{61}\u{2c}",
-        &["\u{61}\u{27}\u{308}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{31}\u{3a}",
-        &["\u{61}", "\u{27}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{31}\u{3a}",
-        &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{31}\u{27}",
-        &["\u{61}", "\u{27}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{31}\u{27}",
-        &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{31}\u{2c}",
-        &["\u{61}", "\u{27}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{31}\u{2c}",
-        &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{27}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{1}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{1}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{1}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{1}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{d}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{d}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{d}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{d}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{a}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{a}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{b}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{b}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{b}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{b}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{3031}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{3031}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{3031}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{3031}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{41}",
-        &["\u{61}\u{27}\u{2060}\u{41}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{41}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{41}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{3a}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{3a}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{2c}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{2c}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{2e}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{2e}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{2e}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{2e}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{30}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{30}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{30}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{30}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{5f}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{5f}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{5f}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{5f}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{1f1e6}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{1f1e6}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{1f1e6}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{1f1e6}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{5d0}",
-        &["\u{61}\u{27}\u{2060}\u{5d0}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{5d0}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{5d0}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{22}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{22}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{22}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{22}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{27}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{27}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{231a}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{231a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{231a}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{231a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{20}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{20}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{20}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{20}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{ad}",
-        &["\u{61}", "\u{27}\u{2060}\u{ad}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{ad}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}\u{ad}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{300}",
-        &["\u{61}", "\u{27}\u{2060}\u{300}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{300}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}\u{300}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{200d}",
-        &["\u{61}", "\u{27}\u{2060}\u{200d}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{200d}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{61}\u{2060}",
-        &["\u{61}\u{27}\u{2060}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{61}\u{2060}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{61}\u{3a}",
-        &["\u{61}\u{27}\u{2060}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{61}\u{3a}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{61}\u{27}",
-        &["\u{61}\u{27}\u{2060}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{61}\u{27}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{27}\u{2060}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{61}\u{2c}",
-        &["\u{61}\u{27}\u{2060}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{61}\u{2c}",
-        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{31}\u{3a}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{31}\u{3a}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{31}\u{27}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{31}\u{27}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{31}\u{2c}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{31}\u{2c}",
-        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{27}\u{2060}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{27}\u{2060}\u{308}\u{31}\u{2e}\u{2060}",
-        &[
-            "\u{61}",
-            "\u{27}\u{2060}\u{308}",
-            "\u{31}",
-            "\u{2e}\u{2060}",
-        ],
-    ),
-    ("\u{61}\u{2c}\u{1}", &["\u{61}", "\u{2c}", "\u{1}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{1}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{1}"],
-    ),
-    ("\u{61}\u{2c}\u{d}", &["\u{61}", "\u{2c}", "\u{d}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{d}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{d}"],
-    ),
-    ("\u{61}\u{2c}\u{a}", &["\u{61}", "\u{2c}", "\u{a}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{a}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{a}"],
-    ),
-    ("\u{61}\u{2c}\u{b}", &["\u{61}", "\u{2c}", "\u{b}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{b}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{b}"],
-    ),
-    ("\u{61}\u{2c}\u{3031}", &["\u{61}", "\u{2c}", "\u{3031}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{3031}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{3031}"],
-    ),
-    ("\u{61}\u{2c}\u{41}", &["\u{61}", "\u{2c}", "\u{41}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{41}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{41}"],
-    ),
-    ("\u{61}\u{2c}\u{3a}", &["\u{61}", "\u{2c}", "\u{3a}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{3a}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{3a}"],
-    ),
-    ("\u{61}\u{2c}\u{2c}", &["\u{61}", "\u{2c}", "\u{2c}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{2c}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{2c}"],
-    ),
-    ("\u{61}\u{2c}\u{2e}", &["\u{61}", "\u{2c}", "\u{2e}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{2e}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{2e}"],
-    ),
-    ("\u{61}\u{2c}\u{30}", &["\u{61}", "\u{2c}", "\u{30}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{30}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{30}"],
-    ),
-    ("\u{61}\u{2c}\u{5f}", &["\u{61}", "\u{2c}", "\u{5f}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{5f}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{5f}"],
-    ),
-    ("\u{61}\u{2c}\u{1f1e6}", &["\u{61}", "\u{2c}", "\u{1f1e6}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{1f1e6}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{61}\u{2c}\u{5d0}", &["\u{61}", "\u{2c}", "\u{5d0}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{5d0}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{5d0}"],
-    ),
-    ("\u{61}\u{2c}\u{22}", &["\u{61}", "\u{2c}", "\u{22}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{22}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{22}"],
-    ),
-    ("\u{61}\u{2c}\u{27}", &["\u{61}", "\u{2c}", "\u{27}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{27}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{27}"],
-    ),
-    ("\u{61}\u{2c}\u{231a}", &["\u{61}", "\u{2c}", "\u{231a}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{231a}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{231a}"],
-    ),
-    ("\u{61}\u{2c}\u{20}", &["\u{61}", "\u{2c}", "\u{20}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{20}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{20}"],
-    ),
-    ("\u{61}\u{2c}\u{ad}", &["\u{61}", "\u{2c}\u{ad}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{ad}",
-        &["\u{61}", "\u{2c}\u{308}\u{ad}"],
-    ),
-    ("\u{61}\u{2c}\u{300}", &["\u{61}", "\u{2c}\u{300}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{300}",
-        &["\u{61}", "\u{2c}\u{308}\u{300}"],
-    ),
-    ("\u{61}\u{2c}\u{200d}", &["\u{61}", "\u{2c}\u{200d}"]),
-    (
-        "\u{61}\u{2c}\u{308}\u{200d}",
-        &["\u{61}", "\u{2c}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{61}\u{2060}",
-        &["\u{61}", "\u{2c}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{61}\u{2060}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{61}\u{3a}",
-        &["\u{61}", "\u{2c}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{61}\u{3a}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{61}\u{27}",
-        &["\u{61}", "\u{2c}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{61}\u{27}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{61}\u{27}\u{2060}",
-        &["\u{61}", "\u{2c}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{61}\u{2c}",
-        &["\u{61}", "\u{2c}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{61}\u{2c}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{31}\u{3a}",
-        &["\u{61}", "\u{2c}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{31}\u{3a}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{31}\u{27}",
-        &["\u{61}", "\u{2c}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{31}\u{27}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{31}\u{2c}",
-        &["\u{61}", "\u{2c}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{31}\u{2c}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{2c}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{31}\u{3a}\u{1}", &["\u{31}", "\u{3a}", "\u{1}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{1}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{1}"],
-    ),
-    ("\u{31}\u{3a}\u{d}", &["\u{31}", "\u{3a}", "\u{d}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{d}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{d}"],
-    ),
-    ("\u{31}\u{3a}\u{a}", &["\u{31}", "\u{3a}", "\u{a}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{a}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{a}"],
-    ),
-    ("\u{31}\u{3a}\u{b}", &["\u{31}", "\u{3a}", "\u{b}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{b}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{b}"],
-    ),
-    ("\u{31}\u{3a}\u{3031}", &["\u{31}", "\u{3a}", "\u{3031}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{3031}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{3031}"],
-    ),
-    ("\u{31}\u{3a}\u{41}", &["\u{31}", "\u{3a}", "\u{41}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{41}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{41}"],
-    ),
-    ("\u{31}\u{3a}\u{3a}", &["\u{31}", "\u{3a}", "\u{3a}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{3a}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{3a}"],
-    ),
-    ("\u{31}\u{3a}\u{2c}", &["\u{31}", "\u{3a}", "\u{2c}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{2c}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{2c}"],
-    ),
-    ("\u{31}\u{3a}\u{2e}", &["\u{31}", "\u{3a}", "\u{2e}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{2e}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{2e}"],
-    ),
-    ("\u{31}\u{3a}\u{30}", &["\u{31}", "\u{3a}", "\u{30}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{30}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{30}"],
-    ),
-    ("\u{31}\u{3a}\u{5f}", &["\u{31}", "\u{3a}", "\u{5f}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{5f}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{5f}"],
-    ),
-    ("\u{31}\u{3a}\u{1f1e6}", &["\u{31}", "\u{3a}", "\u{1f1e6}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{1f1e6}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{31}\u{3a}\u{5d0}", &["\u{31}", "\u{3a}", "\u{5d0}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{5d0}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{5d0}"],
-    ),
-    ("\u{31}\u{3a}\u{22}", &["\u{31}", "\u{3a}", "\u{22}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{22}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{22}"],
-    ),
-    ("\u{31}\u{3a}\u{27}", &["\u{31}", "\u{3a}", "\u{27}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{27}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{27}"],
-    ),
-    ("\u{31}\u{3a}\u{231a}", &["\u{31}", "\u{3a}", "\u{231a}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{231a}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{231a}"],
-    ),
-    ("\u{31}\u{3a}\u{20}", &["\u{31}", "\u{3a}", "\u{20}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{20}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{20}"],
-    ),
-    ("\u{31}\u{3a}\u{ad}", &["\u{31}", "\u{3a}\u{ad}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{ad}",
-        &["\u{31}", "\u{3a}\u{308}\u{ad}"],
-    ),
-    ("\u{31}\u{3a}\u{300}", &["\u{31}", "\u{3a}\u{300}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{300}",
-        &["\u{31}", "\u{3a}\u{308}\u{300}"],
-    ),
-    ("\u{31}\u{3a}\u{200d}", &["\u{31}", "\u{3a}\u{200d}"]),
-    (
-        "\u{31}\u{3a}\u{308}\u{200d}",
-        &["\u{31}", "\u{3a}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{61}\u{2060}",
-        &["\u{31}", "\u{3a}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{61}\u{2060}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{61}\u{3a}",
-        &["\u{31}", "\u{3a}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{61}\u{3a}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{61}\u{27}",
-        &["\u{31}", "\u{3a}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{61}\u{27}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{3a}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{61}\u{2c}",
-        &["\u{31}", "\u{3a}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{61}\u{2c}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{31}\u{3a}",
-        &["\u{31}", "\u{3a}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{31}\u{3a}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{31}\u{27}",
-        &["\u{31}", "\u{3a}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{31}\u{27}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{31}\u{2c}",
-        &["\u{31}", "\u{3a}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{31}\u{2c}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{31}\u{2e}\u{2060}",
-        &["\u{31}", "\u{3a}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{31}\u{27}\u{1}", &["\u{31}", "\u{27}", "\u{1}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{1}",
-        &["\u{31}", "\u{27}\u{308}", "\u{1}"],
-    ),
-    ("\u{31}\u{27}\u{d}", &["\u{31}", "\u{27}", "\u{d}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{d}",
-        &["\u{31}", "\u{27}\u{308}", "\u{d}"],
-    ),
-    ("\u{31}\u{27}\u{a}", &["\u{31}", "\u{27}", "\u{a}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{a}",
-        &["\u{31}", "\u{27}\u{308}", "\u{a}"],
-    ),
-    ("\u{31}\u{27}\u{b}", &["\u{31}", "\u{27}", "\u{b}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{b}",
-        &["\u{31}", "\u{27}\u{308}", "\u{b}"],
-    ),
-    ("\u{31}\u{27}\u{3031}", &["\u{31}", "\u{27}", "\u{3031}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{3031}",
-        &["\u{31}", "\u{27}\u{308}", "\u{3031}"],
-    ),
-    ("\u{31}\u{27}\u{41}", &["\u{31}", "\u{27}", "\u{41}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{41}",
-        &["\u{31}", "\u{27}\u{308}", "\u{41}"],
-    ),
-    ("\u{31}\u{27}\u{3a}", &["\u{31}", "\u{27}", "\u{3a}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{3a}",
-        &["\u{31}", "\u{27}\u{308}", "\u{3a}"],
-    ),
-    ("\u{31}\u{27}\u{2c}", &["\u{31}", "\u{27}", "\u{2c}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{2c}",
-        &["\u{31}", "\u{27}\u{308}", "\u{2c}"],
-    ),
-    ("\u{31}\u{27}\u{2e}", &["\u{31}", "\u{27}", "\u{2e}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{2e}",
-        &["\u{31}", "\u{27}\u{308}", "\u{2e}"],
-    ),
-    ("\u{31}\u{27}\u{30}", &["\u{31}\u{27}\u{30}"]),
-    ("\u{31}\u{27}\u{308}\u{30}", &["\u{31}\u{27}\u{308}\u{30}"]),
-    ("\u{31}\u{27}\u{5f}", &["\u{31}", "\u{27}", "\u{5f}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{5f}",
-        &["\u{31}", "\u{27}\u{308}", "\u{5f}"],
-    ),
-    ("\u{31}\u{27}\u{1f1e6}", &["\u{31}", "\u{27}", "\u{1f1e6}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{1f1e6}",
-        &["\u{31}", "\u{27}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{31}\u{27}\u{5d0}", &["\u{31}", "\u{27}", "\u{5d0}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{5d0}",
-        &["\u{31}", "\u{27}\u{308}", "\u{5d0}"],
-    ),
-    ("\u{31}\u{27}\u{22}", &["\u{31}", "\u{27}", "\u{22}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{22}",
-        &["\u{31}", "\u{27}\u{308}", "\u{22}"],
-    ),
-    ("\u{31}\u{27}\u{27}", &["\u{31}", "\u{27}", "\u{27}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{27}",
-        &["\u{31}", "\u{27}\u{308}", "\u{27}"],
-    ),
-    ("\u{31}\u{27}\u{231a}", &["\u{31}", "\u{27}", "\u{231a}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{231a}",
-        &["\u{31}", "\u{27}\u{308}", "\u{231a}"],
-    ),
-    ("\u{31}\u{27}\u{20}", &["\u{31}", "\u{27}", "\u{20}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{20}",
-        &["\u{31}", "\u{27}\u{308}", "\u{20}"],
-    ),
-    ("\u{31}\u{27}\u{ad}", &["\u{31}", "\u{27}\u{ad}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{ad}",
-        &["\u{31}", "\u{27}\u{308}\u{ad}"],
-    ),
-    ("\u{31}\u{27}\u{300}", &["\u{31}", "\u{27}\u{300}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{300}",
-        &["\u{31}", "\u{27}\u{308}\u{300}"],
-    ),
-    ("\u{31}\u{27}\u{200d}", &["\u{31}", "\u{27}\u{200d}"]),
-    (
-        "\u{31}\u{27}\u{308}\u{200d}",
-        &["\u{31}", "\u{27}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{31}\u{27}\u{61}\u{2060}",
-        &["\u{31}", "\u{27}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{61}\u{2060}",
-        &["\u{31}", "\u{27}\u{308}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{27}\u{61}\u{3a}",
-        &["\u{31}", "\u{27}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{61}\u{3a}",
-        &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{27}\u{61}\u{27}",
-        &["\u{31}", "\u{27}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{61}\u{27}",
-        &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{27}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{27}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{27}\u{61}\u{2c}",
-        &["\u{31}", "\u{27}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{61}\u{2c}",
-        &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{27}\u{31}\u{3a}",
-        &["\u{31}\u{27}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{31}\u{3a}",
-        &["\u{31}\u{27}\u{308}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{27}\u{31}\u{27}",
-        &["\u{31}\u{27}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{31}\u{27}",
-        &["\u{31}\u{27}\u{308}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{27}\u{31}\u{2c}",
-        &["\u{31}\u{27}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{31}\u{2c}",
-        &["\u{31}\u{27}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{27}\u{31}\u{2e}\u{2060}",
-        &["\u{31}\u{27}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{27}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{31}\u{27}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    ("\u{31}\u{2c}\u{1}", &["\u{31}", "\u{2c}", "\u{1}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{1}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{1}"],
-    ),
-    ("\u{31}\u{2c}\u{d}", &["\u{31}", "\u{2c}", "\u{d}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{d}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{d}"],
-    ),
-    ("\u{31}\u{2c}\u{a}", &["\u{31}", "\u{2c}", "\u{a}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{a}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{a}"],
-    ),
-    ("\u{31}\u{2c}\u{b}", &["\u{31}", "\u{2c}", "\u{b}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{b}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{b}"],
-    ),
-    ("\u{31}\u{2c}\u{3031}", &["\u{31}", "\u{2c}", "\u{3031}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{3031}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{3031}"],
-    ),
-    ("\u{31}\u{2c}\u{41}", &["\u{31}", "\u{2c}", "\u{41}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{41}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{41}"],
-    ),
-    ("\u{31}\u{2c}\u{3a}", &["\u{31}", "\u{2c}", "\u{3a}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{3a}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{3a}"],
-    ),
-    ("\u{31}\u{2c}\u{2c}", &["\u{31}", "\u{2c}", "\u{2c}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{2c}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{2c}"],
-    ),
-    ("\u{31}\u{2c}\u{2e}", &["\u{31}", "\u{2c}", "\u{2e}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{2e}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{2e}"],
-    ),
-    ("\u{31}\u{2c}\u{30}", &["\u{31}\u{2c}\u{30}"]),
-    ("\u{31}\u{2c}\u{308}\u{30}", &["\u{31}\u{2c}\u{308}\u{30}"]),
-    ("\u{31}\u{2c}\u{5f}", &["\u{31}", "\u{2c}", "\u{5f}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{5f}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{5f}"],
-    ),
-    ("\u{31}\u{2c}\u{1f1e6}", &["\u{31}", "\u{2c}", "\u{1f1e6}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{1f1e6}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{1f1e6}"],
-    ),
-    ("\u{31}\u{2c}\u{5d0}", &["\u{31}", "\u{2c}", "\u{5d0}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{5d0}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{5d0}"],
-    ),
-    ("\u{31}\u{2c}\u{22}", &["\u{31}", "\u{2c}", "\u{22}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{22}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{22}"],
-    ),
-    ("\u{31}\u{2c}\u{27}", &["\u{31}", "\u{2c}", "\u{27}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{27}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{27}"],
-    ),
-    ("\u{31}\u{2c}\u{231a}", &["\u{31}", "\u{2c}", "\u{231a}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{231a}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{231a}"],
-    ),
-    ("\u{31}\u{2c}\u{20}", &["\u{31}", "\u{2c}", "\u{20}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{20}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{20}"],
-    ),
-    ("\u{31}\u{2c}\u{ad}", &["\u{31}", "\u{2c}\u{ad}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{ad}",
-        &["\u{31}", "\u{2c}\u{308}\u{ad}"],
-    ),
-    ("\u{31}\u{2c}\u{300}", &["\u{31}", "\u{2c}\u{300}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{300}",
-        &["\u{31}", "\u{2c}\u{308}\u{300}"],
-    ),
-    ("\u{31}\u{2c}\u{200d}", &["\u{31}", "\u{2c}\u{200d}"]),
-    (
-        "\u{31}\u{2c}\u{308}\u{200d}",
-        &["\u{31}", "\u{2c}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{61}\u{2060}",
-        &["\u{31}", "\u{2c}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{61}\u{2060}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{61}\u{3a}",
-        &["\u{31}", "\u{2c}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{61}\u{3a}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{61}\u{27}",
-        &["\u{31}", "\u{2c}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{61}\u{27}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{2c}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{61}\u{2c}",
-        &["\u{31}", "\u{2c}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{61}\u{2c}",
-        &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{31}\u{3a}",
-        &["\u{31}\u{2c}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{31}\u{3a}",
-        &["\u{31}\u{2c}\u{308}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{31}\u{27}",
-        &["\u{31}\u{2c}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{31}\u{27}",
-        &["\u{31}\u{2c}\u{308}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{31}\u{2c}",
-        &["\u{31}\u{2c}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{31}\u{2c}",
-        &["\u{31}\u{2c}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{31}\u{2e}\u{2060}",
-        &["\u{31}\u{2c}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{31}\u{2c}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{1}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{1}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{1}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{1}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{d}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{d}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{d}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{d}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{a}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{a}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{b}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{b}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{b}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{b}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{3031}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{3031}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{3031}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{3031}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{41}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{41}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{41}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{41}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{3a}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{3a}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{2c}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{2c}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{2e}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{2e}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{2e}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{2e}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{30}",
-        &["\u{31}\u{2e}\u{2060}\u{30}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{30}",
-        &["\u{31}\u{2e}\u{2060}\u{308}\u{30}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{5f}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{5f}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{5f}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{5f}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{1f1e6}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{1f1e6}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{1f1e6}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{1f1e6}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{5d0}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{5d0}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{5d0}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{5d0}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{22}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{22}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{22}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{22}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{27}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{27}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{231a}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{231a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{231a}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{231a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{20}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{20}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{20}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{20}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{ad}",
-        &["\u{31}", "\u{2e}\u{2060}\u{ad}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{ad}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}\u{ad}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{300}",
-        &["\u{31}", "\u{2e}\u{2060}\u{300}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{300}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}\u{300}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{200d}",
-        &["\u{31}", "\u{2e}\u{2060}\u{200d}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{200d}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}\u{200d}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{61}\u{2060}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{2060}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{61}\u{3a}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{3a}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{61}\u{27}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{27}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{61}\u{27}\u{2060}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{61}", "\u{27}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{27}\u{2060}",
-        &[
-            "\u{31}",
-            "\u{2e}\u{2060}\u{308}",
-            "\u{61}",
-            "\u{27}\u{2060}",
-        ],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{61}\u{2c}",
-        &["\u{31}", "\u{2e}\u{2060}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{2c}",
-        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{31}\u{3a}",
-        &["\u{31}\u{2e}\u{2060}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{3a}",
-        &["\u{31}\u{2e}\u{2060}\u{308}\u{31}", "\u{3a}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{31}\u{27}",
-        &["\u{31}\u{2e}\u{2060}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{27}",
-        &["\u{31}\u{2e}\u{2060}\u{308}\u{31}", "\u{27}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{31}\u{2c}",
-        &["\u{31}\u{2e}\u{2060}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{2c}",
-        &["\u{31}\u{2e}\u{2060}\u{308}\u{31}", "\u{2c}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{31}\u{2e}\u{2060}",
-        &["\u{31}\u{2e}\u{2060}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{2e}\u{2060}",
-        &["\u{31}\u{2e}\u{2060}\u{308}\u{31}", "\u{2e}\u{2060}"],
-    ),
-    (
-        "\u{d}\u{a}\u{61}\u{a}\u{308}",
-        &["\u{d}\u{a}", "\u{61}", "\u{a}", "\u{308}"],
-    ),
-    ("\u{61}\u{308}", &["\u{61}\u{308}"]),
-    ("\u{20}\u{200d}\u{646}", &["\u{20}\u{200d}", "\u{646}"]),
-    ("\u{646}\u{200d}\u{20}", &["\u{646}\u{200d}", "\u{20}"]),
-    ("\u{41}\u{41}\u{41}", &["\u{41}\u{41}\u{41}"]),
-    ("\u{41}\u{3a}\u{41}", &["\u{41}\u{3a}\u{41}"]),
-    (
-        "\u{41}\u{3a}\u{3a}\u{41}",
-        &["\u{41}", "\u{3a}", "\u{3a}", "\u{41}"],
-    ),
-    ("\u{5d0}\u{27}", &["\u{5d0}\u{27}"]),
-    ("\u{5d0}\u{22}\u{5d0}", &["\u{5d0}\u{22}\u{5d0}"]),
-    ("\u{41}\u{30}\u{30}\u{41}", &["\u{41}\u{30}\u{30}\u{41}"]),
-    ("\u{30}\u{2c}\u{30}", &["\u{30}\u{2c}\u{30}"]),
-    (
-        "\u{30}\u{2c}\u{2c}\u{30}",
-        &["\u{30}", "\u{2c}", "\u{2c}", "\u{30}"],
-    ),
-    ("\u{3031}\u{3031}", &["\u{3031}\u{3031}"]),
-    (
-        "\u{41}\u{5f}\u{30}\u{5f}\u{3031}\u{5f}",
-        &["\u{41}\u{5f}\u{30}\u{5f}\u{3031}\u{5f}"],
-    ),
-    ("\u{41}\u{5f}\u{5f}\u{41}", &["\u{41}\u{5f}\u{5f}\u{41}"]),
-    (
-        "\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}",
-        &["\u{1f1e6}\u{1f1e7}", "\u{1f1e8}", "\u{62}"],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}",
-        &["\u{61}", "\u{1f1e6}\u{1f1e7}", "\u{1f1e8}", "\u{62}"],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{1f1e7}\u{200d}\u{1f1e8}\u{62}",
-        &[
-            "\u{61}",
-            "\u{1f1e6}\u{1f1e7}\u{200d}",
-            "\u{1f1e8}",
-            "\u{62}",
-        ],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{200d}\u{1f1e7}\u{1f1e8}\u{62}",
-        &[
-            "\u{61}",
-            "\u{1f1e6}\u{200d}\u{1f1e7}",
-            "\u{1f1e8}",
-            "\u{62}",
-        ],
-    ),
-    (
-        "\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{1f1e9}\u{62}",
-        &[
-            "\u{61}",
-            "\u{1f1e6}\u{1f1e7}",
-            "\u{1f1e8}\u{1f1e9}",
-            "\u{62}",
-        ],
-    ),
-    (
-        "\u{1f476}\u{1f3ff}\u{1f476}",
-        &["\u{1f476}\u{1f3ff}", "\u{1f476}"],
-    ),
-    (
-        "\u{1f6d1}\u{200d}\u{1f6d1}",
-        &["\u{1f6d1}\u{200d}\u{1f6d1}"],
-    ),
-    ("\u{61}\u{200d}\u{1f6d1}", &["\u{61}\u{200d}\u{1f6d1}"]),
-    ("\u{2701}\u{200d}\u{2701}", &["\u{2701}\u{200d}\u{2701}"]),
-    ("\u{61}\u{200d}\u{2701}", &["\u{61}\u{200d}\u{2701}"]),
-    (
-        "\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}",
-        &["\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}"],
-    ),
-    ("\u{1f6d1}\u{1f3ff}", &["\u{1f6d1}\u{1f3ff}"]),
-    (
-        "\u{200d}\u{1f6d1}\u{1f3ff}",
-        &["\u{200d}\u{1f6d1}\u{1f3ff}"],
-    ),
-    ("\u{200d}\u{1f6d1}", &["\u{200d}\u{1f6d1}"]),
-    ("\u{200d}\u{1f6d1}", &["\u{200d}\u{1f6d1}"]),
-    ("\u{1f6d1}\u{1f6d1}", &["\u{1f6d1}", "\u{1f6d1}"]),
-    (
-        "\u{61}\u{308}\u{200d}\u{308}\u{62}",
-        &["\u{61}\u{308}\u{200d}\u{308}\u{62}"],
-    ),
-    (
-        "\u{61}\u{20}\u{20}\u{62}",
-        &["\u{61}", "\u{20}\u{20}", "\u{62}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{3a}\u{31}",
-        &["\u{31}", "\u{3a}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{3a}\u{3a}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{3a}\u{3a}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{3a}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{3a}\u{61}",
-        &["\u{31}", "\u{3a}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{3a}\u{3a}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{3a}\u{3a}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{3a}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{2e}\u{31}",
-        &["\u{31}", "\u{3a}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{3a}\u{2e}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{3a}\u{2e}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{3a}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{2e}\u{61}",
-        &["\u{31}", "\u{3a}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{3a}\u{2e}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{3a}\u{2e}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{3a}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{2c}\u{31}",
-        &["\u{31}", "\u{3a}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{3a}\u{2c}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{3a}\u{2c}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{3a}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{3a}\u{2c}\u{61}",
-        &["\u{31}", "\u{3a}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{3a}\u{2c}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{3a}\u{2c}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{3a}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{3a}\u{31}",
-        &["\u{31}", "\u{2e}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2e}\u{3a}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{2e}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2e}\u{3a}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{2e}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{3a}\u{61}",
-        &["\u{31}", "\u{2e}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2e}\u{3a}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{2e}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2e}\u{3a}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{2e}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2e}\u{31}",
-        &["\u{31}", "\u{2e}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2e}\u{2e}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{2e}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2e}\u{2e}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{2e}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2e}\u{61}",
-        &["\u{31}", "\u{2e}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2e}\u{2e}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{2e}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2e}\u{2e}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{2e}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2c}\u{31}",
-        &["\u{31}", "\u{2e}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2e}\u{2c}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{2e}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2e}\u{2c}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{2e}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{2e}\u{2c}\u{61}",
-        &["\u{31}", "\u{2e}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2e}\u{2c}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{2e}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2e}\u{2c}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{2e}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{3a}\u{31}",
-        &["\u{31}", "\u{2c}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2c}\u{3a}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{2c}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2c}\u{3a}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{2c}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{3a}\u{61}",
-        &["\u{31}", "\u{2c}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2c}\u{3a}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{2c}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2c}\u{3a}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{2c}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{2e}\u{31}",
-        &["\u{31}", "\u{2c}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2c}\u{2e}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{2c}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2c}\u{2e}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{2c}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{2e}\u{61}",
-        &["\u{31}", "\u{2c}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2c}\u{2e}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{2c}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2c}\u{2e}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{2c}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{2c}\u{31}",
-        &["\u{31}", "\u{2c}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2c}\u{2c}\u{31}",
-        &["\u{31}\u{5f}\u{31}", "\u{2c}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2c}\u{2c}\u{31}",
-        &["\u{31}\u{5f}\u{61}", "\u{2c}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{31}\u{2c}\u{2c}\u{61}",
-        &["\u{31}", "\u{2c}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{31}\u{2c}\u{2c}\u{61}",
-        &["\u{31}\u{5f}\u{31}", "\u{2c}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{31}\u{5f}\u{61}\u{2c}\u{2c}\u{61}",
-        &["\u{31}\u{5f}\u{61}", "\u{2c}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{3a}\u{31}",
-        &["\u{61}", "\u{3a}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{3a}\u{3a}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{3a}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{3a}\u{3a}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{3a}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{3a}\u{61}",
-        &["\u{61}", "\u{3a}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{3a}\u{3a}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{3a}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{3a}\u{3a}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{3a}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{2e}\u{31}",
-        &["\u{61}", "\u{3a}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{3a}\u{2e}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{3a}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{3a}\u{2e}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{3a}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{2e}\u{61}",
-        &["\u{61}", "\u{3a}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{3a}\u{2e}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{3a}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{3a}\u{2e}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{3a}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{2c}\u{31}",
-        &["\u{61}", "\u{3a}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{3a}\u{2c}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{3a}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{3a}\u{2c}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{3a}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{3a}\u{2c}\u{61}",
-        &["\u{61}", "\u{3a}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{3a}\u{2c}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{3a}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{3a}\u{2c}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{3a}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{2e}\u{3a}\u{31}",
-        &["\u{61}", "\u{2e}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2e}\u{3a}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{2e}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2e}\u{3a}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{2e}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{2e}\u{3a}\u{61}",
-        &["\u{61}", "\u{2e}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2e}\u{3a}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{2e}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2e}\u{3a}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{2e}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{2e}\u{2e}\u{31}",
-        &["\u{61}", "\u{2e}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2e}\u{2e}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{2e}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2e}\u{2e}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{2e}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{2e}\u{2e}\u{61}",
-        &["\u{61}", "\u{2e}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2e}\u{2e}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{2e}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2e}\u{2e}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{2e}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{2e}\u{2c}\u{31}",
-        &["\u{61}", "\u{2e}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2e}\u{2c}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{2e}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2e}\u{2c}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{2e}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{2e}\u{2c}\u{61}",
-        &["\u{61}", "\u{2e}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2e}\u{2c}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{2e}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2e}\u{2c}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{2e}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{3a}\u{31}",
-        &["\u{61}", "\u{2c}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2c}\u{3a}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{2c}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2c}\u{3a}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{2c}", "\u{3a}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{3a}\u{61}",
-        &["\u{61}", "\u{2c}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2c}\u{3a}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{2c}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2c}\u{3a}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{2c}", "\u{3a}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{2e}\u{31}",
-        &["\u{61}", "\u{2c}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2c}\u{2e}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{2c}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2c}\u{2e}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{2c}", "\u{2e}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{2e}\u{61}",
-        &["\u{61}", "\u{2c}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2c}\u{2e}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{2c}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2c}\u{2e}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{2c}", "\u{2e}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{2c}\u{31}",
-        &["\u{61}", "\u{2c}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2c}\u{2c}\u{31}",
-        &["\u{61}\u{5f}\u{31}", "\u{2c}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2c}\u{2c}\u{31}",
-        &["\u{61}\u{5f}\u{61}", "\u{2c}", "\u{2c}", "\u{31}"],
-    ),
-    (
-        "\u{61}\u{2c}\u{2c}\u{61}",
-        &["\u{61}", "\u{2c}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{31}\u{2c}\u{2c}\u{61}",
-        &["\u{61}\u{5f}\u{31}", "\u{2c}", "\u{2c}", "\u{61}"],
-    ),
-    (
-        "\u{61}\u{5f}\u{61}\u{2c}\u{2c}\u{61}",
-        &["\u{61}\u{5f}\u{61}", "\u{2c}", "\u{2c}", "\u{61}"],
-    ),
-];
-
-// official Unicode test data
-// http://www.unicode.org/Public/15.0.0/ucd/auxiliary/SentenceBreakTest.txt
-pub const TEST_SENTENCE: &'static [(&'static str, &'static [&'static str])] = &[
-        ("\u{1}\u{1}", &["\u{1}\u{1}"]), ("\u{1}\u{308}\u{1}", &["\u{1}\u{308}\u{1}"]),
-        ("\u{1}\u{d}", &["\u{1}\u{d}"]), ("\u{1}\u{308}\u{d}", &["\u{1}\u{308}\u{d}"]),
-        ("\u{1}\u{a}", &["\u{1}\u{a}"]), ("\u{1}\u{308}\u{a}", &["\u{1}\u{308}\u{a}"]),
-        ("\u{1}\u{85}", &["\u{1}\u{85}"]), ("\u{1}\u{308}\u{85}", &["\u{1}\u{308}\u{85}"]),
-        ("\u{1}\u{9}", &["\u{1}\u{9}"]), ("\u{1}\u{308}\u{9}", &["\u{1}\u{308}\u{9}"]),
-        ("\u{1}\u{61}", &["\u{1}\u{61}"]), ("\u{1}\u{308}\u{61}", &["\u{1}\u{308}\u{61}"]),
-        ("\u{1}\u{41}", &["\u{1}\u{41}"]), ("\u{1}\u{308}\u{41}", &["\u{1}\u{308}\u{41}"]),
-        ("\u{1}\u{1bb}", &["\u{1}\u{1bb}"]), ("\u{1}\u{308}\u{1bb}", &["\u{1}\u{308}\u{1bb}"]),
-        ("\u{1}\u{30}", &["\u{1}\u{30}"]), ("\u{1}\u{308}\u{30}", &["\u{1}\u{308}\u{30}"]),
-        ("\u{1}\u{2e}", &["\u{1}\u{2e}"]), ("\u{1}\u{308}\u{2e}", &["\u{1}\u{308}\u{2e}"]),
-        ("\u{1}\u{21}", &["\u{1}\u{21}"]), ("\u{1}\u{308}\u{21}", &["\u{1}\u{308}\u{21}"]),
-        ("\u{1}\u{22}", &["\u{1}\u{22}"]), ("\u{1}\u{308}\u{22}", &["\u{1}\u{308}\u{22}"]),
-        ("\u{1}\u{2c}", &["\u{1}\u{2c}"]), ("\u{1}\u{308}\u{2c}", &["\u{1}\u{308}\u{2c}"]),
-        ("\u{1}\u{ad}", &["\u{1}\u{ad}"]), ("\u{1}\u{308}\u{ad}", &["\u{1}\u{308}\u{ad}"]),
-        ("\u{1}\u{300}", &["\u{1}\u{300}"]), ("\u{1}\u{308}\u{300}", &["\u{1}\u{308}\u{300}"]),
-        ("\u{d}\u{1}", &["\u{d}", "\u{1}"]), ("\u{d}\u{308}\u{1}", &["\u{d}", "\u{308}\u{1}"]),
-        ("\u{d}\u{d}", &["\u{d}", "\u{d}"]), ("\u{d}\u{308}\u{d}", &["\u{d}", "\u{308}\u{d}"]),
-        ("\u{d}\u{a}", &["\u{d}\u{a}"]), ("\u{d}\u{308}\u{a}", &["\u{d}", "\u{308}\u{a}"]),
-        ("\u{d}\u{85}", &["\u{d}", "\u{85}"]), ("\u{d}\u{308}\u{85}", &["\u{d}", "\u{308}\u{85}"]),
-        ("\u{d}\u{9}", &["\u{d}", "\u{9}"]), ("\u{d}\u{308}\u{9}", &["\u{d}", "\u{308}\u{9}"]),
-        ("\u{d}\u{61}", &["\u{d}", "\u{61}"]), ("\u{d}\u{308}\u{61}", &["\u{d}", "\u{308}\u{61}"]),
-        ("\u{d}\u{41}", &["\u{d}", "\u{41}"]), ("\u{d}\u{308}\u{41}", &["\u{d}", "\u{308}\u{41}"]),
-        ("\u{d}\u{1bb}", &["\u{d}", "\u{1bb}"]), ("\u{d}\u{308}\u{1bb}", &["\u{d}",
-        "\u{308}\u{1bb}"]), ("\u{d}\u{30}", &["\u{d}", "\u{30}"]), ("\u{d}\u{308}\u{30}", &["\u{d}",
-        "\u{308}\u{30}"]), ("\u{d}\u{2e}", &["\u{d}", "\u{2e}"]), ("\u{d}\u{308}\u{2e}", &["\u{d}",
-        "\u{308}\u{2e}"]), ("\u{d}\u{21}", &["\u{d}", "\u{21}"]), ("\u{d}\u{308}\u{21}", &["\u{d}",
-        "\u{308}\u{21}"]), ("\u{d}\u{22}", &["\u{d}", "\u{22}"]), ("\u{d}\u{308}\u{22}", &["\u{d}",
-        "\u{308}\u{22}"]), ("\u{d}\u{2c}", &["\u{d}", "\u{2c}"]), ("\u{d}\u{308}\u{2c}", &["\u{d}",
-        "\u{308}\u{2c}"]), ("\u{d}\u{ad}", &["\u{d}", "\u{ad}"]), ("\u{d}\u{308}\u{ad}", &["\u{d}",
-        "\u{308}\u{ad}"]), ("\u{d}\u{300}", &["\u{d}", "\u{300}"]), ("\u{d}\u{308}\u{300}",
-        &["\u{d}", "\u{308}\u{300}"]), ("\u{a}\u{1}", &["\u{a}", "\u{1}"]), ("\u{a}\u{308}\u{1}",
-        &["\u{a}", "\u{308}\u{1}"]), ("\u{a}\u{d}", &["\u{a}", "\u{d}"]), ("\u{a}\u{308}\u{d}",
-        &["\u{a}", "\u{308}\u{d}"]), ("\u{a}\u{a}", &["\u{a}", "\u{a}"]), ("\u{a}\u{308}\u{a}",
-        &["\u{a}", "\u{308}\u{a}"]), ("\u{a}\u{85}", &["\u{a}", "\u{85}"]), ("\u{a}\u{308}\u{85}",
-        &["\u{a}", "\u{308}\u{85}"]), ("\u{a}\u{9}", &["\u{a}", "\u{9}"]), ("\u{a}\u{308}\u{9}",
-        &["\u{a}", "\u{308}\u{9}"]), ("\u{a}\u{61}", &["\u{a}", "\u{61}"]), ("\u{a}\u{308}\u{61}",
-        &["\u{a}", "\u{308}\u{61}"]), ("\u{a}\u{41}", &["\u{a}", "\u{41}"]), ("\u{a}\u{308}\u{41}",
-        &["\u{a}", "\u{308}\u{41}"]), ("\u{a}\u{1bb}", &["\u{a}", "\u{1bb}"]),
-        ("\u{a}\u{308}\u{1bb}", &["\u{a}", "\u{308}\u{1bb}"]), ("\u{a}\u{30}", &["\u{a}",
-        "\u{30}"]), ("\u{a}\u{308}\u{30}", &["\u{a}", "\u{308}\u{30}"]), ("\u{a}\u{2e}", &["\u{a}",
-        "\u{2e}"]), ("\u{a}\u{308}\u{2e}", &["\u{a}", "\u{308}\u{2e}"]), ("\u{a}\u{21}", &["\u{a}",
-        "\u{21}"]), ("\u{a}\u{308}\u{21}", &["\u{a}", "\u{308}\u{21}"]), ("\u{a}\u{22}", &["\u{a}",
-        "\u{22}"]), ("\u{a}\u{308}\u{22}", &["\u{a}", "\u{308}\u{22}"]), ("\u{a}\u{2c}", &["\u{a}",
-        "\u{2c}"]), ("\u{a}\u{308}\u{2c}", &["\u{a}", "\u{308}\u{2c}"]), ("\u{a}\u{ad}", &["\u{a}",
-        "\u{ad}"]), ("\u{a}\u{308}\u{ad}", &["\u{a}", "\u{308}\u{ad}"]), ("\u{a}\u{300}", &["\u{a}",
-        "\u{300}"]), ("\u{a}\u{308}\u{300}", &["\u{a}", "\u{308}\u{300}"]), ("\u{85}\u{1}",
-        &["\u{85}", "\u{1}"]), ("\u{85}\u{308}\u{1}", &["\u{85}", "\u{308}\u{1}"]), ("\u{85}\u{d}",
-        &["\u{85}", "\u{d}"]), ("\u{85}\u{308}\u{d}", &["\u{85}", "\u{308}\u{d}"]), ("\u{85}\u{a}",
-        &["\u{85}", "\u{a}"]), ("\u{85}\u{308}\u{a}", &["\u{85}", "\u{308}\u{a}"]), ("\u{85}\u{85}",
-        &["\u{85}", "\u{85}"]), ("\u{85}\u{308}\u{85}", &["\u{85}", "\u{308}\u{85}"]),
-        ("\u{85}\u{9}", &["\u{85}", "\u{9}"]), ("\u{85}\u{308}\u{9}", &["\u{85}", "\u{308}\u{9}"]),
-        ("\u{85}\u{61}", &["\u{85}", "\u{61}"]), ("\u{85}\u{308}\u{61}", &["\u{85}",
-        "\u{308}\u{61}"]), ("\u{85}\u{41}", &["\u{85}", "\u{41}"]), ("\u{85}\u{308}\u{41}",
-        &["\u{85}", "\u{308}\u{41}"]), ("\u{85}\u{1bb}", &["\u{85}", "\u{1bb}"]),
-        ("\u{85}\u{308}\u{1bb}", &["\u{85}", "\u{308}\u{1bb}"]), ("\u{85}\u{30}", &["\u{85}",
-        "\u{30}"]), ("\u{85}\u{308}\u{30}", &["\u{85}", "\u{308}\u{30}"]), ("\u{85}\u{2e}",
-        &["\u{85}", "\u{2e}"]), ("\u{85}\u{308}\u{2e}", &["\u{85}", "\u{308}\u{2e}"]),
-        ("\u{85}\u{21}", &["\u{85}", "\u{21}"]), ("\u{85}\u{308}\u{21}", &["\u{85}",
-        "\u{308}\u{21}"]), ("\u{85}\u{22}", &["\u{85}", "\u{22}"]), ("\u{85}\u{308}\u{22}",
-        &["\u{85}", "\u{308}\u{22}"]), ("\u{85}\u{2c}", &["\u{85}", "\u{2c}"]),
-        ("\u{85}\u{308}\u{2c}", &["\u{85}", "\u{308}\u{2c}"]), ("\u{85}\u{ad}", &["\u{85}",
-        "\u{ad}"]), ("\u{85}\u{308}\u{ad}", &["\u{85}", "\u{308}\u{ad}"]), ("\u{85}\u{300}",
-        &["\u{85}", "\u{300}"]), ("\u{85}\u{308}\u{300}", &["\u{85}", "\u{308}\u{300}"]),
-        ("\u{9}\u{1}", &["\u{9}\u{1}"]), ("\u{9}\u{308}\u{1}", &["\u{9}\u{308}\u{1}"]),
-        ("\u{9}\u{d}", &["\u{9}\u{d}"]), ("\u{9}\u{308}\u{d}", &["\u{9}\u{308}\u{d}"]),
-        ("\u{9}\u{a}", &["\u{9}\u{a}"]), ("\u{9}\u{308}\u{a}", &["\u{9}\u{308}\u{a}"]),
-        ("\u{9}\u{85}", &["\u{9}\u{85}"]), ("\u{9}\u{308}\u{85}", &["\u{9}\u{308}\u{85}"]),
-        ("\u{9}\u{9}", &["\u{9}\u{9}"]), ("\u{9}\u{308}\u{9}", &["\u{9}\u{308}\u{9}"]),
-        ("\u{9}\u{61}", &["\u{9}\u{61}"]), ("\u{9}\u{308}\u{61}", &["\u{9}\u{308}\u{61}"]),
-        ("\u{9}\u{41}", &["\u{9}\u{41}"]), ("\u{9}\u{308}\u{41}", &["\u{9}\u{308}\u{41}"]),
-        ("\u{9}\u{1bb}", &["\u{9}\u{1bb}"]), ("\u{9}\u{308}\u{1bb}", &["\u{9}\u{308}\u{1bb}"]),
-        ("\u{9}\u{30}", &["\u{9}\u{30}"]), ("\u{9}\u{308}\u{30}", &["\u{9}\u{308}\u{30}"]),
-        ("\u{9}\u{2e}", &["\u{9}\u{2e}"]), ("\u{9}\u{308}\u{2e}", &["\u{9}\u{308}\u{2e}"]),
-        ("\u{9}\u{21}", &["\u{9}\u{21}"]), ("\u{9}\u{308}\u{21}", &["\u{9}\u{308}\u{21}"]),
-        ("\u{9}\u{22}", &["\u{9}\u{22}"]), ("\u{9}\u{308}\u{22}", &["\u{9}\u{308}\u{22}"]),
-        ("\u{9}\u{2c}", &["\u{9}\u{2c}"]), ("\u{9}\u{308}\u{2c}", &["\u{9}\u{308}\u{2c}"]),
-        ("\u{9}\u{ad}", &["\u{9}\u{ad}"]), ("\u{9}\u{308}\u{ad}", &["\u{9}\u{308}\u{ad}"]),
-        ("\u{9}\u{300}", &["\u{9}\u{300}"]), ("\u{9}\u{308}\u{300}", &["\u{9}\u{308}\u{300}"]),
-        ("\u{61}\u{1}", &["\u{61}\u{1}"]), ("\u{61}\u{308}\u{1}", &["\u{61}\u{308}\u{1}"]),
-        ("\u{61}\u{d}", &["\u{61}\u{d}"]), ("\u{61}\u{308}\u{d}", &["\u{61}\u{308}\u{d}"]),
-        ("\u{61}\u{a}", &["\u{61}\u{a}"]), ("\u{61}\u{308}\u{a}", &["\u{61}\u{308}\u{a}"]),
-        ("\u{61}\u{85}", &["\u{61}\u{85}"]), ("\u{61}\u{308}\u{85}", &["\u{61}\u{308}\u{85}"]),
-        ("\u{61}\u{9}", &["\u{61}\u{9}"]), ("\u{61}\u{308}\u{9}", &["\u{61}\u{308}\u{9}"]),
-        ("\u{61}\u{61}", &["\u{61}\u{61}"]), ("\u{61}\u{308}\u{61}", &["\u{61}\u{308}\u{61}"]),
-        ("\u{61}\u{41}", &["\u{61}\u{41}"]), ("\u{61}\u{308}\u{41}", &["\u{61}\u{308}\u{41}"]),
-        ("\u{61}\u{1bb}", &["\u{61}\u{1bb}"]), ("\u{61}\u{308}\u{1bb}", &["\u{61}\u{308}\u{1bb}"]),
-        ("\u{61}\u{30}", &["\u{61}\u{30}"]), ("\u{61}\u{308}\u{30}", &["\u{61}\u{308}\u{30}"]),
-        ("\u{61}\u{2e}", &["\u{61}\u{2e}"]), ("\u{61}\u{308}\u{2e}", &["\u{61}\u{308}\u{2e}"]),
-        ("\u{61}\u{21}", &["\u{61}\u{21}"]), ("\u{61}\u{308}\u{21}", &["\u{61}\u{308}\u{21}"]),
-        ("\u{61}\u{22}", &["\u{61}\u{22}"]), ("\u{61}\u{308}\u{22}", &["\u{61}\u{308}\u{22}"]),
-        ("\u{61}\u{2c}", &["\u{61}\u{2c}"]), ("\u{61}\u{308}\u{2c}", &["\u{61}\u{308}\u{2c}"]),
-        ("\u{61}\u{ad}", &["\u{61}\u{ad}"]), ("\u{61}\u{308}\u{ad}", &["\u{61}\u{308}\u{ad}"]),
-        ("\u{61}\u{300}", &["\u{61}\u{300}"]), ("\u{61}\u{308}\u{300}", &["\u{61}\u{308}\u{300}"]),
-        ("\u{41}\u{1}", &["\u{41}\u{1}"]), ("\u{41}\u{308}\u{1}", &["\u{41}\u{308}\u{1}"]),
-        ("\u{41}\u{d}", &["\u{41}\u{d}"]), ("\u{41}\u{308}\u{d}", &["\u{41}\u{308}\u{d}"]),
-        ("\u{41}\u{a}", &["\u{41}\u{a}"]), ("\u{41}\u{308}\u{a}", &["\u{41}\u{308}\u{a}"]),
-        ("\u{41}\u{85}", &["\u{41}\u{85}"]), ("\u{41}\u{308}\u{85}", &["\u{41}\u{308}\u{85}"]),
-        ("\u{41}\u{9}", &["\u{41}\u{9}"]), ("\u{41}\u{308}\u{9}", &["\u{41}\u{308}\u{9}"]),
-        ("\u{41}\u{61}", &["\u{41}\u{61}"]), ("\u{41}\u{308}\u{61}", &["\u{41}\u{308}\u{61}"]),
-        ("\u{41}\u{41}", &["\u{41}\u{41}"]), ("\u{41}\u{308}\u{41}", &["\u{41}\u{308}\u{41}"]),
-        ("\u{41}\u{1bb}", &["\u{41}\u{1bb}"]), ("\u{41}\u{308}\u{1bb}", &["\u{41}\u{308}\u{1bb}"]),
-        ("\u{41}\u{30}", &["\u{41}\u{30}"]), ("\u{41}\u{308}\u{30}", &["\u{41}\u{308}\u{30}"]),
-        ("\u{41}\u{2e}", &["\u{41}\u{2e}"]), ("\u{41}\u{308}\u{2e}", &["\u{41}\u{308}\u{2e}"]),
-        ("\u{41}\u{21}", &["\u{41}\u{21}"]), ("\u{41}\u{308}\u{21}", &["\u{41}\u{308}\u{21}"]),
-        ("\u{41}\u{22}", &["\u{41}\u{22}"]), ("\u{41}\u{308}\u{22}", &["\u{41}\u{308}\u{22}"]),
-        ("\u{41}\u{2c}", &["\u{41}\u{2c}"]), ("\u{41}\u{308}\u{2c}", &["\u{41}\u{308}\u{2c}"]),
-        ("\u{41}\u{ad}", &["\u{41}\u{ad}"]), ("\u{41}\u{308}\u{ad}", &["\u{41}\u{308}\u{ad}"]),
-        ("\u{41}\u{300}", &["\u{41}\u{300}"]), ("\u{41}\u{308}\u{300}", &["\u{41}\u{308}\u{300}"]),
-        ("\u{1bb}\u{1}", &["\u{1bb}\u{1}"]), ("\u{1bb}\u{308}\u{1}", &["\u{1bb}\u{308}\u{1}"]),
-        ("\u{1bb}\u{d}", &["\u{1bb}\u{d}"]), ("\u{1bb}\u{308}\u{d}", &["\u{1bb}\u{308}\u{d}"]),
-        ("\u{1bb}\u{a}", &["\u{1bb}\u{a}"]), ("\u{1bb}\u{308}\u{a}", &["\u{1bb}\u{308}\u{a}"]),
-        ("\u{1bb}\u{85}", &["\u{1bb}\u{85}"]), ("\u{1bb}\u{308}\u{85}", &["\u{1bb}\u{308}\u{85}"]),
-        ("\u{1bb}\u{9}", &["\u{1bb}\u{9}"]), ("\u{1bb}\u{308}\u{9}", &["\u{1bb}\u{308}\u{9}"]),
-        ("\u{1bb}\u{61}", &["\u{1bb}\u{61}"]), ("\u{1bb}\u{308}\u{61}", &["\u{1bb}\u{308}\u{61}"]),
-        ("\u{1bb}\u{41}", &["\u{1bb}\u{41}"]), ("\u{1bb}\u{308}\u{41}", &["\u{1bb}\u{308}\u{41}"]),
-        ("\u{1bb}\u{1bb}", &["\u{1bb}\u{1bb}"]), ("\u{1bb}\u{308}\u{1bb}",
-        &["\u{1bb}\u{308}\u{1bb}"]), ("\u{1bb}\u{30}", &["\u{1bb}\u{30}"]), ("\u{1bb}\u{308}\u{30}",
-        &["\u{1bb}\u{308}\u{30}"]), ("\u{1bb}\u{2e}", &["\u{1bb}\u{2e}"]), ("\u{1bb}\u{308}\u{2e}",
-        &["\u{1bb}\u{308}\u{2e}"]), ("\u{1bb}\u{21}", &["\u{1bb}\u{21}"]), ("\u{1bb}\u{308}\u{21}",
-        &["\u{1bb}\u{308}\u{21}"]), ("\u{1bb}\u{22}", &["\u{1bb}\u{22}"]), ("\u{1bb}\u{308}\u{22}",
-        &["\u{1bb}\u{308}\u{22}"]), ("\u{1bb}\u{2c}", &["\u{1bb}\u{2c}"]), ("\u{1bb}\u{308}\u{2c}",
-        &["\u{1bb}\u{308}\u{2c}"]), ("\u{1bb}\u{ad}", &["\u{1bb}\u{ad}"]), ("\u{1bb}\u{308}\u{ad}",
-        &["\u{1bb}\u{308}\u{ad}"]), ("\u{1bb}\u{300}", &["\u{1bb}\u{300}"]),
-        ("\u{1bb}\u{308}\u{300}", &["\u{1bb}\u{308}\u{300}"]), ("\u{30}\u{1}", &["\u{30}\u{1}"]),
-        ("\u{30}\u{308}\u{1}", &["\u{30}\u{308}\u{1}"]), ("\u{30}\u{d}", &["\u{30}\u{d}"]),
-        ("\u{30}\u{308}\u{d}", &["\u{30}\u{308}\u{d}"]), ("\u{30}\u{a}", &["\u{30}\u{a}"]),
-        ("\u{30}\u{308}\u{a}", &["\u{30}\u{308}\u{a}"]), ("\u{30}\u{85}", &["\u{30}\u{85}"]),
-        ("\u{30}\u{308}\u{85}", &["\u{30}\u{308}\u{85}"]), ("\u{30}\u{9}", &["\u{30}\u{9}"]),
-        ("\u{30}\u{308}\u{9}", &["\u{30}\u{308}\u{9}"]), ("\u{30}\u{61}", &["\u{30}\u{61}"]),
-        ("\u{30}\u{308}\u{61}", &["\u{30}\u{308}\u{61}"]), ("\u{30}\u{41}", &["\u{30}\u{41}"]),
-        ("\u{30}\u{308}\u{41}", &["\u{30}\u{308}\u{41}"]), ("\u{30}\u{1bb}", &["\u{30}\u{1bb}"]),
-        ("\u{30}\u{308}\u{1bb}", &["\u{30}\u{308}\u{1bb}"]), ("\u{30}\u{30}", &["\u{30}\u{30}"]),
-        ("\u{30}\u{308}\u{30}", &["\u{30}\u{308}\u{30}"]), ("\u{30}\u{2e}", &["\u{30}\u{2e}"]),
-        ("\u{30}\u{308}\u{2e}", &["\u{30}\u{308}\u{2e}"]), ("\u{30}\u{21}", &["\u{30}\u{21}"]),
-        ("\u{30}\u{308}\u{21}", &["\u{30}\u{308}\u{21}"]), ("\u{30}\u{22}", &["\u{30}\u{22}"]),
-        ("\u{30}\u{308}\u{22}", &["\u{30}\u{308}\u{22}"]), ("\u{30}\u{2c}", &["\u{30}\u{2c}"]),
-        ("\u{30}\u{308}\u{2c}", &["\u{30}\u{308}\u{2c}"]), ("\u{30}\u{ad}", &["\u{30}\u{ad}"]),
-        ("\u{30}\u{308}\u{ad}", &["\u{30}\u{308}\u{ad}"]), ("\u{30}\u{300}", &["\u{30}\u{300}"]),
-        ("\u{30}\u{308}\u{300}", &["\u{30}\u{308}\u{300}"]), ("\u{2e}\u{1}", &["\u{2e}", "\u{1}"]),
-        ("\u{2e}\u{308}\u{1}", &["\u{2e}\u{308}", "\u{1}"]), ("\u{2e}\u{d}", &["\u{2e}\u{d}"]),
-        ("\u{2e}\u{308}\u{d}", &["\u{2e}\u{308}\u{d}"]), ("\u{2e}\u{a}", &["\u{2e}\u{a}"]),
-        ("\u{2e}\u{308}\u{a}", &["\u{2e}\u{308}\u{a}"]), ("\u{2e}\u{85}", &["\u{2e}\u{85}"]),
-        ("\u{2e}\u{308}\u{85}", &["\u{2e}\u{308}\u{85}"]), ("\u{2e}\u{9}", &["\u{2e}\u{9}"]),
-        ("\u{2e}\u{308}\u{9}", &["\u{2e}\u{308}\u{9}"]), ("\u{2e}\u{61}", &["\u{2e}\u{61}"]),
-        ("\u{2e}\u{308}\u{61}", &["\u{2e}\u{308}\u{61}"]), ("\u{2e}\u{41}", &["\u{2e}", "\u{41}"]),
-        ("\u{2e}\u{308}\u{41}", &["\u{2e}\u{308}", "\u{41}"]), ("\u{2e}\u{1bb}", &["\u{2e}",
-        "\u{1bb}"]), ("\u{2e}\u{308}\u{1bb}", &["\u{2e}\u{308}", "\u{1bb}"]), ("\u{2e}\u{30}",
-        &["\u{2e}\u{30}"]), ("\u{2e}\u{308}\u{30}", &["\u{2e}\u{308}\u{30}"]), ("\u{2e}\u{2e}",
-        &["\u{2e}\u{2e}"]), ("\u{2e}\u{308}\u{2e}", &["\u{2e}\u{308}\u{2e}"]), ("\u{2e}\u{21}",
-        &["\u{2e}\u{21}"]), ("\u{2e}\u{308}\u{21}", &["\u{2e}\u{308}\u{21}"]), ("\u{2e}\u{22}",
-        &["\u{2e}\u{22}"]), ("\u{2e}\u{308}\u{22}", &["\u{2e}\u{308}\u{22}"]), ("\u{2e}\u{2c}",
-        &["\u{2e}\u{2c}"]), ("\u{2e}\u{308}\u{2c}", &["\u{2e}\u{308}\u{2c}"]), ("\u{2e}\u{ad}",
-        &["\u{2e}\u{ad}"]), ("\u{2e}\u{308}\u{ad}", &["\u{2e}\u{308}\u{ad}"]), ("\u{2e}\u{300}",
-        &["\u{2e}\u{300}"]), ("\u{2e}\u{308}\u{300}", &["\u{2e}\u{308}\u{300}"]), ("\u{21}\u{1}",
-        &["\u{21}", "\u{1}"]), ("\u{21}\u{308}\u{1}", &["\u{21}\u{308}", "\u{1}"]), ("\u{21}\u{d}",
-        &["\u{21}\u{d}"]), ("\u{21}\u{308}\u{d}", &["\u{21}\u{308}\u{d}"]), ("\u{21}\u{a}",
-        &["\u{21}\u{a}"]), ("\u{21}\u{308}\u{a}", &["\u{21}\u{308}\u{a}"]), ("\u{21}\u{85}",
-        &["\u{21}\u{85}"]), ("\u{21}\u{308}\u{85}", &["\u{21}\u{308}\u{85}"]), ("\u{21}\u{9}",
-        &["\u{21}\u{9}"]), ("\u{21}\u{308}\u{9}", &["\u{21}\u{308}\u{9}"]), ("\u{21}\u{61}",
-        &["\u{21}", "\u{61}"]), ("\u{21}\u{308}\u{61}", &["\u{21}\u{308}", "\u{61}"]),
-        ("\u{21}\u{41}", &["\u{21}", "\u{41}"]), ("\u{21}\u{308}\u{41}", &["\u{21}\u{308}",
-        "\u{41}"]), ("\u{21}\u{1bb}", &["\u{21}", "\u{1bb}"]), ("\u{21}\u{308}\u{1bb}",
-        &["\u{21}\u{308}", "\u{1bb}"]), ("\u{21}\u{30}", &["\u{21}", "\u{30}"]),
-        ("\u{21}\u{308}\u{30}", &["\u{21}\u{308}", "\u{30}"]), ("\u{21}\u{2e}", &["\u{21}\u{2e}"]),
-        ("\u{21}\u{308}\u{2e}", &["\u{21}\u{308}\u{2e}"]), ("\u{21}\u{21}", &["\u{21}\u{21}"]),
-        ("\u{21}\u{308}\u{21}", &["\u{21}\u{308}\u{21}"]), ("\u{21}\u{22}", &["\u{21}\u{22}"]),
-        ("\u{21}\u{308}\u{22}", &["\u{21}\u{308}\u{22}"]), ("\u{21}\u{2c}", &["\u{21}\u{2c}"]),
-        ("\u{21}\u{308}\u{2c}", &["\u{21}\u{308}\u{2c}"]), ("\u{21}\u{ad}", &["\u{21}\u{ad}"]),
-        ("\u{21}\u{308}\u{ad}", &["\u{21}\u{308}\u{ad}"]), ("\u{21}\u{300}", &["\u{21}\u{300}"]),
-        ("\u{21}\u{308}\u{300}", &["\u{21}\u{308}\u{300}"]), ("\u{22}\u{1}", &["\u{22}\u{1}"]),
-        ("\u{22}\u{308}\u{1}", &["\u{22}\u{308}\u{1}"]), ("\u{22}\u{d}", &["\u{22}\u{d}"]),
-        ("\u{22}\u{308}\u{d}", &["\u{22}\u{308}\u{d}"]), ("\u{22}\u{a}", &["\u{22}\u{a}"]),
-        ("\u{22}\u{308}\u{a}", &["\u{22}\u{308}\u{a}"]), ("\u{22}\u{85}", &["\u{22}\u{85}"]),
-        ("\u{22}\u{308}\u{85}", &["\u{22}\u{308}\u{85}"]), ("\u{22}\u{9}", &["\u{22}\u{9}"]),
-        ("\u{22}\u{308}\u{9}", &["\u{22}\u{308}\u{9}"]), ("\u{22}\u{61}", &["\u{22}\u{61}"]),
-        ("\u{22}\u{308}\u{61}", &["\u{22}\u{308}\u{61}"]), ("\u{22}\u{41}", &["\u{22}\u{41}"]),
-        ("\u{22}\u{308}\u{41}", &["\u{22}\u{308}\u{41}"]), ("\u{22}\u{1bb}", &["\u{22}\u{1bb}"]),
-        ("\u{22}\u{308}\u{1bb}", &["\u{22}\u{308}\u{1bb}"]), ("\u{22}\u{30}", &["\u{22}\u{30}"]),
-        ("\u{22}\u{308}\u{30}", &["\u{22}\u{308}\u{30}"]), ("\u{22}\u{2e}", &["\u{22}\u{2e}"]),
-        ("\u{22}\u{308}\u{2e}", &["\u{22}\u{308}\u{2e}"]), ("\u{22}\u{21}", &["\u{22}\u{21}"]),
-        ("\u{22}\u{308}\u{21}", &["\u{22}\u{308}\u{21}"]), ("\u{22}\u{22}", &["\u{22}\u{22}"]),
-        ("\u{22}\u{308}\u{22}", &["\u{22}\u{308}\u{22}"]), ("\u{22}\u{2c}", &["\u{22}\u{2c}"]),
-        ("\u{22}\u{308}\u{2c}", &["\u{22}\u{308}\u{2c}"]), ("\u{22}\u{ad}", &["\u{22}\u{ad}"]),
-        ("\u{22}\u{308}\u{ad}", &["\u{22}\u{308}\u{ad}"]), ("\u{22}\u{300}", &["\u{22}\u{300}"]),
-        ("\u{22}\u{308}\u{300}", &["\u{22}\u{308}\u{300}"]), ("\u{2c}\u{1}", &["\u{2c}\u{1}"]),
-        ("\u{2c}\u{308}\u{1}", &["\u{2c}\u{308}\u{1}"]), ("\u{2c}\u{d}", &["\u{2c}\u{d}"]),
-        ("\u{2c}\u{308}\u{d}", &["\u{2c}\u{308}\u{d}"]), ("\u{2c}\u{a}", &["\u{2c}\u{a}"]),
-        ("\u{2c}\u{308}\u{a}", &["\u{2c}\u{308}\u{a}"]), ("\u{2c}\u{85}", &["\u{2c}\u{85}"]),
-        ("\u{2c}\u{308}\u{85}", &["\u{2c}\u{308}\u{85}"]), ("\u{2c}\u{9}", &["\u{2c}\u{9}"]),
-        ("\u{2c}\u{308}\u{9}", &["\u{2c}\u{308}\u{9}"]), ("\u{2c}\u{61}", &["\u{2c}\u{61}"]),
-        ("\u{2c}\u{308}\u{61}", &["\u{2c}\u{308}\u{61}"]), ("\u{2c}\u{41}", &["\u{2c}\u{41}"]),
-        ("\u{2c}\u{308}\u{41}", &["\u{2c}\u{308}\u{41}"]), ("\u{2c}\u{1bb}", &["\u{2c}\u{1bb}"]),
-        ("\u{2c}\u{308}\u{1bb}", &["\u{2c}\u{308}\u{1bb}"]), ("\u{2c}\u{30}", &["\u{2c}\u{30}"]),
-        ("\u{2c}\u{308}\u{30}", &["\u{2c}\u{308}\u{30}"]), ("\u{2c}\u{2e}", &["\u{2c}\u{2e}"]),
-        ("\u{2c}\u{308}\u{2e}", &["\u{2c}\u{308}\u{2e}"]), ("\u{2c}\u{21}", &["\u{2c}\u{21}"]),
-        ("\u{2c}\u{308}\u{21}", &["\u{2c}\u{308}\u{21}"]), ("\u{2c}\u{22}", &["\u{2c}\u{22}"]),
-        ("\u{2c}\u{308}\u{22}", &["\u{2c}\u{308}\u{22}"]), ("\u{2c}\u{2c}", &["\u{2c}\u{2c}"]),
-        ("\u{2c}\u{308}\u{2c}", &["\u{2c}\u{308}\u{2c}"]), ("\u{2c}\u{ad}", &["\u{2c}\u{ad}"]),
-        ("\u{2c}\u{308}\u{ad}", &["\u{2c}\u{308}\u{ad}"]), ("\u{2c}\u{300}", &["\u{2c}\u{300}"]),
-        ("\u{2c}\u{308}\u{300}", &["\u{2c}\u{308}\u{300}"]), ("\u{ad}\u{1}", &["\u{ad}\u{1}"]),
-        ("\u{ad}\u{308}\u{1}", &["\u{ad}\u{308}\u{1}"]), ("\u{ad}\u{d}", &["\u{ad}\u{d}"]),
-        ("\u{ad}\u{308}\u{d}", &["\u{ad}\u{308}\u{d}"]), ("\u{ad}\u{a}", &["\u{ad}\u{a}"]),
-        ("\u{ad}\u{308}\u{a}", &["\u{ad}\u{308}\u{a}"]), ("\u{ad}\u{85}", &["\u{ad}\u{85}"]),
-        ("\u{ad}\u{308}\u{85}", &["\u{ad}\u{308}\u{85}"]), ("\u{ad}\u{9}", &["\u{ad}\u{9}"]),
-        ("\u{ad}\u{308}\u{9}", &["\u{ad}\u{308}\u{9}"]), ("\u{ad}\u{61}", &["\u{ad}\u{61}"]),
-        ("\u{ad}\u{308}\u{61}", &["\u{ad}\u{308}\u{61}"]), ("\u{ad}\u{41}", &["\u{ad}\u{41}"]),
-        ("\u{ad}\u{308}\u{41}", &["\u{ad}\u{308}\u{41}"]), ("\u{ad}\u{1bb}", &["\u{ad}\u{1bb}"]),
-        ("\u{ad}\u{308}\u{1bb}", &["\u{ad}\u{308}\u{1bb}"]), ("\u{ad}\u{30}", &["\u{ad}\u{30}"]),
-        ("\u{ad}\u{308}\u{30}", &["\u{ad}\u{308}\u{30}"]), ("\u{ad}\u{2e}", &["\u{ad}\u{2e}"]),
-        ("\u{ad}\u{308}\u{2e}", &["\u{ad}\u{308}\u{2e}"]), ("\u{ad}\u{21}", &["\u{ad}\u{21}"]),
-        ("\u{ad}\u{308}\u{21}", &["\u{ad}\u{308}\u{21}"]), ("\u{ad}\u{22}", &["\u{ad}\u{22}"]),
-        ("\u{ad}\u{308}\u{22}", &["\u{ad}\u{308}\u{22}"]), ("\u{ad}\u{2c}", &["\u{ad}\u{2c}"]),
-        ("\u{ad}\u{308}\u{2c}", &["\u{ad}\u{308}\u{2c}"]), ("\u{ad}\u{ad}", &["\u{ad}\u{ad}"]),
-        ("\u{ad}\u{308}\u{ad}", &["\u{ad}\u{308}\u{ad}"]), ("\u{ad}\u{300}", &["\u{ad}\u{300}"]),
-        ("\u{ad}\u{308}\u{300}", &["\u{ad}\u{308}\u{300}"]), ("\u{300}\u{1}", &["\u{300}\u{1}"]),
-        ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}\u{1}"]), ("\u{300}\u{d}", &["\u{300}\u{d}"]),
-        ("\u{300}\u{308}\u{d}", &["\u{300}\u{308}\u{d}"]), ("\u{300}\u{a}", &["\u{300}\u{a}"]),
-        ("\u{300}\u{308}\u{a}", &["\u{300}\u{308}\u{a}"]), ("\u{300}\u{85}", &["\u{300}\u{85}"]),
-        ("\u{300}\u{308}\u{85}", &["\u{300}\u{308}\u{85}"]), ("\u{300}\u{9}", &["\u{300}\u{9}"]),
-        ("\u{300}\u{308}\u{9}", &["\u{300}\u{308}\u{9}"]), ("\u{300}\u{61}", &["\u{300}\u{61}"]),
-        ("\u{300}\u{308}\u{61}", &["\u{300}\u{308}\u{61}"]), ("\u{300}\u{41}", &["\u{300}\u{41}"]),
-        ("\u{300}\u{308}\u{41}", &["\u{300}\u{308}\u{41}"]), ("\u{300}\u{1bb}",
-        &["\u{300}\u{1bb}"]), ("\u{300}\u{308}\u{1bb}", &["\u{300}\u{308}\u{1bb}"]),
-        ("\u{300}\u{30}", &["\u{300}\u{30}"]), ("\u{300}\u{308}\u{30}", &["\u{300}\u{308}\u{30}"]),
-        ("\u{300}\u{2e}", &["\u{300}\u{2e}"]), ("\u{300}\u{308}\u{2e}", &["\u{300}\u{308}\u{2e}"]),
-        ("\u{300}\u{21}", &["\u{300}\u{21}"]), ("\u{300}\u{308}\u{21}", &["\u{300}\u{308}\u{21}"]),
-        ("\u{300}\u{22}", &["\u{300}\u{22}"]), ("\u{300}\u{308}\u{22}", &["\u{300}\u{308}\u{22}"]),
-        ("\u{300}\u{2c}", &["\u{300}\u{2c}"]), ("\u{300}\u{308}\u{2c}", &["\u{300}\u{308}\u{2c}"]),
-        ("\u{300}\u{ad}", &["\u{300}\u{ad}"]), ("\u{300}\u{308}\u{ad}", &["\u{300}\u{308}\u{ad}"]),
-        ("\u{300}\u{300}", &["\u{300}\u{300}"]), ("\u{300}\u{308}\u{300}",
-        &["\u{300}\u{308}\u{300}"]), ("\u{d}\u{a}\u{61}\u{a}\u{308}", &["\u{d}\u{a}", "\u{61}\u{a}",
-        "\u{308}"]), ("\u{61}\u{308}", &["\u{61}\u{308}"]), ("\u{20}\u{200d}\u{646}",
-        &["\u{20}\u{200d}\u{646}"]), ("\u{646}\u{200d}\u{20}", &["\u{646}\u{200d}\u{20}"]),
-        ("\u{28}\u{22}\u{47}\u{6f}\u{2e}\u{22}\u{29}\u{20}\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}",
-        &["\u{28}\u{22}\u{47}\u{6f}\u{2e}\u{22}\u{29}\u{20}",
-        "\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}"]),
-        ("\u{28}\u{201c}\u{47}\u{6f}\u{3f}\u{201d}\u{29}\u{20}\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}",
-        &["\u{28}\u{201c}\u{47}\u{6f}\u{3f}\u{201d}\u{29}\u{20}",
-        "\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}"]),
-        ("\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}\u{20}\u{69}\u{73}",
-        &["\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}\u{20}\u{69}\u{73}"]),
-        ("\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{3f}\u{20}\u{48}\u{65}",
-        &["\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{3f}\u{20}", "\u{48}\u{65}"]),
-        ("\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}",
-        &["\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}"]), ("\u{33}\u{2e}\u{34}",
-        &["\u{33}\u{2e}\u{34}"]), ("\u{63}\u{2e}\u{64}", &["\u{63}\u{2e}\u{64}"]),
-        ("\u{43}\u{2e}\u{64}", &["\u{43}\u{2e}\u{64}"]), ("\u{63}\u{2e}\u{44}",
-        &["\u{63}\u{2e}\u{44}"]), ("\u{43}\u{2e}\u{44}", &["\u{43}\u{2e}\u{44}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{74}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{74}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{54}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}", "\u{54}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{2018}\u{28}\u{74}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{2018}\u{28}\u{74}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{2018}\u{28}\u{54}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}", "\u{2018}\u{28}\u{54}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}\u{74}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}\u{74}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}\u{54}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}", "\u{54}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{308}\u{54}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{308}", "\u{54}\u{68}\u{65}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{a}\u{308}\u{54}\u{68}\u{65}",
-        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{a}", "\u{308}\u{54}\u{68}\u{65}"]),
-        ("\u{74}\u{68}\u{65}\u{20}\u{72}\u{65}\u{73}\u{70}\u{2e}\u{20}\u{6c}\u{65}\u{61}\u{64}\u{65}\u{72}\u{73}\u{20}\u{61}\u{72}\u{65}",
-        &["\u{74}\u{68}\u{65}\u{20}\u{72}\u{65}\u{73}\u{70}\u{2e}\u{20}\u{6c}\u{65}\u{61}\u{64}\u{65}\u{72}\u{73}\u{20}\u{61}\u{72}\u{65}"]),
-        ("\u{5b57}\u{2e}\u{5b57}", &["\u{5b57}\u{2e}", "\u{5b57}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{5b83}", &["\u{65}\u{74}\u{63}\u{2e}", "\u{5b83}"]),
-        ("\u{65}\u{74}\u{63}\u{2e}\u{3002}", &["\u{65}\u{74}\u{63}\u{2e}\u{3002}"]),
-        ("\u{5b57}\u{3002}\u{5b83}", &["\u{5b57}\u{3002}", "\u{5b83}"]), ("\u{21}\u{20}\u{20}",
-        &["\u{21}\u{20}\u{20}"]),
-        ("\u{2060}\u{28}\u{2060}\u{22}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{2e}\u{2060}\u{22}\u{2060}\u{29}\u{2060}\u{20}\u{2060}\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}",
-        &["\u{2060}\u{28}\u{2060}\u{22}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{2e}\u{2060}\u{22}\u{2060}\u{29}\u{2060}\u{20}\u{2060}",
-        "\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{28}\u{2060}\u{201c}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{3f}\u{2060}\u{201d}\u{2060}\u{29}\u{2060}\u{20}\u{2060}\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}",
-        &["\u{2060}\u{28}\u{2060}\u{201c}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{3f}\u{2060}\u{201d}\u{2060}\u{29}\u{2060}\u{20}\u{2060}",
-        "\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{20}\u{2060}\u{69}\u{2060}\u{73}\u{2060}\u{2060}",
-        &["\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{20}\u{2060}\u{69}\u{2060}\u{73}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{3f}\u{2060}\u{20}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{3f}\u{2060}\u{20}\u{2060}",
-        "\u{48}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{2060}",
-        &["\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{33}\u{2060}\u{2e}\u{2060}\u{34}\u{2060}\u{2060}",
-        &["\u{2060}\u{33}\u{2060}\u{2e}\u{2060}\u{34}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}",
-        &["\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}",
-        &["\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}",
-        &["\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}",
-        &["\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}",
-        "\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{2018}\u{2060}\u{28}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{2018}\u{2060}\u{28}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{2018}\u{2060}\u{28}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}",
-        "\u{2018}\u{2060}\u{28}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}",
-        "\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{308}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{308}",
-        "\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{a}\u{2060}\u{308}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{a}",
-        "\u{2060}\u{308}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{73}\u{2060}\u{70}\u{2060}\u{2e}\u{2060}\u{20}\u{2060}\u{6c}\u{2060}\u{65}\u{2060}\u{61}\u{2060}\u{64}\u{2060}\u{65}\u{2060}\u{72}\u{2060}\u{73}\u{2060}\u{20}\u{2060}\u{61}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{2060}",
-        &["\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{73}\u{2060}\u{70}\u{2060}\u{2e}\u{2060}\u{20}\u{2060}\u{6c}\u{2060}\u{65}\u{2060}\u{61}\u{2060}\u{64}\u{2060}\u{65}\u{2060}\u{72}\u{2060}\u{73}\u{2060}\u{20}\u{2060}\u{61}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{5b57}\u{2060}\u{2e}\u{2060}\u{5b57}\u{2060}\u{2060}",
-        &["\u{2060}\u{5b57}\u{2060}\u{2e}\u{2060}", "\u{5b57}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{5b83}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}",
-        "\u{5b83}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{3002}\u{2060}\u{2060}",
-        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{3002}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{5b57}\u{2060}\u{3002}\u{2060}\u{5b83}\u{2060}\u{2060}",
-        &["\u{2060}\u{5b57}\u{2060}\u{3002}\u{2060}", "\u{5b83}\u{2060}\u{2060}"]),
-        ("\u{2060}\u{21}\u{2060}\u{20}\u{2060}\u{20}\u{2060}\u{2060}",
-        &["\u{2060}\u{21}\u{2060}\u{20}\u{2060}\u{20}\u{2060}\u{2060}"])
-    ];
diff --git a/crates/unicode-segmentation/src/word.rs b/crates/unicode-segmentation/src/word.rs
index 16dfafd..b2a85ae 100644
--- a/crates/unicode-segmentation/src/word.rs
+++ b/crates/unicode-segmentation/src/word.rs
@@ -25,6 +25,7 @@
 ///
 /// [`unicode_words`]: trait.UnicodeSegmentation.html#tymethod.unicode_words
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
+#[derive(Debug)]
 pub struct UnicodeWords<'a> {
     inner: Filter<UWordBounds<'a>, fn(&&str) -> bool>,
 }
@@ -36,6 +37,11 @@
     fn next(&mut self) -> Option<&'a str> {
         self.inner.next()
     }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.inner.size_hint()
+    }
 }
 impl<'a> DoubleEndedIterator for UnicodeWords<'a> {
     #[inline]
@@ -57,7 +63,9 @@
 ///
 /// [`unicode_word_indices`]: trait.UnicodeSegmentation.html#tymethod.unicode_word_indices
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
+#[derive(Debug)]
 pub struct UnicodeWordIndices<'a> {
+    #[allow(clippy::type_complexity)]
     inner: Filter<UWordBoundIndices<'a>, fn(&(usize, &str)) -> bool>,
 }
 
@@ -68,6 +76,11 @@
     fn next(&mut self) -> Option<(usize, &'a str)> {
         self.inner.next()
     }
+
+    #[inline]
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        self.inner.size_hint()
+    }
 }
 impl<'a> DoubleEndedIterator for UnicodeWordIndices<'a> {
     #[inline]
@@ -84,7 +97,7 @@
 ///
 /// [`split_word_bounds`]: trait.UnicodeSegmentation.html#tymethod.split_word_bounds
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
-#[derive(Clone)]
+#[derive(Debug, Clone)]
 pub struct UWordBounds<'a> {
     string: &'a str,
     cat: Option<WordCat>,
@@ -98,7 +111,7 @@
 ///
 /// [`split_word_bound_indices`]: trait.UnicodeSegmentation.html#tymethod.split_word_bound_indices
 /// [`UnicodeSegmentation`]: trait.UnicodeSegmentation.html
-#[derive(Clone)]
+#[derive(Debug, Clone)]
 pub struct UWordBoundIndices<'a> {
     start_offset: usize,
     iter: UWordBounds<'a>,
@@ -200,7 +213,7 @@
         use self::FormatExtendType::*;
         use self::UWordBoundsState::*;
         use crate::tables::word as wd;
-        if self.string.len() == 0 {
+        if self.string.is_empty() {
             return None;
         }
 
@@ -256,17 +269,15 @@
             // state enum; the state enum represents the last non-zwj state encountered.
             // When prev_zwj is true, for the purposes of WB3c, we are in the Zwj state,
             // however we are in the previous state for the purposes of all other rules.
-            if prev_zwj {
-                if is_emoji(ch) {
-                    state = Emoji;
-                    continue;
-                }
+            if prev_zwj && is_emoji(ch) {
+                state = Emoji;
+                continue;
             }
             // Don't use `continue` in this match without updating `cat`
             state = match state {
                 Start if cat == wd::WC_CR => {
                     idx += match self.get_next_cat(idx) {
-                        Some(ncat) if ncat == wd::WC_LF => 1, // rule WB3
+                        Some(wd::WC_LF) => 1, // rule WB3
                         _ => 0,
                     };
                     break; // rule WB3a
@@ -431,7 +442,7 @@
         use self::FormatExtendType::*;
         use self::UWordBoundsState::*;
         use crate::tables::word as wd;
-        if self.string.len() == 0 {
+        if self.string.is_empty() {
             return None;
         }
 
@@ -467,10 +478,7 @@
             if cat == wd::WC_Extend || cat == wd::WC_Format || (cat == wd::WC_ZWJ && state != Zwj) {
                 // WB3c has more priority so we should not
                 // fold in that case
-                if match state {
-                    FormatExtend(_) | Start => false,
-                    _ => true,
-                } {
+                if !matches!(state, FormatExtend(_) | Start) {
                     saveidx = previdx;
                     savestate = state;
                     state = FormatExtend(AcceptNone);
@@ -508,7 +516,7 @@
                         if state == Start {
                             if cat == wd::WC_LF {
                                 idx -= match self.get_prev_cat(idx) {
-                                    Some(pcat) if pcat == wd::WC_CR => 1, // rule WB3
+                                    Some(wd::WC_CR) => 1, // rule WB3
                                     _ => 0,
                                 };
                             }
@@ -710,7 +718,7 @@
 }
 
 #[inline]
-pub fn new_word_bounds<'b>(s: &'b str) -> UWordBounds<'b> {
+pub fn new_word_bounds(s: &str) -> UWordBounds<'_> {
     UWordBounds {
         string: s,
         cat: None,
@@ -719,7 +727,7 @@
 }
 
 #[inline]
-pub fn new_word_bound_indices<'b>(s: &'b str) -> UWordBoundIndices<'b> {
+pub fn new_word_bound_indices(s: &str) -> UWordBoundIndices<'_> {
     UWordBoundIndices {
         start_offset: s.as_ptr() as usize,
         iter: new_word_bounds(s),
@@ -730,11 +738,11 @@
 fn has_alphanumeric(s: &&str) -> bool {
     use crate::tables::util::is_alphanumeric;
 
-    s.chars().any(|c| is_alphanumeric(c))
+    s.chars().any(is_alphanumeric)
 }
 
 #[inline]
-pub fn new_unicode_words<'b>(s: &'b str) -> UnicodeWords<'b> {
+pub fn new_unicode_words(s: &str) -> UnicodeWords<'_> {
     use super::UnicodeSegmentation;
 
     UnicodeWords {
@@ -743,7 +751,7 @@
 }
 
 #[inline]
-pub fn new_unicode_word_indices<'b>(s: &'b str) -> UnicodeWordIndices<'b> {
+pub fn new_unicode_word_indices(s: &str) -> UnicodeWordIndices<'_> {
     use super::UnicodeSegmentation;
 
     UnicodeWordIndices {
@@ -752,3 +760,20 @@
             .filter(|(_, c)| has_alphanumeric(c)),
     }
 }
+
+#[cfg(test)]
+mod tests {
+    #[test]
+    fn test_syriac_abbr_mark() {
+        use crate::tables::word as wd;
+        let (_, _, cat) = wd::word_category('\u{70f}');
+        assert_eq!(cat, wd::WC_ALetter);
+    }
+
+    #[test]
+    fn test_end_of_ayah_cat() {
+        use crate::tables::word as wd;
+        let (_, _, cat) = wd::word_category('\u{6dd}');
+        assert_eq!(cat, wd::WC_Numeric);
+    }
+}
diff --git a/crates/unicode-segmentation/src/test.rs b/crates/unicode-segmentation/tests/test.rs
similarity index 93%
rename from crates/unicode-segmentation/src/test.rs
rename to crates/unicode-segmentation/tests/test.rs
index bc642a5..5a89234 100644
--- a/crates/unicode-segmentation/src/test.rs
+++ b/crates/unicode-segmentation/tests/test.rs
@@ -8,19 +8,17 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-use super::UnicodeSegmentation;
+use quickcheck::quickcheck;
+use unicode_segmentation::UnicodeSegmentation;
 
-use std::prelude::v1::*;
+#[rustfmt::skip]
+mod testdata;
 
 #[test]
 fn test_graphemes() {
     use crate::testdata::{TEST_DIFF, TEST_SAME};
 
-    pub const EXTRA_DIFF: &'static [(
-        &'static str,
-        &'static [&'static str],
-        &'static [&'static str],
-    )] = &[
+    pub const EXTRA_DIFF: &[(&str, &[&str], &[&str])] = &[
         // Official test suite doesn't include two Prepend chars between two other chars.
         (
             "\u{20}\u{600}\u{600}\u{20}",
@@ -35,7 +33,7 @@
         ),
     ];
 
-    pub const EXTRA_SAME: &'static [(&'static str, &'static [&'static str])] = &[
+    pub const EXTRA_SAME: &[(&str, &[&str])] = &[
         // family emoji (more than two emoji joined by ZWJ)
         (
             "\u{1f468}\u{200d}\u{1f467}\u{200d}\u{1f466}",
@@ -51,8 +49,10 @@
 
     for &(s, g) in TEST_SAME.iter().chain(EXTRA_SAME) {
         // test forward iterator
-        assert!(UnicodeSegmentation::graphemes(s, true).eq(g.iter().cloned()));
-        assert!(UnicodeSegmentation::graphemes(s, false).eq(g.iter().cloned()));
+        let our_extended: Vec<_> = UnicodeSegmentation::graphemes(s, true).collect();
+        let our_legacy: Vec<_> = UnicodeSegmentation::graphemes(s, false).collect();
+        assert_eq!(our_extended, g, "{s:?} extended");
+        assert_eq!(our_legacy, g, "{s:?} legacy");
 
         // test reverse iterator
         assert!(UnicodeSegmentation::graphemes(s, true)
@@ -113,7 +113,7 @@
 
     // Unicode's official tests don't really test longer chains of flag emoji
     // TODO This could be improved with more tests like flag emoji with interspersed Extend chars and ZWJ
-    const EXTRA_TESTS: &'static [(&'static str, &'static [&'static str])] = &[
+    const EXTRA_TESTS: &[(&str, &[&str])] = &[
         (
             "🇦🇫🇦🇽🇦🇱🇩🇿🇦🇸🇦🇩🇦🇴",
             &["🇦🇫", "🇦🇽", "🇦🇱", "🇩🇿", "🇦🇸", "🇦🇩", "🇦🇴"],
diff --git a/crates/unicode-segmentation/tests/testdata/mod.rs b/crates/unicode-segmentation/tests/testdata/mod.rs
new file mode 100644
index 0000000..013d1df
--- /dev/null
+++ b/crates/unicode-segmentation/tests/testdata/mod.rs
@@ -0,0 +1,2480 @@
+// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly
+
+#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
+    // official Unicode test data
+    // http://www.unicode.org/Public/16.0.0/ucd/auxiliary/GraphemeBreakTest.txt
+    pub const TEST_SAME: &[(&str, &[&str])] = &[
+        ("\u{20}\u{20}", &["\u{20}", "\u{20}"]), ("\u{20}\u{308}\u{20}", &["\u{20}\u{308}",
+        "\u{20}"]), ("\u{20}\u{d}", &["\u{20}", "\u{d}"]), ("\u{20}\u{308}\u{d}", &["\u{20}\u{308}",
+        "\u{d}"]), ("\u{20}\u{a}", &["\u{20}", "\u{a}"]), ("\u{20}\u{308}\u{a}", &["\u{20}\u{308}",
+        "\u{a}"]), ("\u{20}\u{1}", &["\u{20}", "\u{1}"]), ("\u{20}\u{308}\u{1}", &["\u{20}\u{308}",
+        "\u{1}"]), ("\u{20}\u{200c}", &["\u{20}\u{200c}"]), ("\u{20}\u{308}\u{200c}",
+        &["\u{20}\u{308}\u{200c}"]), ("\u{20}\u{1f1e6}", &["\u{20}", "\u{1f1e6}"]),
+        ("\u{20}\u{308}\u{1f1e6}", &["\u{20}\u{308}", "\u{1f1e6}"]), ("\u{20}\u{600}", &["\u{20}",
+        "\u{600}"]), ("\u{20}\u{308}\u{600}", &["\u{20}\u{308}", "\u{600}"]), ("\u{20}\u{1100}",
+        &["\u{20}", "\u{1100}"]), ("\u{20}\u{308}\u{1100}", &["\u{20}\u{308}", "\u{1100}"]),
+        ("\u{20}\u{1160}", &["\u{20}", "\u{1160}"]), ("\u{20}\u{308}\u{1160}", &["\u{20}\u{308}",
+        "\u{1160}"]), ("\u{20}\u{11a8}", &["\u{20}", "\u{11a8}"]), ("\u{20}\u{308}\u{11a8}",
+        &["\u{20}\u{308}", "\u{11a8}"]), ("\u{20}\u{ac00}", &["\u{20}", "\u{ac00}"]),
+        ("\u{20}\u{308}\u{ac00}", &["\u{20}\u{308}", "\u{ac00}"]), ("\u{20}\u{ac01}", &["\u{20}",
+        "\u{ac01}"]), ("\u{20}\u{308}\u{ac01}", &["\u{20}\u{308}", "\u{ac01}"]), ("\u{20}\u{904}",
+        &["\u{20}", "\u{904}"]), ("\u{20}\u{308}\u{904}", &["\u{20}\u{308}", "\u{904}"]),
+        ("\u{20}\u{d4e}", &["\u{20}", "\u{d4e}"]), ("\u{20}\u{308}\u{d4e}", &["\u{20}\u{308}",
+        "\u{d4e}"]), ("\u{20}\u{915}", &["\u{20}", "\u{915}"]), ("\u{20}\u{308}\u{915}",
+        &["\u{20}\u{308}", "\u{915}"]), ("\u{20}\u{231a}", &["\u{20}", "\u{231a}"]),
+        ("\u{20}\u{308}\u{231a}", &["\u{20}\u{308}", "\u{231a}"]), ("\u{20}\u{300}",
+        &["\u{20}\u{300}"]), ("\u{20}\u{308}\u{300}", &["\u{20}\u{308}\u{300}"]), ("\u{20}\u{900}",
+        &["\u{20}\u{900}"]), ("\u{20}\u{308}\u{900}", &["\u{20}\u{308}\u{900}"]), ("\u{20}\u{94d}",
+        &["\u{20}\u{94d}"]), ("\u{20}\u{308}\u{94d}", &["\u{20}\u{308}\u{94d}"]), ("\u{20}\u{200d}",
+        &["\u{20}\u{200d}"]), ("\u{20}\u{308}\u{200d}", &["\u{20}\u{308}\u{200d}"]),
+        ("\u{20}\u{378}", &["\u{20}", "\u{378}"]), ("\u{20}\u{308}\u{378}", &["\u{20}\u{308}",
+        "\u{378}"]), ("\u{d}\u{20}", &["\u{d}", "\u{20}"]), ("\u{d}\u{308}\u{20}", &["\u{d}",
+        "\u{308}", "\u{20}"]), ("\u{d}\u{d}", &["\u{d}", "\u{d}"]), ("\u{d}\u{308}\u{d}", &["\u{d}",
+        "\u{308}", "\u{d}"]), ("\u{d}\u{a}", &["\u{d}\u{a}"]), ("\u{d}\u{308}\u{a}", &["\u{d}",
+        "\u{308}", "\u{a}"]), ("\u{d}\u{1}", &["\u{d}", "\u{1}"]), ("\u{d}\u{308}\u{1}", &["\u{d}",
+        "\u{308}", "\u{1}"]), ("\u{d}\u{200c}", &["\u{d}", "\u{200c}"]), ("\u{d}\u{308}\u{200c}",
+        &["\u{d}", "\u{308}\u{200c}"]), ("\u{d}\u{1f1e6}", &["\u{d}", "\u{1f1e6}"]),
+        ("\u{d}\u{308}\u{1f1e6}", &["\u{d}", "\u{308}", "\u{1f1e6}"]), ("\u{d}\u{600}", &["\u{d}",
+        "\u{600}"]), ("\u{d}\u{308}\u{600}", &["\u{d}", "\u{308}", "\u{600}"]), ("\u{d}\u{a03}",
+        &["\u{d}", "\u{a03}"]), ("\u{d}\u{1100}", &["\u{d}", "\u{1100}"]), ("\u{d}\u{308}\u{1100}",
+        &["\u{d}", "\u{308}", "\u{1100}"]), ("\u{d}\u{1160}", &["\u{d}", "\u{1160}"]),
+        ("\u{d}\u{308}\u{1160}", &["\u{d}", "\u{308}", "\u{1160}"]), ("\u{d}\u{11a8}", &["\u{d}",
+        "\u{11a8}"]), ("\u{d}\u{308}\u{11a8}", &["\u{d}", "\u{308}", "\u{11a8}"]), ("\u{d}\u{ac00}",
+        &["\u{d}", "\u{ac00}"]), ("\u{d}\u{308}\u{ac00}", &["\u{d}", "\u{308}", "\u{ac00}"]),
+        ("\u{d}\u{ac01}", &["\u{d}", "\u{ac01}"]), ("\u{d}\u{308}\u{ac01}", &["\u{d}", "\u{308}",
+        "\u{ac01}"]), ("\u{d}\u{903}", &["\u{d}", "\u{903}"]), ("\u{d}\u{904}", &["\u{d}",
+        "\u{904}"]), ("\u{d}\u{308}\u{904}", &["\u{d}", "\u{308}", "\u{904}"]), ("\u{d}\u{d4e}",
+        &["\u{d}", "\u{d4e}"]), ("\u{d}\u{308}\u{d4e}", &["\u{d}", "\u{308}", "\u{d4e}"]),
+        ("\u{d}\u{915}", &["\u{d}", "\u{915}"]), ("\u{d}\u{308}\u{915}", &["\u{d}", "\u{308}",
+        "\u{915}"]), ("\u{d}\u{231a}", &["\u{d}", "\u{231a}"]), ("\u{d}\u{308}\u{231a}", &["\u{d}",
+        "\u{308}", "\u{231a}"]), ("\u{d}\u{300}", &["\u{d}", "\u{300}"]), ("\u{d}\u{308}\u{300}",
+        &["\u{d}", "\u{308}\u{300}"]), ("\u{d}\u{900}", &["\u{d}", "\u{900}"]),
+        ("\u{d}\u{308}\u{900}", &["\u{d}", "\u{308}\u{900}"]), ("\u{d}\u{94d}", &["\u{d}",
+        "\u{94d}"]), ("\u{d}\u{308}\u{94d}", &["\u{d}", "\u{308}\u{94d}"]), ("\u{d}\u{200d}",
+        &["\u{d}", "\u{200d}"]), ("\u{d}\u{308}\u{200d}", &["\u{d}", "\u{308}\u{200d}"]),
+        ("\u{d}\u{378}", &["\u{d}", "\u{378}"]), ("\u{d}\u{308}\u{378}", &["\u{d}", "\u{308}",
+        "\u{378}"]), ("\u{a}\u{20}", &["\u{a}", "\u{20}"]), ("\u{a}\u{308}\u{20}", &["\u{a}",
+        "\u{308}", "\u{20}"]), ("\u{a}\u{d}", &["\u{a}", "\u{d}"]), ("\u{a}\u{308}\u{d}", &["\u{a}",
+        "\u{308}", "\u{d}"]), ("\u{a}\u{a}", &["\u{a}", "\u{a}"]), ("\u{a}\u{308}\u{a}", &["\u{a}",
+        "\u{308}", "\u{a}"]), ("\u{a}\u{1}", &["\u{a}", "\u{1}"]), ("\u{a}\u{308}\u{1}", &["\u{a}",
+        "\u{308}", "\u{1}"]), ("\u{a}\u{200c}", &["\u{a}", "\u{200c}"]), ("\u{a}\u{308}\u{200c}",
+        &["\u{a}", "\u{308}\u{200c}"]), ("\u{a}\u{1f1e6}", &["\u{a}", "\u{1f1e6}"]),
+        ("\u{a}\u{308}\u{1f1e6}", &["\u{a}", "\u{308}", "\u{1f1e6}"]), ("\u{a}\u{600}", &["\u{a}",
+        "\u{600}"]), ("\u{a}\u{308}\u{600}", &["\u{a}", "\u{308}", "\u{600}"]), ("\u{a}\u{a03}",
+        &["\u{a}", "\u{a03}"]), ("\u{a}\u{1100}", &["\u{a}", "\u{1100}"]), ("\u{a}\u{308}\u{1100}",
+        &["\u{a}", "\u{308}", "\u{1100}"]), ("\u{a}\u{1160}", &["\u{a}", "\u{1160}"]),
+        ("\u{a}\u{308}\u{1160}", &["\u{a}", "\u{308}", "\u{1160}"]), ("\u{a}\u{11a8}", &["\u{a}",
+        "\u{11a8}"]), ("\u{a}\u{308}\u{11a8}", &["\u{a}", "\u{308}", "\u{11a8}"]), ("\u{a}\u{ac00}",
+        &["\u{a}", "\u{ac00}"]), ("\u{a}\u{308}\u{ac00}", &["\u{a}", "\u{308}", "\u{ac00}"]),
+        ("\u{a}\u{ac01}", &["\u{a}", "\u{ac01}"]), ("\u{a}\u{308}\u{ac01}", &["\u{a}", "\u{308}",
+        "\u{ac01}"]), ("\u{a}\u{903}", &["\u{a}", "\u{903}"]), ("\u{a}\u{904}", &["\u{a}",
+        "\u{904}"]), ("\u{a}\u{308}\u{904}", &["\u{a}", "\u{308}", "\u{904}"]), ("\u{a}\u{d4e}",
+        &["\u{a}", "\u{d4e}"]), ("\u{a}\u{308}\u{d4e}", &["\u{a}", "\u{308}", "\u{d4e}"]),
+        ("\u{a}\u{915}", &["\u{a}", "\u{915}"]), ("\u{a}\u{308}\u{915}", &["\u{a}", "\u{308}",
+        "\u{915}"]), ("\u{a}\u{231a}", &["\u{a}", "\u{231a}"]), ("\u{a}\u{308}\u{231a}", &["\u{a}",
+        "\u{308}", "\u{231a}"]), ("\u{a}\u{300}", &["\u{a}", "\u{300}"]), ("\u{a}\u{308}\u{300}",
+        &["\u{a}", "\u{308}\u{300}"]), ("\u{a}\u{900}", &["\u{a}", "\u{900}"]),
+        ("\u{a}\u{308}\u{900}", &["\u{a}", "\u{308}\u{900}"]), ("\u{a}\u{94d}", &["\u{a}",
+        "\u{94d}"]), ("\u{a}\u{308}\u{94d}", &["\u{a}", "\u{308}\u{94d}"]), ("\u{a}\u{200d}",
+        &["\u{a}", "\u{200d}"]), ("\u{a}\u{308}\u{200d}", &["\u{a}", "\u{308}\u{200d}"]),
+        ("\u{a}\u{378}", &["\u{a}", "\u{378}"]), ("\u{a}\u{308}\u{378}", &["\u{a}", "\u{308}",
+        "\u{378}"]), ("\u{1}\u{20}", &["\u{1}", "\u{20}"]), ("\u{1}\u{308}\u{20}", &["\u{1}",
+        "\u{308}", "\u{20}"]), ("\u{1}\u{d}", &["\u{1}", "\u{d}"]), ("\u{1}\u{308}\u{d}", &["\u{1}",
+        "\u{308}", "\u{d}"]), ("\u{1}\u{a}", &["\u{1}", "\u{a}"]), ("\u{1}\u{308}\u{a}", &["\u{1}",
+        "\u{308}", "\u{a}"]), ("\u{1}\u{1}", &["\u{1}", "\u{1}"]), ("\u{1}\u{308}\u{1}", &["\u{1}",
+        "\u{308}", "\u{1}"]), ("\u{1}\u{200c}", &["\u{1}", "\u{200c}"]), ("\u{1}\u{308}\u{200c}",
+        &["\u{1}", "\u{308}\u{200c}"]), ("\u{1}\u{1f1e6}", &["\u{1}", "\u{1f1e6}"]),
+        ("\u{1}\u{308}\u{1f1e6}", &["\u{1}", "\u{308}", "\u{1f1e6}"]), ("\u{1}\u{600}", &["\u{1}",
+        "\u{600}"]), ("\u{1}\u{308}\u{600}", &["\u{1}", "\u{308}", "\u{600}"]), ("\u{1}\u{a03}",
+        &["\u{1}", "\u{a03}"]), ("\u{1}\u{1100}", &["\u{1}", "\u{1100}"]), ("\u{1}\u{308}\u{1100}",
+        &["\u{1}", "\u{308}", "\u{1100}"]), ("\u{1}\u{1160}", &["\u{1}", "\u{1160}"]),
+        ("\u{1}\u{308}\u{1160}", &["\u{1}", "\u{308}", "\u{1160}"]), ("\u{1}\u{11a8}", &["\u{1}",
+        "\u{11a8}"]), ("\u{1}\u{308}\u{11a8}", &["\u{1}", "\u{308}", "\u{11a8}"]), ("\u{1}\u{ac00}",
+        &["\u{1}", "\u{ac00}"]), ("\u{1}\u{308}\u{ac00}", &["\u{1}", "\u{308}", "\u{ac00}"]),
+        ("\u{1}\u{ac01}", &["\u{1}", "\u{ac01}"]), ("\u{1}\u{308}\u{ac01}", &["\u{1}", "\u{308}",
+        "\u{ac01}"]), ("\u{1}\u{903}", &["\u{1}", "\u{903}"]), ("\u{1}\u{904}", &["\u{1}",
+        "\u{904}"]), ("\u{1}\u{308}\u{904}", &["\u{1}", "\u{308}", "\u{904}"]), ("\u{1}\u{d4e}",
+        &["\u{1}", "\u{d4e}"]), ("\u{1}\u{308}\u{d4e}", &["\u{1}", "\u{308}", "\u{d4e}"]),
+        ("\u{1}\u{915}", &["\u{1}", "\u{915}"]), ("\u{1}\u{308}\u{915}", &["\u{1}", "\u{308}",
+        "\u{915}"]), ("\u{1}\u{231a}", &["\u{1}", "\u{231a}"]), ("\u{1}\u{308}\u{231a}", &["\u{1}",
+        "\u{308}", "\u{231a}"]), ("\u{1}\u{300}", &["\u{1}", "\u{300}"]), ("\u{1}\u{308}\u{300}",
+        &["\u{1}", "\u{308}\u{300}"]), ("\u{1}\u{900}", &["\u{1}", "\u{900}"]),
+        ("\u{1}\u{308}\u{900}", &["\u{1}", "\u{308}\u{900}"]), ("\u{1}\u{94d}", &["\u{1}",
+        "\u{94d}"]), ("\u{1}\u{308}\u{94d}", &["\u{1}", "\u{308}\u{94d}"]), ("\u{1}\u{200d}",
+        &["\u{1}", "\u{200d}"]), ("\u{1}\u{308}\u{200d}", &["\u{1}", "\u{308}\u{200d}"]),
+        ("\u{1}\u{378}", &["\u{1}", "\u{378}"]), ("\u{1}\u{308}\u{378}", &["\u{1}", "\u{308}",
+        "\u{378}"]), ("\u{200c}\u{20}", &["\u{200c}", "\u{20}"]), ("\u{200c}\u{308}\u{20}",
+        &["\u{200c}\u{308}", "\u{20}"]), ("\u{200c}\u{d}", &["\u{200c}", "\u{d}"]),
+        ("\u{200c}\u{308}\u{d}", &["\u{200c}\u{308}", "\u{d}"]), ("\u{200c}\u{a}", &["\u{200c}",
+        "\u{a}"]), ("\u{200c}\u{308}\u{a}", &["\u{200c}\u{308}", "\u{a}"]), ("\u{200c}\u{1}",
+        &["\u{200c}", "\u{1}"]), ("\u{200c}\u{308}\u{1}", &["\u{200c}\u{308}", "\u{1}"]),
+        ("\u{200c}\u{200c}", &["\u{200c}\u{200c}"]), ("\u{200c}\u{308}\u{200c}",
+        &["\u{200c}\u{308}\u{200c}"]), ("\u{200c}\u{1f1e6}", &["\u{200c}", "\u{1f1e6}"]),
+        ("\u{200c}\u{308}\u{1f1e6}", &["\u{200c}\u{308}", "\u{1f1e6}"]), ("\u{200c}\u{600}",
+        &["\u{200c}", "\u{600}"]), ("\u{200c}\u{308}\u{600}", &["\u{200c}\u{308}", "\u{600}"]),
+        ("\u{200c}\u{1100}", &["\u{200c}", "\u{1100}"]), ("\u{200c}\u{308}\u{1100}",
+        &["\u{200c}\u{308}", "\u{1100}"]), ("\u{200c}\u{1160}", &["\u{200c}", "\u{1160}"]),
+        ("\u{200c}\u{308}\u{1160}", &["\u{200c}\u{308}", "\u{1160}"]), ("\u{200c}\u{11a8}",
+        &["\u{200c}", "\u{11a8}"]), ("\u{200c}\u{308}\u{11a8}", &["\u{200c}\u{308}", "\u{11a8}"]),
+        ("\u{200c}\u{ac00}", &["\u{200c}", "\u{ac00}"]), ("\u{200c}\u{308}\u{ac00}",
+        &["\u{200c}\u{308}", "\u{ac00}"]), ("\u{200c}\u{ac01}", &["\u{200c}", "\u{ac01}"]),
+        ("\u{200c}\u{308}\u{ac01}", &["\u{200c}\u{308}", "\u{ac01}"]), ("\u{200c}\u{904}",
+        &["\u{200c}", "\u{904}"]), ("\u{200c}\u{308}\u{904}", &["\u{200c}\u{308}", "\u{904}"]),
+        ("\u{200c}\u{d4e}", &["\u{200c}", "\u{d4e}"]), ("\u{200c}\u{308}\u{d4e}",
+        &["\u{200c}\u{308}", "\u{d4e}"]), ("\u{200c}\u{915}", &["\u{200c}", "\u{915}"]),
+        ("\u{200c}\u{308}\u{915}", &["\u{200c}\u{308}", "\u{915}"]), ("\u{200c}\u{231a}",
+        &["\u{200c}", "\u{231a}"]), ("\u{200c}\u{308}\u{231a}", &["\u{200c}\u{308}", "\u{231a}"]),
+        ("\u{200c}\u{300}", &["\u{200c}\u{300}"]), ("\u{200c}\u{308}\u{300}",
+        &["\u{200c}\u{308}\u{300}"]), ("\u{200c}\u{900}", &["\u{200c}\u{900}"]),
+        ("\u{200c}\u{308}\u{900}", &["\u{200c}\u{308}\u{900}"]), ("\u{200c}\u{94d}",
+        &["\u{200c}\u{94d}"]), ("\u{200c}\u{308}\u{94d}", &["\u{200c}\u{308}\u{94d}"]),
+        ("\u{200c}\u{200d}", &["\u{200c}\u{200d}"]), ("\u{200c}\u{308}\u{200d}",
+        &["\u{200c}\u{308}\u{200d}"]), ("\u{200c}\u{378}", &["\u{200c}", "\u{378}"]),
+        ("\u{200c}\u{308}\u{378}", &["\u{200c}\u{308}", "\u{378}"]), ("\u{1f1e6}\u{20}",
+        &["\u{1f1e6}", "\u{20}"]), ("\u{1f1e6}\u{308}\u{20}", &["\u{1f1e6}\u{308}", "\u{20}"]),
+        ("\u{1f1e6}\u{d}", &["\u{1f1e6}", "\u{d}"]), ("\u{1f1e6}\u{308}\u{d}", &["\u{1f1e6}\u{308}",
+        "\u{d}"]), ("\u{1f1e6}\u{a}", &["\u{1f1e6}", "\u{a}"]), ("\u{1f1e6}\u{308}\u{a}",
+        &["\u{1f1e6}\u{308}", "\u{a}"]), ("\u{1f1e6}\u{1}", &["\u{1f1e6}", "\u{1}"]),
+        ("\u{1f1e6}\u{308}\u{1}", &["\u{1f1e6}\u{308}", "\u{1}"]), ("\u{1f1e6}\u{200c}",
+        &["\u{1f1e6}\u{200c}"]), ("\u{1f1e6}\u{308}\u{200c}", &["\u{1f1e6}\u{308}\u{200c}"]),
+        ("\u{1f1e6}\u{1f1e6}", &["\u{1f1e6}\u{1f1e6}"]), ("\u{1f1e6}\u{308}\u{1f1e6}",
+        &["\u{1f1e6}\u{308}", "\u{1f1e6}"]), ("\u{1f1e6}\u{600}", &["\u{1f1e6}", "\u{600}"]),
+        ("\u{1f1e6}\u{308}\u{600}", &["\u{1f1e6}\u{308}", "\u{600}"]), ("\u{1f1e6}\u{1100}",
+        &["\u{1f1e6}", "\u{1100}"]), ("\u{1f1e6}\u{308}\u{1100}", &["\u{1f1e6}\u{308}",
+        "\u{1100}"]), ("\u{1f1e6}\u{1160}", &["\u{1f1e6}", "\u{1160}"]),
+        ("\u{1f1e6}\u{308}\u{1160}", &["\u{1f1e6}\u{308}", "\u{1160}"]), ("\u{1f1e6}\u{11a8}",
+        &["\u{1f1e6}", "\u{11a8}"]), ("\u{1f1e6}\u{308}\u{11a8}", &["\u{1f1e6}\u{308}",
+        "\u{11a8}"]), ("\u{1f1e6}\u{ac00}", &["\u{1f1e6}", "\u{ac00}"]),
+        ("\u{1f1e6}\u{308}\u{ac00}", &["\u{1f1e6}\u{308}", "\u{ac00}"]), ("\u{1f1e6}\u{ac01}",
+        &["\u{1f1e6}", "\u{ac01}"]), ("\u{1f1e6}\u{308}\u{ac01}", &["\u{1f1e6}\u{308}",
+        "\u{ac01}"]), ("\u{1f1e6}\u{904}", &["\u{1f1e6}", "\u{904}"]), ("\u{1f1e6}\u{308}\u{904}",
+        &["\u{1f1e6}\u{308}", "\u{904}"]), ("\u{1f1e6}\u{d4e}", &["\u{1f1e6}", "\u{d4e}"]),
+        ("\u{1f1e6}\u{308}\u{d4e}", &["\u{1f1e6}\u{308}", "\u{d4e}"]), ("\u{1f1e6}\u{915}",
+        &["\u{1f1e6}", "\u{915}"]), ("\u{1f1e6}\u{308}\u{915}", &["\u{1f1e6}\u{308}", "\u{915}"]),
+        ("\u{1f1e6}\u{231a}", &["\u{1f1e6}", "\u{231a}"]), ("\u{1f1e6}\u{308}\u{231a}",
+        &["\u{1f1e6}\u{308}", "\u{231a}"]), ("\u{1f1e6}\u{300}", &["\u{1f1e6}\u{300}"]),
+        ("\u{1f1e6}\u{308}\u{300}", &["\u{1f1e6}\u{308}\u{300}"]), ("\u{1f1e6}\u{900}",
+        &["\u{1f1e6}\u{900}"]), ("\u{1f1e6}\u{308}\u{900}", &["\u{1f1e6}\u{308}\u{900}"]),
+        ("\u{1f1e6}\u{94d}", &["\u{1f1e6}\u{94d}"]), ("\u{1f1e6}\u{308}\u{94d}",
+        &["\u{1f1e6}\u{308}\u{94d}"]), ("\u{1f1e6}\u{200d}", &["\u{1f1e6}\u{200d}"]),
+        ("\u{1f1e6}\u{308}\u{200d}", &["\u{1f1e6}\u{308}\u{200d}"]), ("\u{1f1e6}\u{378}",
+        &["\u{1f1e6}", "\u{378}"]), ("\u{1f1e6}\u{308}\u{378}", &["\u{1f1e6}\u{308}", "\u{378}"]),
+        ("\u{600}\u{308}\u{20}", &["\u{600}\u{308}", "\u{20}"]), ("\u{600}\u{d}", &["\u{600}",
+        "\u{d}"]), ("\u{600}\u{308}\u{d}", &["\u{600}\u{308}", "\u{d}"]), ("\u{600}\u{a}",
+        &["\u{600}", "\u{a}"]), ("\u{600}\u{308}\u{a}", &["\u{600}\u{308}", "\u{a}"]),
+        ("\u{600}\u{1}", &["\u{600}", "\u{1}"]), ("\u{600}\u{308}\u{1}", &["\u{600}\u{308}",
+        "\u{1}"]), ("\u{600}\u{200c}", &["\u{600}\u{200c}"]), ("\u{600}\u{308}\u{200c}",
+        &["\u{600}\u{308}\u{200c}"]), ("\u{600}\u{308}\u{1f1e6}", &["\u{600}\u{308}", "\u{1f1e6}"]),
+        ("\u{600}\u{308}\u{600}", &["\u{600}\u{308}", "\u{600}"]), ("\u{600}\u{308}\u{1100}",
+        &["\u{600}\u{308}", "\u{1100}"]), ("\u{600}\u{308}\u{1160}", &["\u{600}\u{308}",
+        "\u{1160}"]), ("\u{600}\u{308}\u{11a8}", &["\u{600}\u{308}", "\u{11a8}"]),
+        ("\u{600}\u{308}\u{ac00}", &["\u{600}\u{308}", "\u{ac00}"]), ("\u{600}\u{308}\u{ac01}",
+        &["\u{600}\u{308}", "\u{ac01}"]), ("\u{600}\u{308}\u{904}", &["\u{600}\u{308}", "\u{904}"]),
+        ("\u{600}\u{308}\u{d4e}", &["\u{600}\u{308}", "\u{d4e}"]), ("\u{600}\u{308}\u{915}",
+        &["\u{600}\u{308}", "\u{915}"]), ("\u{600}\u{308}\u{231a}", &["\u{600}\u{308}",
+        "\u{231a}"]), ("\u{600}\u{300}", &["\u{600}\u{300}"]), ("\u{600}\u{308}\u{300}",
+        &["\u{600}\u{308}\u{300}"]), ("\u{600}\u{900}", &["\u{600}\u{900}"]),
+        ("\u{600}\u{308}\u{900}", &["\u{600}\u{308}\u{900}"]), ("\u{600}\u{94d}",
+        &["\u{600}\u{94d}"]), ("\u{600}\u{308}\u{94d}", &["\u{600}\u{308}\u{94d}"]),
+        ("\u{600}\u{200d}", &["\u{600}\u{200d}"]), ("\u{600}\u{308}\u{200d}",
+        &["\u{600}\u{308}\u{200d}"]), ("\u{600}\u{308}\u{378}", &["\u{600}\u{308}", "\u{378}"]),
+        ("\u{a03}\u{20}", &["\u{a03}", "\u{20}"]), ("\u{a03}\u{308}\u{20}", &["\u{a03}\u{308}",
+        "\u{20}"]), ("\u{a03}\u{d}", &["\u{a03}", "\u{d}"]), ("\u{a03}\u{308}\u{d}",
+        &["\u{a03}\u{308}", "\u{d}"]), ("\u{a03}\u{a}", &["\u{a03}", "\u{a}"]),
+        ("\u{a03}\u{308}\u{a}", &["\u{a03}\u{308}", "\u{a}"]), ("\u{a03}\u{1}", &["\u{a03}",
+        "\u{1}"]), ("\u{a03}\u{308}\u{1}", &["\u{a03}\u{308}", "\u{1}"]), ("\u{a03}\u{200c}",
+        &["\u{a03}\u{200c}"]), ("\u{a03}\u{308}\u{200c}", &["\u{a03}\u{308}\u{200c}"]),
+        ("\u{a03}\u{1f1e6}", &["\u{a03}", "\u{1f1e6}"]), ("\u{a03}\u{308}\u{1f1e6}",
+        &["\u{a03}\u{308}", "\u{1f1e6}"]), ("\u{a03}\u{600}", &["\u{a03}", "\u{600}"]),
+        ("\u{a03}\u{308}\u{600}", &["\u{a03}\u{308}", "\u{600}"]), ("\u{a03}\u{1100}", &["\u{a03}",
+        "\u{1100}"]), ("\u{a03}\u{308}\u{1100}", &["\u{a03}\u{308}", "\u{1100}"]),
+        ("\u{a03}\u{1160}", &["\u{a03}", "\u{1160}"]), ("\u{a03}\u{308}\u{1160}",
+        &["\u{a03}\u{308}", "\u{1160}"]), ("\u{a03}\u{11a8}", &["\u{a03}", "\u{11a8}"]),
+        ("\u{a03}\u{308}\u{11a8}", &["\u{a03}\u{308}", "\u{11a8}"]), ("\u{a03}\u{ac00}",
+        &["\u{a03}", "\u{ac00}"]), ("\u{a03}\u{308}\u{ac00}", &["\u{a03}\u{308}", "\u{ac00}"]),
+        ("\u{a03}\u{ac01}", &["\u{a03}", "\u{ac01}"]), ("\u{a03}\u{308}\u{ac01}",
+        &["\u{a03}\u{308}", "\u{ac01}"]), ("\u{a03}\u{904}", &["\u{a03}", "\u{904}"]),
+        ("\u{a03}\u{308}\u{904}", &["\u{a03}\u{308}", "\u{904}"]), ("\u{a03}\u{d4e}", &["\u{a03}",
+        "\u{d4e}"]), ("\u{a03}\u{308}\u{d4e}", &["\u{a03}\u{308}", "\u{d4e}"]), ("\u{a03}\u{915}",
+        &["\u{a03}", "\u{915}"]), ("\u{a03}\u{308}\u{915}", &["\u{a03}\u{308}", "\u{915}"]),
+        ("\u{a03}\u{231a}", &["\u{a03}", "\u{231a}"]), ("\u{a03}\u{308}\u{231a}",
+        &["\u{a03}\u{308}", "\u{231a}"]), ("\u{a03}\u{300}", &["\u{a03}\u{300}"]),
+        ("\u{a03}\u{308}\u{300}", &["\u{a03}\u{308}\u{300}"]), ("\u{a03}\u{900}",
+        &["\u{a03}\u{900}"]), ("\u{a03}\u{308}\u{900}", &["\u{a03}\u{308}\u{900}"]),
+        ("\u{a03}\u{94d}", &["\u{a03}\u{94d}"]), ("\u{a03}\u{308}\u{94d}",
+        &["\u{a03}\u{308}\u{94d}"]), ("\u{a03}\u{200d}", &["\u{a03}\u{200d}"]),
+        ("\u{a03}\u{308}\u{200d}", &["\u{a03}\u{308}\u{200d}"]), ("\u{a03}\u{378}", &["\u{a03}",
+        "\u{378}"]), ("\u{a03}\u{308}\u{378}", &["\u{a03}\u{308}", "\u{378}"]), ("\u{1100}\u{20}",
+        &["\u{1100}", "\u{20}"]), ("\u{1100}\u{308}\u{20}", &["\u{1100}\u{308}", "\u{20}"]),
+        ("\u{1100}\u{d}", &["\u{1100}", "\u{d}"]), ("\u{1100}\u{308}\u{d}", &["\u{1100}\u{308}",
+        "\u{d}"]), ("\u{1100}\u{a}", &["\u{1100}", "\u{a}"]), ("\u{1100}\u{308}\u{a}",
+        &["\u{1100}\u{308}", "\u{a}"]), ("\u{1100}\u{1}", &["\u{1100}", "\u{1}"]),
+        ("\u{1100}\u{308}\u{1}", &["\u{1100}\u{308}", "\u{1}"]), ("\u{1100}\u{200c}",
+        &["\u{1100}\u{200c}"]), ("\u{1100}\u{308}\u{200c}", &["\u{1100}\u{308}\u{200c}"]),
+        ("\u{1100}\u{1f1e6}", &["\u{1100}", "\u{1f1e6}"]), ("\u{1100}\u{308}\u{1f1e6}",
+        &["\u{1100}\u{308}", "\u{1f1e6}"]), ("\u{1100}\u{600}", &["\u{1100}", "\u{600}"]),
+        ("\u{1100}\u{308}\u{600}", &["\u{1100}\u{308}", "\u{600}"]), ("\u{1100}\u{1100}",
+        &["\u{1100}\u{1100}"]), ("\u{1100}\u{308}\u{1100}", &["\u{1100}\u{308}", "\u{1100}"]),
+        ("\u{1100}\u{1160}", &["\u{1100}\u{1160}"]), ("\u{1100}\u{308}\u{1160}",
+        &["\u{1100}\u{308}", "\u{1160}"]), ("\u{1100}\u{11a8}", &["\u{1100}", "\u{11a8}"]),
+        ("\u{1100}\u{308}\u{11a8}", &["\u{1100}\u{308}", "\u{11a8}"]), ("\u{1100}\u{ac00}",
+        &["\u{1100}\u{ac00}"]), ("\u{1100}\u{308}\u{ac00}", &["\u{1100}\u{308}", "\u{ac00}"]),
+        ("\u{1100}\u{ac01}", &["\u{1100}\u{ac01}"]), ("\u{1100}\u{308}\u{ac01}",
+        &["\u{1100}\u{308}", "\u{ac01}"]), ("\u{1100}\u{904}", &["\u{1100}", "\u{904}"]),
+        ("\u{1100}\u{308}\u{904}", &["\u{1100}\u{308}", "\u{904}"]), ("\u{1100}\u{d4e}",
+        &["\u{1100}", "\u{d4e}"]), ("\u{1100}\u{308}\u{d4e}", &["\u{1100}\u{308}", "\u{d4e}"]),
+        ("\u{1100}\u{915}", &["\u{1100}", "\u{915}"]), ("\u{1100}\u{308}\u{915}",
+        &["\u{1100}\u{308}", "\u{915}"]), ("\u{1100}\u{231a}", &["\u{1100}", "\u{231a}"]),
+        ("\u{1100}\u{308}\u{231a}", &["\u{1100}\u{308}", "\u{231a}"]), ("\u{1100}\u{300}",
+        &["\u{1100}\u{300}"]), ("\u{1100}\u{308}\u{300}", &["\u{1100}\u{308}\u{300}"]),
+        ("\u{1100}\u{900}", &["\u{1100}\u{900}"]), ("\u{1100}\u{308}\u{900}",
+        &["\u{1100}\u{308}\u{900}"]), ("\u{1100}\u{94d}", &["\u{1100}\u{94d}"]),
+        ("\u{1100}\u{308}\u{94d}", &["\u{1100}\u{308}\u{94d}"]), ("\u{1100}\u{200d}",
+        &["\u{1100}\u{200d}"]), ("\u{1100}\u{308}\u{200d}", &["\u{1100}\u{308}\u{200d}"]),
+        ("\u{1100}\u{378}", &["\u{1100}", "\u{378}"]), ("\u{1100}\u{308}\u{378}",
+        &["\u{1100}\u{308}", "\u{378}"]), ("\u{1160}\u{20}", &["\u{1160}", "\u{20}"]),
+        ("\u{1160}\u{308}\u{20}", &["\u{1160}\u{308}", "\u{20}"]), ("\u{1160}\u{d}", &["\u{1160}",
+        "\u{d}"]), ("\u{1160}\u{308}\u{d}", &["\u{1160}\u{308}", "\u{d}"]), ("\u{1160}\u{a}",
+        &["\u{1160}", "\u{a}"]), ("\u{1160}\u{308}\u{a}", &["\u{1160}\u{308}", "\u{a}"]),
+        ("\u{1160}\u{1}", &["\u{1160}", "\u{1}"]), ("\u{1160}\u{308}\u{1}", &["\u{1160}\u{308}",
+        "\u{1}"]), ("\u{1160}\u{200c}", &["\u{1160}\u{200c}"]), ("\u{1160}\u{308}\u{200c}",
+        &["\u{1160}\u{308}\u{200c}"]), ("\u{1160}\u{1f1e6}", &["\u{1160}", "\u{1f1e6}"]),
+        ("\u{1160}\u{308}\u{1f1e6}", &["\u{1160}\u{308}", "\u{1f1e6}"]), ("\u{1160}\u{600}",
+        &["\u{1160}", "\u{600}"]), ("\u{1160}\u{308}\u{600}", &["\u{1160}\u{308}", "\u{600}"]),
+        ("\u{1160}\u{1100}", &["\u{1160}", "\u{1100}"]), ("\u{1160}\u{308}\u{1100}",
+        &["\u{1160}\u{308}", "\u{1100}"]), ("\u{1160}\u{1160}", &["\u{1160}\u{1160}"]),
+        ("\u{1160}\u{308}\u{1160}", &["\u{1160}\u{308}", "\u{1160}"]), ("\u{1160}\u{11a8}",
+        &["\u{1160}\u{11a8}"]), ("\u{1160}\u{308}\u{11a8}", &["\u{1160}\u{308}", "\u{11a8}"]),
+        ("\u{1160}\u{ac00}", &["\u{1160}", "\u{ac00}"]), ("\u{1160}\u{308}\u{ac00}",
+        &["\u{1160}\u{308}", "\u{ac00}"]), ("\u{1160}\u{ac01}", &["\u{1160}", "\u{ac01}"]),
+        ("\u{1160}\u{308}\u{ac01}", &["\u{1160}\u{308}", "\u{ac01}"]), ("\u{1160}\u{904}",
+        &["\u{1160}", "\u{904}"]), ("\u{1160}\u{308}\u{904}", &["\u{1160}\u{308}", "\u{904}"]),
+        ("\u{1160}\u{d4e}", &["\u{1160}", "\u{d4e}"]), ("\u{1160}\u{308}\u{d4e}",
+        &["\u{1160}\u{308}", "\u{d4e}"]), ("\u{1160}\u{915}", &["\u{1160}", "\u{915}"]),
+        ("\u{1160}\u{308}\u{915}", &["\u{1160}\u{308}", "\u{915}"]), ("\u{1160}\u{231a}",
+        &["\u{1160}", "\u{231a}"]), ("\u{1160}\u{308}\u{231a}", &["\u{1160}\u{308}", "\u{231a}"]),
+        ("\u{1160}\u{300}", &["\u{1160}\u{300}"]), ("\u{1160}\u{308}\u{300}",
+        &["\u{1160}\u{308}\u{300}"]), ("\u{1160}\u{900}", &["\u{1160}\u{900}"]),
+        ("\u{1160}\u{308}\u{900}", &["\u{1160}\u{308}\u{900}"]), ("\u{1160}\u{94d}",
+        &["\u{1160}\u{94d}"]), ("\u{1160}\u{308}\u{94d}", &["\u{1160}\u{308}\u{94d}"]),
+        ("\u{1160}\u{200d}", &["\u{1160}\u{200d}"]), ("\u{1160}\u{308}\u{200d}",
+        &["\u{1160}\u{308}\u{200d}"]), ("\u{1160}\u{378}", &["\u{1160}", "\u{378}"]),
+        ("\u{1160}\u{308}\u{378}", &["\u{1160}\u{308}", "\u{378}"]), ("\u{11a8}\u{20}",
+        &["\u{11a8}", "\u{20}"]), ("\u{11a8}\u{308}\u{20}", &["\u{11a8}\u{308}", "\u{20}"]),
+        ("\u{11a8}\u{d}", &["\u{11a8}", "\u{d}"]), ("\u{11a8}\u{308}\u{d}", &["\u{11a8}\u{308}",
+        "\u{d}"]), ("\u{11a8}\u{a}", &["\u{11a8}", "\u{a}"]), ("\u{11a8}\u{308}\u{a}",
+        &["\u{11a8}\u{308}", "\u{a}"]), ("\u{11a8}\u{1}", &["\u{11a8}", "\u{1}"]),
+        ("\u{11a8}\u{308}\u{1}", &["\u{11a8}\u{308}", "\u{1}"]), ("\u{11a8}\u{200c}",
+        &["\u{11a8}\u{200c}"]), ("\u{11a8}\u{308}\u{200c}", &["\u{11a8}\u{308}\u{200c}"]),
+        ("\u{11a8}\u{1f1e6}", &["\u{11a8}", "\u{1f1e6}"]), ("\u{11a8}\u{308}\u{1f1e6}",
+        &["\u{11a8}\u{308}", "\u{1f1e6}"]), ("\u{11a8}\u{600}", &["\u{11a8}", "\u{600}"]),
+        ("\u{11a8}\u{308}\u{600}", &["\u{11a8}\u{308}", "\u{600}"]), ("\u{11a8}\u{1100}",
+        &["\u{11a8}", "\u{1100}"]), ("\u{11a8}\u{308}\u{1100}", &["\u{11a8}\u{308}", "\u{1100}"]),
+        ("\u{11a8}\u{1160}", &["\u{11a8}", "\u{1160}"]), ("\u{11a8}\u{308}\u{1160}",
+        &["\u{11a8}\u{308}", "\u{1160}"]), ("\u{11a8}\u{11a8}", &["\u{11a8}\u{11a8}"]),
+        ("\u{11a8}\u{308}\u{11a8}", &["\u{11a8}\u{308}", "\u{11a8}"]), ("\u{11a8}\u{ac00}",
+        &["\u{11a8}", "\u{ac00}"]), ("\u{11a8}\u{308}\u{ac00}", &["\u{11a8}\u{308}", "\u{ac00}"]),
+        ("\u{11a8}\u{ac01}", &["\u{11a8}", "\u{ac01}"]), ("\u{11a8}\u{308}\u{ac01}",
+        &["\u{11a8}\u{308}", "\u{ac01}"]), ("\u{11a8}\u{904}", &["\u{11a8}", "\u{904}"]),
+        ("\u{11a8}\u{308}\u{904}", &["\u{11a8}\u{308}", "\u{904}"]), ("\u{11a8}\u{d4e}",
+        &["\u{11a8}", "\u{d4e}"]), ("\u{11a8}\u{308}\u{d4e}", &["\u{11a8}\u{308}", "\u{d4e}"]),
+        ("\u{11a8}\u{915}", &["\u{11a8}", "\u{915}"]), ("\u{11a8}\u{308}\u{915}",
+        &["\u{11a8}\u{308}", "\u{915}"]), ("\u{11a8}\u{231a}", &["\u{11a8}", "\u{231a}"]),
+        ("\u{11a8}\u{308}\u{231a}", &["\u{11a8}\u{308}", "\u{231a}"]), ("\u{11a8}\u{300}",
+        &["\u{11a8}\u{300}"]), ("\u{11a8}\u{308}\u{300}", &["\u{11a8}\u{308}\u{300}"]),
+        ("\u{11a8}\u{900}", &["\u{11a8}\u{900}"]), ("\u{11a8}\u{308}\u{900}",
+        &["\u{11a8}\u{308}\u{900}"]), ("\u{11a8}\u{94d}", &["\u{11a8}\u{94d}"]),
+        ("\u{11a8}\u{308}\u{94d}", &["\u{11a8}\u{308}\u{94d}"]), ("\u{11a8}\u{200d}",
+        &["\u{11a8}\u{200d}"]), ("\u{11a8}\u{308}\u{200d}", &["\u{11a8}\u{308}\u{200d}"]),
+        ("\u{11a8}\u{378}", &["\u{11a8}", "\u{378}"]), ("\u{11a8}\u{308}\u{378}",
+        &["\u{11a8}\u{308}", "\u{378}"]), ("\u{ac00}\u{20}", &["\u{ac00}", "\u{20}"]),
+        ("\u{ac00}\u{308}\u{20}", &["\u{ac00}\u{308}", "\u{20}"]), ("\u{ac00}\u{d}", &["\u{ac00}",
+        "\u{d}"]), ("\u{ac00}\u{308}\u{d}", &["\u{ac00}\u{308}", "\u{d}"]), ("\u{ac00}\u{a}",
+        &["\u{ac00}", "\u{a}"]), ("\u{ac00}\u{308}\u{a}", &["\u{ac00}\u{308}", "\u{a}"]),
+        ("\u{ac00}\u{1}", &["\u{ac00}", "\u{1}"]), ("\u{ac00}\u{308}\u{1}", &["\u{ac00}\u{308}",
+        "\u{1}"]), ("\u{ac00}\u{200c}", &["\u{ac00}\u{200c}"]), ("\u{ac00}\u{308}\u{200c}",
+        &["\u{ac00}\u{308}\u{200c}"]), ("\u{ac00}\u{1f1e6}", &["\u{ac00}", "\u{1f1e6}"]),
+        ("\u{ac00}\u{308}\u{1f1e6}", &["\u{ac00}\u{308}", "\u{1f1e6}"]), ("\u{ac00}\u{600}",
+        &["\u{ac00}", "\u{600}"]), ("\u{ac00}\u{308}\u{600}", &["\u{ac00}\u{308}", "\u{600}"]),
+        ("\u{ac00}\u{1100}", &["\u{ac00}", "\u{1100}"]), ("\u{ac00}\u{308}\u{1100}",
+        &["\u{ac00}\u{308}", "\u{1100}"]), ("\u{ac00}\u{1160}", &["\u{ac00}\u{1160}"]),
+        ("\u{ac00}\u{308}\u{1160}", &["\u{ac00}\u{308}", "\u{1160}"]), ("\u{ac00}\u{11a8}",
+        &["\u{ac00}\u{11a8}"]), ("\u{ac00}\u{308}\u{11a8}", &["\u{ac00}\u{308}", "\u{11a8}"]),
+        ("\u{ac00}\u{ac00}", &["\u{ac00}", "\u{ac00}"]), ("\u{ac00}\u{308}\u{ac00}",
+        &["\u{ac00}\u{308}", "\u{ac00}"]), ("\u{ac00}\u{ac01}", &["\u{ac00}", "\u{ac01}"]),
+        ("\u{ac00}\u{308}\u{ac01}", &["\u{ac00}\u{308}", "\u{ac01}"]), ("\u{ac00}\u{904}",
+        &["\u{ac00}", "\u{904}"]), ("\u{ac00}\u{308}\u{904}", &["\u{ac00}\u{308}", "\u{904}"]),
+        ("\u{ac00}\u{d4e}", &["\u{ac00}", "\u{d4e}"]), ("\u{ac00}\u{308}\u{d4e}",
+        &["\u{ac00}\u{308}", "\u{d4e}"]), ("\u{ac00}\u{915}", &["\u{ac00}", "\u{915}"]),
+        ("\u{ac00}\u{308}\u{915}", &["\u{ac00}\u{308}", "\u{915}"]), ("\u{ac00}\u{231a}",
+        &["\u{ac00}", "\u{231a}"]), ("\u{ac00}\u{308}\u{231a}", &["\u{ac00}\u{308}", "\u{231a}"]),
+        ("\u{ac00}\u{300}", &["\u{ac00}\u{300}"]), ("\u{ac00}\u{308}\u{300}",
+        &["\u{ac00}\u{308}\u{300}"]), ("\u{ac00}\u{900}", &["\u{ac00}\u{900}"]),
+        ("\u{ac00}\u{308}\u{900}", &["\u{ac00}\u{308}\u{900}"]), ("\u{ac00}\u{94d}",
+        &["\u{ac00}\u{94d}"]), ("\u{ac00}\u{308}\u{94d}", &["\u{ac00}\u{308}\u{94d}"]),
+        ("\u{ac00}\u{200d}", &["\u{ac00}\u{200d}"]), ("\u{ac00}\u{308}\u{200d}",
+        &["\u{ac00}\u{308}\u{200d}"]), ("\u{ac00}\u{378}", &["\u{ac00}", "\u{378}"]),
+        ("\u{ac00}\u{308}\u{378}", &["\u{ac00}\u{308}", "\u{378}"]), ("\u{ac01}\u{20}",
+        &["\u{ac01}", "\u{20}"]), ("\u{ac01}\u{308}\u{20}", &["\u{ac01}\u{308}", "\u{20}"]),
+        ("\u{ac01}\u{d}", &["\u{ac01}", "\u{d}"]), ("\u{ac01}\u{308}\u{d}", &["\u{ac01}\u{308}",
+        "\u{d}"]), ("\u{ac01}\u{a}", &["\u{ac01}", "\u{a}"]), ("\u{ac01}\u{308}\u{a}",
+        &["\u{ac01}\u{308}", "\u{a}"]), ("\u{ac01}\u{1}", &["\u{ac01}", "\u{1}"]),
+        ("\u{ac01}\u{308}\u{1}", &["\u{ac01}\u{308}", "\u{1}"]), ("\u{ac01}\u{200c}",
+        &["\u{ac01}\u{200c}"]), ("\u{ac01}\u{308}\u{200c}", &["\u{ac01}\u{308}\u{200c}"]),
+        ("\u{ac01}\u{1f1e6}", &["\u{ac01}", "\u{1f1e6}"]), ("\u{ac01}\u{308}\u{1f1e6}",
+        &["\u{ac01}\u{308}", "\u{1f1e6}"]), ("\u{ac01}\u{600}", &["\u{ac01}", "\u{600}"]),
+        ("\u{ac01}\u{308}\u{600}", &["\u{ac01}\u{308}", "\u{600}"]), ("\u{ac01}\u{1100}",
+        &["\u{ac01}", "\u{1100}"]), ("\u{ac01}\u{308}\u{1100}", &["\u{ac01}\u{308}", "\u{1100}"]),
+        ("\u{ac01}\u{1160}", &["\u{ac01}", "\u{1160}"]), ("\u{ac01}\u{308}\u{1160}",
+        &["\u{ac01}\u{308}", "\u{1160}"]), ("\u{ac01}\u{11a8}", &["\u{ac01}\u{11a8}"]),
+        ("\u{ac01}\u{308}\u{11a8}", &["\u{ac01}\u{308}", "\u{11a8}"]), ("\u{ac01}\u{ac00}",
+        &["\u{ac01}", "\u{ac00}"]), ("\u{ac01}\u{308}\u{ac00}", &["\u{ac01}\u{308}", "\u{ac00}"]),
+        ("\u{ac01}\u{ac01}", &["\u{ac01}", "\u{ac01}"]), ("\u{ac01}\u{308}\u{ac01}",
+        &["\u{ac01}\u{308}", "\u{ac01}"]), ("\u{ac01}\u{904}", &["\u{ac01}", "\u{904}"]),
+        ("\u{ac01}\u{308}\u{904}", &["\u{ac01}\u{308}", "\u{904}"]), ("\u{ac01}\u{d4e}",
+        &["\u{ac01}", "\u{d4e}"]), ("\u{ac01}\u{308}\u{d4e}", &["\u{ac01}\u{308}", "\u{d4e}"]),
+        ("\u{ac01}\u{915}", &["\u{ac01}", "\u{915}"]), ("\u{ac01}\u{308}\u{915}",
+        &["\u{ac01}\u{308}", "\u{915}"]), ("\u{ac01}\u{231a}", &["\u{ac01}", "\u{231a}"]),
+        ("\u{ac01}\u{308}\u{231a}", &["\u{ac01}\u{308}", "\u{231a}"]), ("\u{ac01}\u{300}",
+        &["\u{ac01}\u{300}"]), ("\u{ac01}\u{308}\u{300}", &["\u{ac01}\u{308}\u{300}"]),
+        ("\u{ac01}\u{900}", &["\u{ac01}\u{900}"]), ("\u{ac01}\u{308}\u{900}",
+        &["\u{ac01}\u{308}\u{900}"]), ("\u{ac01}\u{94d}", &["\u{ac01}\u{94d}"]),
+        ("\u{ac01}\u{308}\u{94d}", &["\u{ac01}\u{308}\u{94d}"]), ("\u{ac01}\u{200d}",
+        &["\u{ac01}\u{200d}"]), ("\u{ac01}\u{308}\u{200d}", &["\u{ac01}\u{308}\u{200d}"]),
+        ("\u{ac01}\u{378}", &["\u{ac01}", "\u{378}"]), ("\u{ac01}\u{308}\u{378}",
+        &["\u{ac01}\u{308}", "\u{378}"]), ("\u{903}\u{20}", &["\u{903}", "\u{20}"]),
+        ("\u{903}\u{308}\u{20}", &["\u{903}\u{308}", "\u{20}"]), ("\u{903}\u{d}", &["\u{903}",
+        "\u{d}"]), ("\u{903}\u{308}\u{d}", &["\u{903}\u{308}", "\u{d}"]), ("\u{903}\u{a}",
+        &["\u{903}", "\u{a}"]), ("\u{903}\u{308}\u{a}", &["\u{903}\u{308}", "\u{a}"]),
+        ("\u{903}\u{1}", &["\u{903}", "\u{1}"]), ("\u{903}\u{308}\u{1}", &["\u{903}\u{308}",
+        "\u{1}"]), ("\u{903}\u{200c}", &["\u{903}\u{200c}"]), ("\u{903}\u{308}\u{200c}",
+        &["\u{903}\u{308}\u{200c}"]), ("\u{903}\u{1f1e6}", &["\u{903}", "\u{1f1e6}"]),
+        ("\u{903}\u{308}\u{1f1e6}", &["\u{903}\u{308}", "\u{1f1e6}"]), ("\u{903}\u{600}",
+        &["\u{903}", "\u{600}"]), ("\u{903}\u{308}\u{600}", &["\u{903}\u{308}", "\u{600}"]),
+        ("\u{903}\u{1100}", &["\u{903}", "\u{1100}"]), ("\u{903}\u{308}\u{1100}",
+        &["\u{903}\u{308}", "\u{1100}"]), ("\u{903}\u{1160}", &["\u{903}", "\u{1160}"]),
+        ("\u{903}\u{308}\u{1160}", &["\u{903}\u{308}", "\u{1160}"]), ("\u{903}\u{11a8}",
+        &["\u{903}", "\u{11a8}"]), ("\u{903}\u{308}\u{11a8}", &["\u{903}\u{308}", "\u{11a8}"]),
+        ("\u{903}\u{ac00}", &["\u{903}", "\u{ac00}"]), ("\u{903}\u{308}\u{ac00}",
+        &["\u{903}\u{308}", "\u{ac00}"]), ("\u{903}\u{ac01}", &["\u{903}", "\u{ac01}"]),
+        ("\u{903}\u{308}\u{ac01}", &["\u{903}\u{308}", "\u{ac01}"]), ("\u{903}\u{904}", &["\u{903}",
+        "\u{904}"]), ("\u{903}\u{308}\u{904}", &["\u{903}\u{308}", "\u{904}"]), ("\u{903}\u{d4e}",
+        &["\u{903}", "\u{d4e}"]), ("\u{903}\u{308}\u{d4e}", &["\u{903}\u{308}", "\u{d4e}"]),
+        ("\u{903}\u{915}", &["\u{903}", "\u{915}"]), ("\u{903}\u{308}\u{915}", &["\u{903}\u{308}",
+        "\u{915}"]), ("\u{903}\u{231a}", &["\u{903}", "\u{231a}"]), ("\u{903}\u{308}\u{231a}",
+        &["\u{903}\u{308}", "\u{231a}"]), ("\u{903}\u{300}", &["\u{903}\u{300}"]),
+        ("\u{903}\u{308}\u{300}", &["\u{903}\u{308}\u{300}"]), ("\u{903}\u{900}",
+        &["\u{903}\u{900}"]), ("\u{903}\u{308}\u{900}", &["\u{903}\u{308}\u{900}"]),
+        ("\u{903}\u{94d}", &["\u{903}\u{94d}"]), ("\u{903}\u{308}\u{94d}",
+        &["\u{903}\u{308}\u{94d}"]), ("\u{903}\u{200d}", &["\u{903}\u{200d}"]),
+        ("\u{903}\u{308}\u{200d}", &["\u{903}\u{308}\u{200d}"]), ("\u{903}\u{378}", &["\u{903}",
+        "\u{378}"]), ("\u{903}\u{308}\u{378}", &["\u{903}\u{308}", "\u{378}"]), ("\u{904}\u{20}",
+        &["\u{904}", "\u{20}"]), ("\u{904}\u{308}\u{20}", &["\u{904}\u{308}", "\u{20}"]),
+        ("\u{904}\u{d}", &["\u{904}", "\u{d}"]), ("\u{904}\u{308}\u{d}", &["\u{904}\u{308}",
+        "\u{d}"]), ("\u{904}\u{a}", &["\u{904}", "\u{a}"]), ("\u{904}\u{308}\u{a}",
+        &["\u{904}\u{308}", "\u{a}"]), ("\u{904}\u{1}", &["\u{904}", "\u{1}"]),
+        ("\u{904}\u{308}\u{1}", &["\u{904}\u{308}", "\u{1}"]), ("\u{904}\u{200c}",
+        &["\u{904}\u{200c}"]), ("\u{904}\u{308}\u{200c}", &["\u{904}\u{308}\u{200c}"]),
+        ("\u{904}\u{1f1e6}", &["\u{904}", "\u{1f1e6}"]), ("\u{904}\u{308}\u{1f1e6}",
+        &["\u{904}\u{308}", "\u{1f1e6}"]), ("\u{904}\u{600}", &["\u{904}", "\u{600}"]),
+        ("\u{904}\u{308}\u{600}", &["\u{904}\u{308}", "\u{600}"]), ("\u{904}\u{1100}", &["\u{904}",
+        "\u{1100}"]), ("\u{904}\u{308}\u{1100}", &["\u{904}\u{308}", "\u{1100}"]),
+        ("\u{904}\u{1160}", &["\u{904}", "\u{1160}"]), ("\u{904}\u{308}\u{1160}",
+        &["\u{904}\u{308}", "\u{1160}"]), ("\u{904}\u{11a8}", &["\u{904}", "\u{11a8}"]),
+        ("\u{904}\u{308}\u{11a8}", &["\u{904}\u{308}", "\u{11a8}"]), ("\u{904}\u{ac00}",
+        &["\u{904}", "\u{ac00}"]), ("\u{904}\u{308}\u{ac00}", &["\u{904}\u{308}", "\u{ac00}"]),
+        ("\u{904}\u{ac01}", &["\u{904}", "\u{ac01}"]), ("\u{904}\u{308}\u{ac01}",
+        &["\u{904}\u{308}", "\u{ac01}"]), ("\u{904}\u{904}", &["\u{904}", "\u{904}"]),
+        ("\u{904}\u{308}\u{904}", &["\u{904}\u{308}", "\u{904}"]), ("\u{904}\u{d4e}", &["\u{904}",
+        "\u{d4e}"]), ("\u{904}\u{308}\u{d4e}", &["\u{904}\u{308}", "\u{d4e}"]), ("\u{904}\u{915}",
+        &["\u{904}", "\u{915}"]), ("\u{904}\u{308}\u{915}", &["\u{904}\u{308}", "\u{915}"]),
+        ("\u{904}\u{231a}", &["\u{904}", "\u{231a}"]), ("\u{904}\u{308}\u{231a}",
+        &["\u{904}\u{308}", "\u{231a}"]), ("\u{904}\u{300}", &["\u{904}\u{300}"]),
+        ("\u{904}\u{308}\u{300}", &["\u{904}\u{308}\u{300}"]), ("\u{904}\u{900}",
+        &["\u{904}\u{900}"]), ("\u{904}\u{308}\u{900}", &["\u{904}\u{308}\u{900}"]),
+        ("\u{904}\u{94d}", &["\u{904}\u{94d}"]), ("\u{904}\u{308}\u{94d}",
+        &["\u{904}\u{308}\u{94d}"]), ("\u{904}\u{200d}", &["\u{904}\u{200d}"]),
+        ("\u{904}\u{308}\u{200d}", &["\u{904}\u{308}\u{200d}"]), ("\u{904}\u{378}", &["\u{904}",
+        "\u{378}"]), ("\u{904}\u{308}\u{378}", &["\u{904}\u{308}", "\u{378}"]),
+        ("\u{d4e}\u{308}\u{20}", &["\u{d4e}\u{308}", "\u{20}"]), ("\u{d4e}\u{d}", &["\u{d4e}",
+        "\u{d}"]), ("\u{d4e}\u{308}\u{d}", &["\u{d4e}\u{308}", "\u{d}"]), ("\u{d4e}\u{a}",
+        &["\u{d4e}", "\u{a}"]), ("\u{d4e}\u{308}\u{a}", &["\u{d4e}\u{308}", "\u{a}"]),
+        ("\u{d4e}\u{1}", &["\u{d4e}", "\u{1}"]), ("\u{d4e}\u{308}\u{1}", &["\u{d4e}\u{308}",
+        "\u{1}"]), ("\u{d4e}\u{200c}", &["\u{d4e}\u{200c}"]), ("\u{d4e}\u{308}\u{200c}",
+        &["\u{d4e}\u{308}\u{200c}"]), ("\u{d4e}\u{308}\u{1f1e6}", &["\u{d4e}\u{308}", "\u{1f1e6}"]),
+        ("\u{d4e}\u{308}\u{600}", &["\u{d4e}\u{308}", "\u{600}"]), ("\u{d4e}\u{308}\u{1100}",
+        &["\u{d4e}\u{308}", "\u{1100}"]), ("\u{d4e}\u{308}\u{1160}", &["\u{d4e}\u{308}",
+        "\u{1160}"]), ("\u{d4e}\u{308}\u{11a8}", &["\u{d4e}\u{308}", "\u{11a8}"]),
+        ("\u{d4e}\u{308}\u{ac00}", &["\u{d4e}\u{308}", "\u{ac00}"]), ("\u{d4e}\u{308}\u{ac01}",
+        &["\u{d4e}\u{308}", "\u{ac01}"]), ("\u{d4e}\u{308}\u{904}", &["\u{d4e}\u{308}", "\u{904}"]),
+        ("\u{d4e}\u{308}\u{d4e}", &["\u{d4e}\u{308}", "\u{d4e}"]), ("\u{d4e}\u{308}\u{915}",
+        &["\u{d4e}\u{308}", "\u{915}"]), ("\u{d4e}\u{308}\u{231a}", &["\u{d4e}\u{308}",
+        "\u{231a}"]), ("\u{d4e}\u{300}", &["\u{d4e}\u{300}"]), ("\u{d4e}\u{308}\u{300}",
+        &["\u{d4e}\u{308}\u{300}"]), ("\u{d4e}\u{900}", &["\u{d4e}\u{900}"]),
+        ("\u{d4e}\u{308}\u{900}", &["\u{d4e}\u{308}\u{900}"]), ("\u{d4e}\u{94d}",
+        &["\u{d4e}\u{94d}"]), ("\u{d4e}\u{308}\u{94d}", &["\u{d4e}\u{308}\u{94d}"]),
+        ("\u{d4e}\u{200d}", &["\u{d4e}\u{200d}"]), ("\u{d4e}\u{308}\u{200d}",
+        &["\u{d4e}\u{308}\u{200d}"]), ("\u{d4e}\u{308}\u{378}", &["\u{d4e}\u{308}", "\u{378}"]),
+        ("\u{915}\u{20}", &["\u{915}", "\u{20}"]), ("\u{915}\u{308}\u{20}", &["\u{915}\u{308}",
+        "\u{20}"]), ("\u{915}\u{d}", &["\u{915}", "\u{d}"]), ("\u{915}\u{308}\u{d}",
+        &["\u{915}\u{308}", "\u{d}"]), ("\u{915}\u{a}", &["\u{915}", "\u{a}"]),
+        ("\u{915}\u{308}\u{a}", &["\u{915}\u{308}", "\u{a}"]), ("\u{915}\u{1}", &["\u{915}",
+        "\u{1}"]), ("\u{915}\u{308}\u{1}", &["\u{915}\u{308}", "\u{1}"]), ("\u{915}\u{200c}",
+        &["\u{915}\u{200c}"]), ("\u{915}\u{308}\u{200c}", &["\u{915}\u{308}\u{200c}"]),
+        ("\u{915}\u{1f1e6}", &["\u{915}", "\u{1f1e6}"]), ("\u{915}\u{308}\u{1f1e6}",
+        &["\u{915}\u{308}", "\u{1f1e6}"]), ("\u{915}\u{600}", &["\u{915}", "\u{600}"]),
+        ("\u{915}\u{308}\u{600}", &["\u{915}\u{308}", "\u{600}"]), ("\u{915}\u{1100}", &["\u{915}",
+        "\u{1100}"]), ("\u{915}\u{308}\u{1100}", &["\u{915}\u{308}", "\u{1100}"]),
+        ("\u{915}\u{1160}", &["\u{915}", "\u{1160}"]), ("\u{915}\u{308}\u{1160}",
+        &["\u{915}\u{308}", "\u{1160}"]), ("\u{915}\u{11a8}", &["\u{915}", "\u{11a8}"]),
+        ("\u{915}\u{308}\u{11a8}", &["\u{915}\u{308}", "\u{11a8}"]), ("\u{915}\u{ac00}",
+        &["\u{915}", "\u{ac00}"]), ("\u{915}\u{308}\u{ac00}", &["\u{915}\u{308}", "\u{ac00}"]),
+        ("\u{915}\u{ac01}", &["\u{915}", "\u{ac01}"]), ("\u{915}\u{308}\u{ac01}",
+        &["\u{915}\u{308}", "\u{ac01}"]), ("\u{915}\u{904}", &["\u{915}", "\u{904}"]),
+        ("\u{915}\u{308}\u{904}", &["\u{915}\u{308}", "\u{904}"]), ("\u{915}\u{d4e}", &["\u{915}",
+        "\u{d4e}"]), ("\u{915}\u{308}\u{d4e}", &["\u{915}\u{308}", "\u{d4e}"]), ("\u{915}\u{915}",
+        &["\u{915}", "\u{915}"]), ("\u{915}\u{308}\u{915}", &["\u{915}\u{308}", "\u{915}"]),
+        ("\u{915}\u{231a}", &["\u{915}", "\u{231a}"]), ("\u{915}\u{308}\u{231a}",
+        &["\u{915}\u{308}", "\u{231a}"]), ("\u{915}\u{300}", &["\u{915}\u{300}"]),
+        ("\u{915}\u{308}\u{300}", &["\u{915}\u{308}\u{300}"]), ("\u{915}\u{900}",
+        &["\u{915}\u{900}"]), ("\u{915}\u{308}\u{900}", &["\u{915}\u{308}\u{900}"]),
+        ("\u{915}\u{94d}", &["\u{915}\u{94d}"]), ("\u{915}\u{308}\u{94d}",
+        &["\u{915}\u{308}\u{94d}"]), ("\u{915}\u{200d}", &["\u{915}\u{200d}"]),
+        ("\u{915}\u{308}\u{200d}", &["\u{915}\u{308}\u{200d}"]), ("\u{915}\u{378}", &["\u{915}",
+        "\u{378}"]), ("\u{915}\u{308}\u{378}", &["\u{915}\u{308}", "\u{378}"]), ("\u{231a}\u{20}",
+        &["\u{231a}", "\u{20}"]), ("\u{231a}\u{308}\u{20}", &["\u{231a}\u{308}", "\u{20}"]),
+        ("\u{231a}\u{d}", &["\u{231a}", "\u{d}"]), ("\u{231a}\u{308}\u{d}", &["\u{231a}\u{308}",
+        "\u{d}"]), ("\u{231a}\u{a}", &["\u{231a}", "\u{a}"]), ("\u{231a}\u{308}\u{a}",
+        &["\u{231a}\u{308}", "\u{a}"]), ("\u{231a}\u{1}", &["\u{231a}", "\u{1}"]),
+        ("\u{231a}\u{308}\u{1}", &["\u{231a}\u{308}", "\u{1}"]), ("\u{231a}\u{200c}",
+        &["\u{231a}\u{200c}"]), ("\u{231a}\u{308}\u{200c}", &["\u{231a}\u{308}\u{200c}"]),
+        ("\u{231a}\u{1f1e6}", &["\u{231a}", "\u{1f1e6}"]), ("\u{231a}\u{308}\u{1f1e6}",
+        &["\u{231a}\u{308}", "\u{1f1e6}"]), ("\u{231a}\u{600}", &["\u{231a}", "\u{600}"]),
+        ("\u{231a}\u{308}\u{600}", &["\u{231a}\u{308}", "\u{600}"]), ("\u{231a}\u{1100}",
+        &["\u{231a}", "\u{1100}"]), ("\u{231a}\u{308}\u{1100}", &["\u{231a}\u{308}", "\u{1100}"]),
+        ("\u{231a}\u{1160}", &["\u{231a}", "\u{1160}"]), ("\u{231a}\u{308}\u{1160}",
+        &["\u{231a}\u{308}", "\u{1160}"]), ("\u{231a}\u{11a8}", &["\u{231a}", "\u{11a8}"]),
+        ("\u{231a}\u{308}\u{11a8}", &["\u{231a}\u{308}", "\u{11a8}"]), ("\u{231a}\u{ac00}",
+        &["\u{231a}", "\u{ac00}"]), ("\u{231a}\u{308}\u{ac00}", &["\u{231a}\u{308}", "\u{ac00}"]),
+        ("\u{231a}\u{ac01}", &["\u{231a}", "\u{ac01}"]), ("\u{231a}\u{308}\u{ac01}",
+        &["\u{231a}\u{308}", "\u{ac01}"]), ("\u{231a}\u{904}", &["\u{231a}", "\u{904}"]),
+        ("\u{231a}\u{308}\u{904}", &["\u{231a}\u{308}", "\u{904}"]), ("\u{231a}\u{d4e}",
+        &["\u{231a}", "\u{d4e}"]), ("\u{231a}\u{308}\u{d4e}", &["\u{231a}\u{308}", "\u{d4e}"]),
+        ("\u{231a}\u{915}", &["\u{231a}", "\u{915}"]), ("\u{231a}\u{308}\u{915}",
+        &["\u{231a}\u{308}", "\u{915}"]), ("\u{231a}\u{231a}", &["\u{231a}", "\u{231a}"]),
+        ("\u{231a}\u{308}\u{231a}", &["\u{231a}\u{308}", "\u{231a}"]), ("\u{231a}\u{300}",
+        &["\u{231a}\u{300}"]), ("\u{231a}\u{308}\u{300}", &["\u{231a}\u{308}\u{300}"]),
+        ("\u{231a}\u{900}", &["\u{231a}\u{900}"]), ("\u{231a}\u{308}\u{900}",
+        &["\u{231a}\u{308}\u{900}"]), ("\u{231a}\u{94d}", &["\u{231a}\u{94d}"]),
+        ("\u{231a}\u{308}\u{94d}", &["\u{231a}\u{308}\u{94d}"]), ("\u{231a}\u{200d}",
+        &["\u{231a}\u{200d}"]), ("\u{231a}\u{308}\u{200d}", &["\u{231a}\u{308}\u{200d}"]),
+        ("\u{231a}\u{378}", &["\u{231a}", "\u{378}"]), ("\u{231a}\u{308}\u{378}",
+        &["\u{231a}\u{308}", "\u{378}"]), ("\u{300}\u{20}", &["\u{300}", "\u{20}"]),
+        ("\u{300}\u{308}\u{20}", &["\u{300}\u{308}", "\u{20}"]), ("\u{300}\u{d}", &["\u{300}",
+        "\u{d}"]), ("\u{300}\u{308}\u{d}", &["\u{300}\u{308}", "\u{d}"]), ("\u{300}\u{a}",
+        &["\u{300}", "\u{a}"]), ("\u{300}\u{308}\u{a}", &["\u{300}\u{308}", "\u{a}"]),
+        ("\u{300}\u{1}", &["\u{300}", "\u{1}"]), ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}",
+        "\u{1}"]), ("\u{300}\u{200c}", &["\u{300}\u{200c}"]), ("\u{300}\u{308}\u{200c}",
+        &["\u{300}\u{308}\u{200c}"]), ("\u{300}\u{1f1e6}", &["\u{300}", "\u{1f1e6}"]),
+        ("\u{300}\u{308}\u{1f1e6}", &["\u{300}\u{308}", "\u{1f1e6}"]), ("\u{300}\u{600}",
+        &["\u{300}", "\u{600}"]), ("\u{300}\u{308}\u{600}", &["\u{300}\u{308}", "\u{600}"]),
+        ("\u{300}\u{1100}", &["\u{300}", "\u{1100}"]), ("\u{300}\u{308}\u{1100}",
+        &["\u{300}\u{308}", "\u{1100}"]), ("\u{300}\u{1160}", &["\u{300}", "\u{1160}"]),
+        ("\u{300}\u{308}\u{1160}", &["\u{300}\u{308}", "\u{1160}"]), ("\u{300}\u{11a8}",
+        &["\u{300}", "\u{11a8}"]), ("\u{300}\u{308}\u{11a8}", &["\u{300}\u{308}", "\u{11a8}"]),
+        ("\u{300}\u{ac00}", &["\u{300}", "\u{ac00}"]), ("\u{300}\u{308}\u{ac00}",
+        &["\u{300}\u{308}", "\u{ac00}"]), ("\u{300}\u{ac01}", &["\u{300}", "\u{ac01}"]),
+        ("\u{300}\u{308}\u{ac01}", &["\u{300}\u{308}", "\u{ac01}"]), ("\u{300}\u{904}", &["\u{300}",
+        "\u{904}"]), ("\u{300}\u{308}\u{904}", &["\u{300}\u{308}", "\u{904}"]), ("\u{300}\u{d4e}",
+        &["\u{300}", "\u{d4e}"]), ("\u{300}\u{308}\u{d4e}", &["\u{300}\u{308}", "\u{d4e}"]),
+        ("\u{300}\u{915}", &["\u{300}", "\u{915}"]), ("\u{300}\u{308}\u{915}", &["\u{300}\u{308}",
+        "\u{915}"]), ("\u{300}\u{231a}", &["\u{300}", "\u{231a}"]), ("\u{300}\u{308}\u{231a}",
+        &["\u{300}\u{308}", "\u{231a}"]), ("\u{300}\u{300}", &["\u{300}\u{300}"]),
+        ("\u{300}\u{308}\u{300}", &["\u{300}\u{308}\u{300}"]), ("\u{300}\u{900}",
+        &["\u{300}\u{900}"]), ("\u{300}\u{308}\u{900}", &["\u{300}\u{308}\u{900}"]),
+        ("\u{300}\u{94d}", &["\u{300}\u{94d}"]), ("\u{300}\u{308}\u{94d}",
+        &["\u{300}\u{308}\u{94d}"]), ("\u{300}\u{200d}", &["\u{300}\u{200d}"]),
+        ("\u{300}\u{308}\u{200d}", &["\u{300}\u{308}\u{200d}"]), ("\u{300}\u{378}", &["\u{300}",
+        "\u{378}"]), ("\u{300}\u{308}\u{378}", &["\u{300}\u{308}", "\u{378}"]), ("\u{900}\u{20}",
+        &["\u{900}", "\u{20}"]), ("\u{900}\u{308}\u{20}", &["\u{900}\u{308}", "\u{20}"]),
+        ("\u{900}\u{d}", &["\u{900}", "\u{d}"]), ("\u{900}\u{308}\u{d}", &["\u{900}\u{308}",
+        "\u{d}"]), ("\u{900}\u{a}", &["\u{900}", "\u{a}"]), ("\u{900}\u{308}\u{a}",
+        &["\u{900}\u{308}", "\u{a}"]), ("\u{900}\u{1}", &["\u{900}", "\u{1}"]),
+        ("\u{900}\u{308}\u{1}", &["\u{900}\u{308}", "\u{1}"]), ("\u{900}\u{200c}",
+        &["\u{900}\u{200c}"]), ("\u{900}\u{308}\u{200c}", &["\u{900}\u{308}\u{200c}"]),
+        ("\u{900}\u{1f1e6}", &["\u{900}", "\u{1f1e6}"]), ("\u{900}\u{308}\u{1f1e6}",
+        &["\u{900}\u{308}", "\u{1f1e6}"]), ("\u{900}\u{600}", &["\u{900}", "\u{600}"]),
+        ("\u{900}\u{308}\u{600}", &["\u{900}\u{308}", "\u{600}"]), ("\u{900}\u{1100}", &["\u{900}",
+        "\u{1100}"]), ("\u{900}\u{308}\u{1100}", &["\u{900}\u{308}", "\u{1100}"]),
+        ("\u{900}\u{1160}", &["\u{900}", "\u{1160}"]), ("\u{900}\u{308}\u{1160}",
+        &["\u{900}\u{308}", "\u{1160}"]), ("\u{900}\u{11a8}", &["\u{900}", "\u{11a8}"]),
+        ("\u{900}\u{308}\u{11a8}", &["\u{900}\u{308}", "\u{11a8}"]), ("\u{900}\u{ac00}",
+        &["\u{900}", "\u{ac00}"]), ("\u{900}\u{308}\u{ac00}", &["\u{900}\u{308}", "\u{ac00}"]),
+        ("\u{900}\u{ac01}", &["\u{900}", "\u{ac01}"]), ("\u{900}\u{308}\u{ac01}",
+        &["\u{900}\u{308}", "\u{ac01}"]), ("\u{900}\u{904}", &["\u{900}", "\u{904}"]),
+        ("\u{900}\u{308}\u{904}", &["\u{900}\u{308}", "\u{904}"]), ("\u{900}\u{d4e}", &["\u{900}",
+        "\u{d4e}"]), ("\u{900}\u{308}\u{d4e}", &["\u{900}\u{308}", "\u{d4e}"]), ("\u{900}\u{915}",
+        &["\u{900}", "\u{915}"]), ("\u{900}\u{308}\u{915}", &["\u{900}\u{308}", "\u{915}"]),
+        ("\u{900}\u{231a}", &["\u{900}", "\u{231a}"]), ("\u{900}\u{308}\u{231a}",
+        &["\u{900}\u{308}", "\u{231a}"]), ("\u{900}\u{300}", &["\u{900}\u{300}"]),
+        ("\u{900}\u{308}\u{300}", &["\u{900}\u{308}\u{300}"]), ("\u{900}\u{900}",
+        &["\u{900}\u{900}"]), ("\u{900}\u{308}\u{900}", &["\u{900}\u{308}\u{900}"]),
+        ("\u{900}\u{94d}", &["\u{900}\u{94d}"]), ("\u{900}\u{308}\u{94d}",
+        &["\u{900}\u{308}\u{94d}"]), ("\u{900}\u{200d}", &["\u{900}\u{200d}"]),
+        ("\u{900}\u{308}\u{200d}", &["\u{900}\u{308}\u{200d}"]), ("\u{900}\u{378}", &["\u{900}",
+        "\u{378}"]), ("\u{900}\u{308}\u{378}", &["\u{900}\u{308}", "\u{378}"]), ("\u{94d}\u{20}",
+        &["\u{94d}", "\u{20}"]), ("\u{94d}\u{308}\u{20}", &["\u{94d}\u{308}", "\u{20}"]),
+        ("\u{94d}\u{d}", &["\u{94d}", "\u{d}"]), ("\u{94d}\u{308}\u{d}", &["\u{94d}\u{308}",
+        "\u{d}"]), ("\u{94d}\u{a}", &["\u{94d}", "\u{a}"]), ("\u{94d}\u{308}\u{a}",
+        &["\u{94d}\u{308}", "\u{a}"]), ("\u{94d}\u{1}", &["\u{94d}", "\u{1}"]),
+        ("\u{94d}\u{308}\u{1}", &["\u{94d}\u{308}", "\u{1}"]), ("\u{94d}\u{200c}",
+        &["\u{94d}\u{200c}"]), ("\u{94d}\u{308}\u{200c}", &["\u{94d}\u{308}\u{200c}"]),
+        ("\u{94d}\u{1f1e6}", &["\u{94d}", "\u{1f1e6}"]), ("\u{94d}\u{308}\u{1f1e6}",
+        &["\u{94d}\u{308}", "\u{1f1e6}"]), ("\u{94d}\u{600}", &["\u{94d}", "\u{600}"]),
+        ("\u{94d}\u{308}\u{600}", &["\u{94d}\u{308}", "\u{600}"]), ("\u{94d}\u{1100}", &["\u{94d}",
+        "\u{1100}"]), ("\u{94d}\u{308}\u{1100}", &["\u{94d}\u{308}", "\u{1100}"]),
+        ("\u{94d}\u{1160}", &["\u{94d}", "\u{1160}"]), ("\u{94d}\u{308}\u{1160}",
+        &["\u{94d}\u{308}", "\u{1160}"]), ("\u{94d}\u{11a8}", &["\u{94d}", "\u{11a8}"]),
+        ("\u{94d}\u{308}\u{11a8}", &["\u{94d}\u{308}", "\u{11a8}"]), ("\u{94d}\u{ac00}",
+        &["\u{94d}", "\u{ac00}"]), ("\u{94d}\u{308}\u{ac00}", &["\u{94d}\u{308}", "\u{ac00}"]),
+        ("\u{94d}\u{ac01}", &["\u{94d}", "\u{ac01}"]), ("\u{94d}\u{308}\u{ac01}",
+        &["\u{94d}\u{308}", "\u{ac01}"]), ("\u{94d}\u{904}", &["\u{94d}", "\u{904}"]),
+        ("\u{94d}\u{308}\u{904}", &["\u{94d}\u{308}", "\u{904}"]), ("\u{94d}\u{d4e}", &["\u{94d}",
+        "\u{d4e}"]), ("\u{94d}\u{308}\u{d4e}", &["\u{94d}\u{308}", "\u{d4e}"]), ("\u{94d}\u{915}",
+        &["\u{94d}", "\u{915}"]), ("\u{94d}\u{308}\u{915}", &["\u{94d}\u{308}", "\u{915}"]),
+        ("\u{94d}\u{231a}", &["\u{94d}", "\u{231a}"]), ("\u{94d}\u{308}\u{231a}",
+        &["\u{94d}\u{308}", "\u{231a}"]), ("\u{94d}\u{300}", &["\u{94d}\u{300}"]),
+        ("\u{94d}\u{308}\u{300}", &["\u{94d}\u{308}\u{300}"]), ("\u{94d}\u{900}",
+        &["\u{94d}\u{900}"]), ("\u{94d}\u{308}\u{900}", &["\u{94d}\u{308}\u{900}"]),
+        ("\u{94d}\u{94d}", &["\u{94d}\u{94d}"]), ("\u{94d}\u{308}\u{94d}",
+        &["\u{94d}\u{308}\u{94d}"]), ("\u{94d}\u{200d}", &["\u{94d}\u{200d}"]),
+        ("\u{94d}\u{308}\u{200d}", &["\u{94d}\u{308}\u{200d}"]), ("\u{94d}\u{378}", &["\u{94d}",
+        "\u{378}"]), ("\u{94d}\u{308}\u{378}", &["\u{94d}\u{308}", "\u{378}"]), ("\u{200d}\u{20}",
+        &["\u{200d}", "\u{20}"]), ("\u{200d}\u{308}\u{20}", &["\u{200d}\u{308}", "\u{20}"]),
+        ("\u{200d}\u{d}", &["\u{200d}", "\u{d}"]), ("\u{200d}\u{308}\u{d}", &["\u{200d}\u{308}",
+        "\u{d}"]), ("\u{200d}\u{a}", &["\u{200d}", "\u{a}"]), ("\u{200d}\u{308}\u{a}",
+        &["\u{200d}\u{308}", "\u{a}"]), ("\u{200d}\u{1}", &["\u{200d}", "\u{1}"]),
+        ("\u{200d}\u{308}\u{1}", &["\u{200d}\u{308}", "\u{1}"]), ("\u{200d}\u{200c}",
+        &["\u{200d}\u{200c}"]), ("\u{200d}\u{308}\u{200c}", &["\u{200d}\u{308}\u{200c}"]),
+        ("\u{200d}\u{1f1e6}", &["\u{200d}", "\u{1f1e6}"]), ("\u{200d}\u{308}\u{1f1e6}",
+        &["\u{200d}\u{308}", "\u{1f1e6}"]), ("\u{200d}\u{600}", &["\u{200d}", "\u{600}"]),
+        ("\u{200d}\u{308}\u{600}", &["\u{200d}\u{308}", "\u{600}"]), ("\u{200d}\u{1100}",
+        &["\u{200d}", "\u{1100}"]), ("\u{200d}\u{308}\u{1100}", &["\u{200d}\u{308}", "\u{1100}"]),
+        ("\u{200d}\u{1160}", &["\u{200d}", "\u{1160}"]), ("\u{200d}\u{308}\u{1160}",
+        &["\u{200d}\u{308}", "\u{1160}"]), ("\u{200d}\u{11a8}", &["\u{200d}", "\u{11a8}"]),
+        ("\u{200d}\u{308}\u{11a8}", &["\u{200d}\u{308}", "\u{11a8}"]), ("\u{200d}\u{ac00}",
+        &["\u{200d}", "\u{ac00}"]), ("\u{200d}\u{308}\u{ac00}", &["\u{200d}\u{308}", "\u{ac00}"]),
+        ("\u{200d}\u{ac01}", &["\u{200d}", "\u{ac01}"]), ("\u{200d}\u{308}\u{ac01}",
+        &["\u{200d}\u{308}", "\u{ac01}"]), ("\u{200d}\u{904}", &["\u{200d}", "\u{904}"]),
+        ("\u{200d}\u{308}\u{904}", &["\u{200d}\u{308}", "\u{904}"]), ("\u{200d}\u{d4e}",
+        &["\u{200d}", "\u{d4e}"]), ("\u{200d}\u{308}\u{d4e}", &["\u{200d}\u{308}", "\u{d4e}"]),
+        ("\u{200d}\u{915}", &["\u{200d}", "\u{915}"]), ("\u{200d}\u{308}\u{915}",
+        &["\u{200d}\u{308}", "\u{915}"]), ("\u{200d}\u{231a}", &["\u{200d}", "\u{231a}"]),
+        ("\u{200d}\u{308}\u{231a}", &["\u{200d}\u{308}", "\u{231a}"]), ("\u{200d}\u{300}",
+        &["\u{200d}\u{300}"]), ("\u{200d}\u{308}\u{300}", &["\u{200d}\u{308}\u{300}"]),
+        ("\u{200d}\u{900}", &["\u{200d}\u{900}"]), ("\u{200d}\u{308}\u{900}",
+        &["\u{200d}\u{308}\u{900}"]), ("\u{200d}\u{94d}", &["\u{200d}\u{94d}"]),
+        ("\u{200d}\u{308}\u{94d}", &["\u{200d}\u{308}\u{94d}"]), ("\u{200d}\u{200d}",
+        &["\u{200d}\u{200d}"]), ("\u{200d}\u{308}\u{200d}", &["\u{200d}\u{308}\u{200d}"]),
+        ("\u{200d}\u{378}", &["\u{200d}", "\u{378}"]), ("\u{200d}\u{308}\u{378}",
+        &["\u{200d}\u{308}", "\u{378}"]), ("\u{378}\u{20}", &["\u{378}", "\u{20}"]),
+        ("\u{378}\u{308}\u{20}", &["\u{378}\u{308}", "\u{20}"]), ("\u{378}\u{d}", &["\u{378}",
+        "\u{d}"]), ("\u{378}\u{308}\u{d}", &["\u{378}\u{308}", "\u{d}"]), ("\u{378}\u{a}",
+        &["\u{378}", "\u{a}"]), ("\u{378}\u{308}\u{a}", &["\u{378}\u{308}", "\u{a}"]),
+        ("\u{378}\u{1}", &["\u{378}", "\u{1}"]), ("\u{378}\u{308}\u{1}", &["\u{378}\u{308}",
+        "\u{1}"]), ("\u{378}\u{200c}", &["\u{378}\u{200c}"]), ("\u{378}\u{308}\u{200c}",
+        &["\u{378}\u{308}\u{200c}"]), ("\u{378}\u{1f1e6}", &["\u{378}", "\u{1f1e6}"]),
+        ("\u{378}\u{308}\u{1f1e6}", &["\u{378}\u{308}", "\u{1f1e6}"]), ("\u{378}\u{600}",
+        &["\u{378}", "\u{600}"]), ("\u{378}\u{308}\u{600}", &["\u{378}\u{308}", "\u{600}"]),
+        ("\u{378}\u{1100}", &["\u{378}", "\u{1100}"]), ("\u{378}\u{308}\u{1100}",
+        &["\u{378}\u{308}", "\u{1100}"]), ("\u{378}\u{1160}", &["\u{378}", "\u{1160}"]),
+        ("\u{378}\u{308}\u{1160}", &["\u{378}\u{308}", "\u{1160}"]), ("\u{378}\u{11a8}",
+        &["\u{378}", "\u{11a8}"]), ("\u{378}\u{308}\u{11a8}", &["\u{378}\u{308}", "\u{11a8}"]),
+        ("\u{378}\u{ac00}", &["\u{378}", "\u{ac00}"]), ("\u{378}\u{308}\u{ac00}",
+        &["\u{378}\u{308}", "\u{ac00}"]), ("\u{378}\u{ac01}", &["\u{378}", "\u{ac01}"]),
+        ("\u{378}\u{308}\u{ac01}", &["\u{378}\u{308}", "\u{ac01}"]), ("\u{378}\u{904}", &["\u{378}",
+        "\u{904}"]), ("\u{378}\u{308}\u{904}", &["\u{378}\u{308}", "\u{904}"]), ("\u{378}\u{d4e}",
+        &["\u{378}", "\u{d4e}"]), ("\u{378}\u{308}\u{d4e}", &["\u{378}\u{308}", "\u{d4e}"]),
+        ("\u{378}\u{915}", &["\u{378}", "\u{915}"]), ("\u{378}\u{308}\u{915}", &["\u{378}\u{308}",
+        "\u{915}"]), ("\u{378}\u{231a}", &["\u{378}", "\u{231a}"]), ("\u{378}\u{308}\u{231a}",
+        &["\u{378}\u{308}", "\u{231a}"]), ("\u{378}\u{300}", &["\u{378}\u{300}"]),
+        ("\u{378}\u{308}\u{300}", &["\u{378}\u{308}\u{300}"]), ("\u{378}\u{900}",
+        &["\u{378}\u{900}"]), ("\u{378}\u{308}\u{900}", &["\u{378}\u{308}\u{900}"]),
+        ("\u{378}\u{94d}", &["\u{378}\u{94d}"]), ("\u{378}\u{308}\u{94d}",
+        &["\u{378}\u{308}\u{94d}"]), ("\u{378}\u{200d}", &["\u{378}\u{200d}"]),
+        ("\u{378}\u{308}\u{200d}", &["\u{378}\u{308}\u{200d}"]), ("\u{378}\u{378}", &["\u{378}",
+        "\u{378}"]), ("\u{378}\u{308}\u{378}", &["\u{378}\u{308}", "\u{378}"]),
+        ("\u{d}\u{a}\u{61}\u{a}\u{308}", &["\u{d}\u{a}", "\u{61}", "\u{a}", "\u{308}"]),
+        ("\u{61}\u{308}", &["\u{61}\u{308}"]), ("\u{20}\u{200d}\u{646}", &["\u{20}\u{200d}",
+        "\u{646}"]), ("\u{646}\u{200d}\u{20}", &["\u{646}\u{200d}", "\u{20}"]), ("\u{1100}\u{1100}",
+        &["\u{1100}\u{1100}"]), ("\u{ac00}\u{11a8}\u{1100}", &["\u{ac00}\u{11a8}", "\u{1100}"]),
+        ("\u{ac01}\u{11a8}\u{1100}", &["\u{ac01}\u{11a8}", "\u{1100}"]),
+        ("\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}", &["\u{1f1e6}\u{1f1e7}", "\u{1f1e8}", "\u{62}"]),
+        ("\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}", &["\u{61}", "\u{1f1e6}\u{1f1e7}", "\u{1f1e8}",
+        "\u{62}"]), ("\u{61}\u{1f1e6}\u{1f1e7}\u{200d}\u{1f1e8}\u{62}", &["\u{61}",
+        "\u{1f1e6}\u{1f1e7}\u{200d}", "\u{1f1e8}", "\u{62}"]),
+        ("\u{61}\u{1f1e6}\u{200d}\u{1f1e7}\u{1f1e8}\u{62}", &["\u{61}", "\u{1f1e6}\u{200d}",
+        "\u{1f1e7}\u{1f1e8}", "\u{62}"]), ("\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{1f1e9}\u{62}",
+        &["\u{61}", "\u{1f1e6}\u{1f1e7}", "\u{1f1e8}\u{1f1e9}", "\u{62}"]), ("\u{61}\u{200d}",
+        &["\u{61}\u{200d}"]), ("\u{61}\u{308}\u{62}", &["\u{61}\u{308}", "\u{62}"]),
+        ("\u{1f476}\u{1f3ff}\u{1f476}", &["\u{1f476}\u{1f3ff}", "\u{1f476}"]),
+        ("\u{61}\u{1f3ff}\u{1f476}", &["\u{61}\u{1f3ff}", "\u{1f476}"]),
+        ("\u{61}\u{1f3ff}\u{1f476}\u{200d}\u{1f6d1}", &["\u{61}\u{1f3ff}",
+        "\u{1f476}\u{200d}\u{1f6d1}"]), ("\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}",
+        &["\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}"]), ("\u{1f6d1}\u{200d}\u{1f6d1}",
+        &["\u{1f6d1}\u{200d}\u{1f6d1}"]), ("\u{61}\u{200d}\u{1f6d1}", &["\u{61}\u{200d}",
+        "\u{1f6d1}"]), ("\u{2701}\u{200d}\u{2701}", &["\u{2701}\u{200d}\u{2701}"]),
+        ("\u{61}\u{200d}\u{2701}", &["\u{61}\u{200d}", "\u{2701}"]), ("\u{915}\u{924}", &["\u{915}",
+        "\u{924}"]), ("\u{915}\u{94d}\u{61}", &["\u{915}\u{94d}", "\u{61}"]),
+        ("\u{61}\u{94d}\u{924}", &["\u{61}\u{94d}", "\u{924}"]), ("\u{3f}\u{94d}\u{924}",
+        &["\u{3f}\u{94d}", "\u{924}"])
+    ];
+
+    pub const TEST_DIFF: &[(&str, &[&str], &[&str])] = &[
+        ("\u{20}\u{a03}", &["\u{20}\u{a03}"], &["\u{20}", "\u{a03}"]), ("\u{20}\u{308}\u{a03}",
+        &["\u{20}\u{308}\u{a03}"], &["\u{20}\u{308}", "\u{a03}"]), ("\u{20}\u{903}",
+        &["\u{20}\u{903}"], &["\u{20}", "\u{903}"]), ("\u{20}\u{308}\u{903}",
+        &["\u{20}\u{308}\u{903}"], &["\u{20}\u{308}", "\u{903}"]), ("\u{d}\u{308}\u{a03}",
+        &["\u{d}", "\u{308}\u{a03}"], &["\u{d}", "\u{308}", "\u{a03}"]), ("\u{d}\u{308}\u{903}",
+        &["\u{d}", "\u{308}\u{903}"], &["\u{d}", "\u{308}", "\u{903}"]), ("\u{a}\u{308}\u{a03}",
+        &["\u{a}", "\u{308}\u{a03}"], &["\u{a}", "\u{308}", "\u{a03}"]), ("\u{a}\u{308}\u{903}",
+        &["\u{a}", "\u{308}\u{903}"], &["\u{a}", "\u{308}", "\u{903}"]), ("\u{1}\u{308}\u{a03}",
+        &["\u{1}", "\u{308}\u{a03}"], &["\u{1}", "\u{308}", "\u{a03}"]), ("\u{1}\u{308}\u{903}",
+        &["\u{1}", "\u{308}\u{903}"], &["\u{1}", "\u{308}", "\u{903}"]), ("\u{200c}\u{a03}",
+        &["\u{200c}\u{a03}"], &["\u{200c}", "\u{a03}"]), ("\u{200c}\u{308}\u{a03}",
+        &["\u{200c}\u{308}\u{a03}"], &["\u{200c}\u{308}", "\u{a03}"]), ("\u{200c}\u{903}",
+        &["\u{200c}\u{903}"], &["\u{200c}", "\u{903}"]), ("\u{200c}\u{308}\u{903}",
+        &["\u{200c}\u{308}\u{903}"], &["\u{200c}\u{308}", "\u{903}"]), ("\u{1f1e6}\u{a03}",
+        &["\u{1f1e6}\u{a03}"], &["\u{1f1e6}", "\u{a03}"]), ("\u{1f1e6}\u{308}\u{a03}",
+        &["\u{1f1e6}\u{308}\u{a03}"], &["\u{1f1e6}\u{308}", "\u{a03}"]), ("\u{1f1e6}\u{903}",
+        &["\u{1f1e6}\u{903}"], &["\u{1f1e6}", "\u{903}"]), ("\u{1f1e6}\u{308}\u{903}",
+        &["\u{1f1e6}\u{308}\u{903}"], &["\u{1f1e6}\u{308}", "\u{903}"]), ("\u{600}\u{20}",
+        &["\u{600}\u{20}"], &["\u{600}", "\u{20}"]), ("\u{600}\u{1f1e6}", &["\u{600}\u{1f1e6}"],
+        &["\u{600}", "\u{1f1e6}"]), ("\u{600}\u{600}", &["\u{600}\u{600}"], &["\u{600}",
+        "\u{600}"]), ("\u{600}\u{a03}", &["\u{600}\u{a03}"], &["\u{600}", "\u{a03}"]),
+        ("\u{600}\u{308}\u{a03}", &["\u{600}\u{308}\u{a03}"], &["\u{600}\u{308}", "\u{a03}"]),
+        ("\u{600}\u{1100}", &["\u{600}\u{1100}"], &["\u{600}", "\u{1100}"]), ("\u{600}\u{1160}",
+        &["\u{600}\u{1160}"], &["\u{600}", "\u{1160}"]), ("\u{600}\u{11a8}", &["\u{600}\u{11a8}"],
+        &["\u{600}", "\u{11a8}"]), ("\u{600}\u{ac00}", &["\u{600}\u{ac00}"], &["\u{600}",
+        "\u{ac00}"]), ("\u{600}\u{ac01}", &["\u{600}\u{ac01}"], &["\u{600}", "\u{ac01}"]),
+        ("\u{600}\u{903}", &["\u{600}\u{903}"], &["\u{600}", "\u{903}"]), ("\u{600}\u{308}\u{903}",
+        &["\u{600}\u{308}\u{903}"], &["\u{600}\u{308}", "\u{903}"]), ("\u{600}\u{904}",
+        &["\u{600}\u{904}"], &["\u{600}", "\u{904}"]), ("\u{600}\u{d4e}", &["\u{600}\u{d4e}"],
+        &["\u{600}", "\u{d4e}"]), ("\u{600}\u{915}", &["\u{600}\u{915}"], &["\u{600}", "\u{915}"]),
+        ("\u{600}\u{231a}", &["\u{600}\u{231a}"], &["\u{600}", "\u{231a}"]), ("\u{600}\u{378}",
+        &["\u{600}\u{378}"], &["\u{600}", "\u{378}"]), ("\u{a03}\u{a03}", &["\u{a03}\u{a03}"],
+        &["\u{a03}", "\u{a03}"]), ("\u{a03}\u{308}\u{a03}", &["\u{a03}\u{308}\u{a03}"],
+        &["\u{a03}\u{308}", "\u{a03}"]), ("\u{a03}\u{903}", &["\u{a03}\u{903}"], &["\u{a03}",
+        "\u{903}"]), ("\u{a03}\u{308}\u{903}", &["\u{a03}\u{308}\u{903}"], &["\u{a03}\u{308}",
+        "\u{903}"]), ("\u{1100}\u{a03}", &["\u{1100}\u{a03}"], &["\u{1100}", "\u{a03}"]),
+        ("\u{1100}\u{308}\u{a03}", &["\u{1100}\u{308}\u{a03}"], &["\u{1100}\u{308}", "\u{a03}"]),
+        ("\u{1100}\u{903}", &["\u{1100}\u{903}"], &["\u{1100}", "\u{903}"]),
+        ("\u{1100}\u{308}\u{903}", &["\u{1100}\u{308}\u{903}"], &["\u{1100}\u{308}", "\u{903}"]),
+        ("\u{1160}\u{a03}", &["\u{1160}\u{a03}"], &["\u{1160}", "\u{a03}"]),
+        ("\u{1160}\u{308}\u{a03}", &["\u{1160}\u{308}\u{a03}"], &["\u{1160}\u{308}", "\u{a03}"]),
+        ("\u{1160}\u{903}", &["\u{1160}\u{903}"], &["\u{1160}", "\u{903}"]),
+        ("\u{1160}\u{308}\u{903}", &["\u{1160}\u{308}\u{903}"], &["\u{1160}\u{308}", "\u{903}"]),
+        ("\u{11a8}\u{a03}", &["\u{11a8}\u{a03}"], &["\u{11a8}", "\u{a03}"]),
+        ("\u{11a8}\u{308}\u{a03}", &["\u{11a8}\u{308}\u{a03}"], &["\u{11a8}\u{308}", "\u{a03}"]),
+        ("\u{11a8}\u{903}", &["\u{11a8}\u{903}"], &["\u{11a8}", "\u{903}"]),
+        ("\u{11a8}\u{308}\u{903}", &["\u{11a8}\u{308}\u{903}"], &["\u{11a8}\u{308}", "\u{903}"]),
+        ("\u{ac00}\u{a03}", &["\u{ac00}\u{a03}"], &["\u{ac00}", "\u{a03}"]),
+        ("\u{ac00}\u{308}\u{a03}", &["\u{ac00}\u{308}\u{a03}"], &["\u{ac00}\u{308}", "\u{a03}"]),
+        ("\u{ac00}\u{903}", &["\u{ac00}\u{903}"], &["\u{ac00}", "\u{903}"]),
+        ("\u{ac00}\u{308}\u{903}", &["\u{ac00}\u{308}\u{903}"], &["\u{ac00}\u{308}", "\u{903}"]),
+        ("\u{ac01}\u{a03}", &["\u{ac01}\u{a03}"], &["\u{ac01}", "\u{a03}"]),
+        ("\u{ac01}\u{308}\u{a03}", &["\u{ac01}\u{308}\u{a03}"], &["\u{ac01}\u{308}", "\u{a03}"]),
+        ("\u{ac01}\u{903}", &["\u{ac01}\u{903}"], &["\u{ac01}", "\u{903}"]),
+        ("\u{ac01}\u{308}\u{903}", &["\u{ac01}\u{308}\u{903}"], &["\u{ac01}\u{308}", "\u{903}"]),
+        ("\u{903}\u{a03}", &["\u{903}\u{a03}"], &["\u{903}", "\u{a03}"]), ("\u{903}\u{308}\u{a03}",
+        &["\u{903}\u{308}\u{a03}"], &["\u{903}\u{308}", "\u{a03}"]), ("\u{903}\u{903}",
+        &["\u{903}\u{903}"], &["\u{903}", "\u{903}"]), ("\u{903}\u{308}\u{903}",
+        &["\u{903}\u{308}\u{903}"], &["\u{903}\u{308}", "\u{903}"]), ("\u{904}\u{a03}",
+        &["\u{904}\u{a03}"], &["\u{904}", "\u{a03}"]), ("\u{904}\u{308}\u{a03}",
+        &["\u{904}\u{308}\u{a03}"], &["\u{904}\u{308}", "\u{a03}"]), ("\u{904}\u{903}",
+        &["\u{904}\u{903}"], &["\u{904}", "\u{903}"]), ("\u{904}\u{308}\u{903}",
+        &["\u{904}\u{308}\u{903}"], &["\u{904}\u{308}", "\u{903}"]), ("\u{d4e}\u{20}",
+        &["\u{d4e}\u{20}"], &["\u{d4e}", "\u{20}"]), ("\u{d4e}\u{1f1e6}", &["\u{d4e}\u{1f1e6}"],
+        &["\u{d4e}", "\u{1f1e6}"]), ("\u{d4e}\u{600}", &["\u{d4e}\u{600}"], &["\u{d4e}",
+        "\u{600}"]), ("\u{d4e}\u{a03}", &["\u{d4e}\u{a03}"], &["\u{d4e}", "\u{a03}"]),
+        ("\u{d4e}\u{308}\u{a03}", &["\u{d4e}\u{308}\u{a03}"], &["\u{d4e}\u{308}", "\u{a03}"]),
+        ("\u{d4e}\u{1100}", &["\u{d4e}\u{1100}"], &["\u{d4e}", "\u{1100}"]), ("\u{d4e}\u{1160}",
+        &["\u{d4e}\u{1160}"], &["\u{d4e}", "\u{1160}"]), ("\u{d4e}\u{11a8}", &["\u{d4e}\u{11a8}"],
+        &["\u{d4e}", "\u{11a8}"]), ("\u{d4e}\u{ac00}", &["\u{d4e}\u{ac00}"], &["\u{d4e}",
+        "\u{ac00}"]), ("\u{d4e}\u{ac01}", &["\u{d4e}\u{ac01}"], &["\u{d4e}", "\u{ac01}"]),
+        ("\u{d4e}\u{903}", &["\u{d4e}\u{903}"], &["\u{d4e}", "\u{903}"]), ("\u{d4e}\u{308}\u{903}",
+        &["\u{d4e}\u{308}\u{903}"], &["\u{d4e}\u{308}", "\u{903}"]), ("\u{d4e}\u{904}",
+        &["\u{d4e}\u{904}"], &["\u{d4e}", "\u{904}"]), ("\u{d4e}\u{d4e}", &["\u{d4e}\u{d4e}"],
+        &["\u{d4e}", "\u{d4e}"]), ("\u{d4e}\u{915}", &["\u{d4e}\u{915}"], &["\u{d4e}", "\u{915}"]),
+        ("\u{d4e}\u{231a}", &["\u{d4e}\u{231a}"], &["\u{d4e}", "\u{231a}"]), ("\u{d4e}\u{378}",
+        &["\u{d4e}\u{378}"], &["\u{d4e}", "\u{378}"]), ("\u{915}\u{a03}", &["\u{915}\u{a03}"],
+        &["\u{915}", "\u{a03}"]), ("\u{915}\u{308}\u{a03}", &["\u{915}\u{308}\u{a03}"],
+        &["\u{915}\u{308}", "\u{a03}"]), ("\u{915}\u{903}", &["\u{915}\u{903}"], &["\u{915}",
+        "\u{903}"]), ("\u{915}\u{308}\u{903}", &["\u{915}\u{308}\u{903}"], &["\u{915}\u{308}",
+        "\u{903}"]), ("\u{231a}\u{a03}", &["\u{231a}\u{a03}"], &["\u{231a}", "\u{a03}"]),
+        ("\u{231a}\u{308}\u{a03}", &["\u{231a}\u{308}\u{a03}"], &["\u{231a}\u{308}", "\u{a03}"]),
+        ("\u{231a}\u{903}", &["\u{231a}\u{903}"], &["\u{231a}", "\u{903}"]),
+        ("\u{231a}\u{308}\u{903}", &["\u{231a}\u{308}\u{903}"], &["\u{231a}\u{308}", "\u{903}"]),
+        ("\u{300}\u{a03}", &["\u{300}\u{a03}"], &["\u{300}", "\u{a03}"]), ("\u{300}\u{308}\u{a03}",
+        &["\u{300}\u{308}\u{a03}"], &["\u{300}\u{308}", "\u{a03}"]), ("\u{300}\u{903}",
+        &["\u{300}\u{903}"], &["\u{300}", "\u{903}"]), ("\u{300}\u{308}\u{903}",
+        &["\u{300}\u{308}\u{903}"], &["\u{300}\u{308}", "\u{903}"]), ("\u{900}\u{a03}",
+        &["\u{900}\u{a03}"], &["\u{900}", "\u{a03}"]), ("\u{900}\u{308}\u{a03}",
+        &["\u{900}\u{308}\u{a03}"], &["\u{900}\u{308}", "\u{a03}"]), ("\u{900}\u{903}",
+        &["\u{900}\u{903}"], &["\u{900}", "\u{903}"]), ("\u{900}\u{308}\u{903}",
+        &["\u{900}\u{308}\u{903}"], &["\u{900}\u{308}", "\u{903}"]), ("\u{94d}\u{a03}",
+        &["\u{94d}\u{a03}"], &["\u{94d}", "\u{a03}"]), ("\u{94d}\u{308}\u{a03}",
+        &["\u{94d}\u{308}\u{a03}"], &["\u{94d}\u{308}", "\u{a03}"]), ("\u{94d}\u{903}",
+        &["\u{94d}\u{903}"], &["\u{94d}", "\u{903}"]), ("\u{94d}\u{308}\u{903}",
+        &["\u{94d}\u{308}\u{903}"], &["\u{94d}\u{308}", "\u{903}"]), ("\u{200d}\u{a03}",
+        &["\u{200d}\u{a03}"], &["\u{200d}", "\u{a03}"]), ("\u{200d}\u{308}\u{a03}",
+        &["\u{200d}\u{308}\u{a03}"], &["\u{200d}\u{308}", "\u{a03}"]), ("\u{200d}\u{903}",
+        &["\u{200d}\u{903}"], &["\u{200d}", "\u{903}"]), ("\u{200d}\u{308}\u{903}",
+        &["\u{200d}\u{308}\u{903}"], &["\u{200d}\u{308}", "\u{903}"]), ("\u{378}\u{a03}",
+        &["\u{378}\u{a03}"], &["\u{378}", "\u{a03}"]), ("\u{378}\u{308}\u{a03}",
+        &["\u{378}\u{308}\u{a03}"], &["\u{378}\u{308}", "\u{a03}"]), ("\u{378}\u{903}",
+        &["\u{378}\u{903}"], &["\u{378}", "\u{903}"]), ("\u{378}\u{308}\u{903}",
+        &["\u{378}\u{308}\u{903}"], &["\u{378}\u{308}", "\u{903}"]), ("\u{61}\u{903}\u{62}",
+        &["\u{61}\u{903}", "\u{62}"], &["\u{61}", "\u{903}", "\u{62}"]), ("\u{61}\u{600}\u{62}",
+        &["\u{61}", "\u{600}\u{62}"], &["\u{61}", "\u{600}", "\u{62}"]), ("\u{915}\u{94d}\u{924}",
+        &["\u{915}\u{94d}\u{924}"], &["\u{915}\u{94d}", "\u{924}"]),
+        ("\u{915}\u{94d}\u{94d}\u{924}", &["\u{915}\u{94d}\u{94d}\u{924}"],
+        &["\u{915}\u{94d}\u{94d}", "\u{924}"]), ("\u{915}\u{94d}\u{200d}\u{924}",
+        &["\u{915}\u{94d}\u{200d}\u{924}"], &["\u{915}\u{94d}\u{200d}", "\u{924}"]),
+        ("\u{915}\u{93c}\u{200d}\u{94d}\u{924}", &["\u{915}\u{93c}\u{200d}\u{94d}\u{924}"],
+        &["\u{915}\u{93c}\u{200d}\u{94d}", "\u{924}"]), ("\u{915}\u{93c}\u{94d}\u{200d}\u{924}",
+        &["\u{915}\u{93c}\u{94d}\u{200d}\u{924}"], &["\u{915}\u{93c}\u{94d}\u{200d}", "\u{924}"]),
+        ("\u{915}\u{94d}\u{924}\u{94d}\u{92f}", &["\u{915}\u{94d}\u{924}\u{94d}\u{92f}"],
+        &["\u{915}\u{94d}", "\u{924}\u{94d}", "\u{92f}"]), ("\u{915}\u{94d}\u{94d}\u{924}",
+        &["\u{915}\u{94d}\u{94d}\u{924}"], &["\u{915}\u{94d}\u{94d}", "\u{924}"])
+    ];
+
+    // official Unicode test data
+    // http://www.unicode.org/Public/16.0.0/ucd/auxiliary/WordBreakTest.txt
+    pub const TEST_WORD: &[(&str, &[&str])] = &[
+        ("\u{1}\u{1}", &["\u{1}", "\u{1}"]), ("\u{1}\u{308}\u{1}", &["\u{1}\u{308}", "\u{1}"]),
+        ("\u{1}\u{d}", &["\u{1}", "\u{d}"]), ("\u{1}\u{308}\u{d}", &["\u{1}\u{308}", "\u{d}"]),
+        ("\u{1}\u{a}", &["\u{1}", "\u{a}"]), ("\u{1}\u{308}\u{a}", &["\u{1}\u{308}", "\u{a}"]),
+        ("\u{1}\u{b}", &["\u{1}", "\u{b}"]), ("\u{1}\u{308}\u{b}", &["\u{1}\u{308}", "\u{b}"]),
+        ("\u{1}\u{3031}", &["\u{1}", "\u{3031}"]), ("\u{1}\u{308}\u{3031}", &["\u{1}\u{308}",
+        "\u{3031}"]), ("\u{1}\u{41}", &["\u{1}", "\u{41}"]), ("\u{1}\u{308}\u{41}",
+        &["\u{1}\u{308}", "\u{41}"]), ("\u{1}\u{3a}", &["\u{1}", "\u{3a}"]), ("\u{1}\u{308}\u{3a}",
+        &["\u{1}\u{308}", "\u{3a}"]), ("\u{1}\u{2c}", &["\u{1}", "\u{2c}"]), ("\u{1}\u{308}\u{2c}",
+        &["\u{1}\u{308}", "\u{2c}"]), ("\u{1}\u{2e}", &["\u{1}", "\u{2e}"]), ("\u{1}\u{308}\u{2e}",
+        &["\u{1}\u{308}", "\u{2e}"]), ("\u{1}\u{30}", &["\u{1}", "\u{30}"]), ("\u{1}\u{308}\u{30}",
+        &["\u{1}\u{308}", "\u{30}"]), ("\u{1}\u{5f}", &["\u{1}", "\u{5f}"]), ("\u{1}\u{308}\u{5f}",
+        &["\u{1}\u{308}", "\u{5f}"]), ("\u{1}\u{1f1e6}", &["\u{1}", "\u{1f1e6}"]),
+        ("\u{1}\u{308}\u{1f1e6}", &["\u{1}\u{308}", "\u{1f1e6}"]), ("\u{1}\u{5d0}", &["\u{1}",
+        "\u{5d0}"]), ("\u{1}\u{308}\u{5d0}", &["\u{1}\u{308}", "\u{5d0}"]), ("\u{1}\u{22}",
+        &["\u{1}", "\u{22}"]), ("\u{1}\u{308}\u{22}", &["\u{1}\u{308}", "\u{22}"]), ("\u{1}\u{27}",
+        &["\u{1}", "\u{27}"]), ("\u{1}\u{308}\u{27}", &["\u{1}\u{308}", "\u{27}"]),
+        ("\u{1}\u{231a}", &["\u{1}", "\u{231a}"]), ("\u{1}\u{308}\u{231a}", &["\u{1}\u{308}",
+        "\u{231a}"]), ("\u{1}\u{20}", &["\u{1}", "\u{20}"]), ("\u{1}\u{308}\u{20}",
+        &["\u{1}\u{308}", "\u{20}"]), ("\u{1}\u{ad}", &["\u{1}\u{ad}"]), ("\u{1}\u{308}\u{ad}",
+        &["\u{1}\u{308}\u{ad}"]), ("\u{1}\u{300}", &["\u{1}\u{300}"]), ("\u{1}\u{308}\u{300}",
+        &["\u{1}\u{308}\u{300}"]), ("\u{1}\u{200d}", &["\u{1}\u{200d}"]), ("\u{1}\u{308}\u{200d}",
+        &["\u{1}\u{308}\u{200d}"]), ("\u{1}\u{61}\u{2060}", &["\u{1}", "\u{61}\u{2060}"]),
+        ("\u{1}\u{308}\u{61}\u{2060}", &["\u{1}\u{308}", "\u{61}\u{2060}"]), ("\u{1}\u{61}\u{3a}",
+        &["\u{1}", "\u{61}", "\u{3a}"]), ("\u{1}\u{308}\u{61}\u{3a}", &["\u{1}\u{308}", "\u{61}",
+        "\u{3a}"]), ("\u{1}\u{61}\u{27}", &["\u{1}", "\u{61}", "\u{27}"]),
+        ("\u{1}\u{308}\u{61}\u{27}", &["\u{1}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{1}\u{61}\u{27}\u{2060}", &["\u{1}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{1}\u{308}\u{61}\u{27}\u{2060}", &["\u{1}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{1}\u{61}\u{2c}", &["\u{1}", "\u{61}", "\u{2c}"]), ("\u{1}\u{308}\u{61}\u{2c}",
+        &["\u{1}\u{308}", "\u{61}", "\u{2c}"]), ("\u{1}\u{31}\u{3a}", &["\u{1}", "\u{31}",
+        "\u{3a}"]), ("\u{1}\u{308}\u{31}\u{3a}", &["\u{1}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{1}\u{31}\u{27}", &["\u{1}", "\u{31}", "\u{27}"]), ("\u{1}\u{308}\u{31}\u{27}",
+        &["\u{1}\u{308}", "\u{31}", "\u{27}"]), ("\u{1}\u{31}\u{2c}", &["\u{1}", "\u{31}",
+        "\u{2c}"]), ("\u{1}\u{308}\u{31}\u{2c}", &["\u{1}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{1}\u{31}\u{2e}\u{2060}", &["\u{1}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{1}\u{308}\u{31}\u{2e}\u{2060}", &["\u{1}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{d}\u{1}", &["\u{d}", "\u{1}"]), ("\u{d}\u{308}\u{1}", &["\u{d}", "\u{308}", "\u{1}"]),
+        ("\u{d}\u{d}", &["\u{d}", "\u{d}"]), ("\u{d}\u{308}\u{d}", &["\u{d}", "\u{308}", "\u{d}"]),
+        ("\u{d}\u{a}", &["\u{d}\u{a}"]), ("\u{d}\u{308}\u{a}", &["\u{d}", "\u{308}", "\u{a}"]),
+        ("\u{d}\u{b}", &["\u{d}", "\u{b}"]), ("\u{d}\u{308}\u{b}", &["\u{d}", "\u{308}", "\u{b}"]),
+        ("\u{d}\u{3031}", &["\u{d}", "\u{3031}"]), ("\u{d}\u{308}\u{3031}", &["\u{d}", "\u{308}",
+        "\u{3031}"]), ("\u{d}\u{41}", &["\u{d}", "\u{41}"]), ("\u{d}\u{308}\u{41}", &["\u{d}",
+        "\u{308}", "\u{41}"]), ("\u{d}\u{3a}", &["\u{d}", "\u{3a}"]), ("\u{d}\u{308}\u{3a}",
+        &["\u{d}", "\u{308}", "\u{3a}"]), ("\u{d}\u{2c}", &["\u{d}", "\u{2c}"]),
+        ("\u{d}\u{308}\u{2c}", &["\u{d}", "\u{308}", "\u{2c}"]), ("\u{d}\u{2e}", &["\u{d}",
+        "\u{2e}"]), ("\u{d}\u{308}\u{2e}", &["\u{d}", "\u{308}", "\u{2e}"]), ("\u{d}\u{30}",
+        &["\u{d}", "\u{30}"]), ("\u{d}\u{308}\u{30}", &["\u{d}", "\u{308}", "\u{30}"]),
+        ("\u{d}\u{5f}", &["\u{d}", "\u{5f}"]), ("\u{d}\u{308}\u{5f}", &["\u{d}", "\u{308}",
+        "\u{5f}"]), ("\u{d}\u{1f1e6}", &["\u{d}", "\u{1f1e6}"]), ("\u{d}\u{308}\u{1f1e6}",
+        &["\u{d}", "\u{308}", "\u{1f1e6}"]), ("\u{d}\u{5d0}", &["\u{d}", "\u{5d0}"]),
+        ("\u{d}\u{308}\u{5d0}", &["\u{d}", "\u{308}", "\u{5d0}"]), ("\u{d}\u{22}", &["\u{d}",
+        "\u{22}"]), ("\u{d}\u{308}\u{22}", &["\u{d}", "\u{308}", "\u{22}"]), ("\u{d}\u{27}",
+        &["\u{d}", "\u{27}"]), ("\u{d}\u{308}\u{27}", &["\u{d}", "\u{308}", "\u{27}"]),
+        ("\u{d}\u{231a}", &["\u{d}", "\u{231a}"]), ("\u{d}\u{308}\u{231a}", &["\u{d}", "\u{308}",
+        "\u{231a}"]), ("\u{d}\u{20}", &["\u{d}", "\u{20}"]), ("\u{d}\u{308}\u{20}", &["\u{d}",
+        "\u{308}", "\u{20}"]), ("\u{d}\u{ad}", &["\u{d}", "\u{ad}"]), ("\u{d}\u{308}\u{ad}",
+        &["\u{d}", "\u{308}\u{ad}"]), ("\u{d}\u{300}", &["\u{d}", "\u{300}"]),
+        ("\u{d}\u{308}\u{300}", &["\u{d}", "\u{308}\u{300}"]), ("\u{d}\u{200d}", &["\u{d}",
+        "\u{200d}"]), ("\u{d}\u{308}\u{200d}", &["\u{d}", "\u{308}\u{200d}"]),
+        ("\u{d}\u{61}\u{2060}", &["\u{d}", "\u{61}\u{2060}"]), ("\u{d}\u{308}\u{61}\u{2060}",
+        &["\u{d}", "\u{308}", "\u{61}\u{2060}"]), ("\u{d}\u{61}\u{3a}", &["\u{d}", "\u{61}",
+        "\u{3a}"]), ("\u{d}\u{308}\u{61}\u{3a}", &["\u{d}", "\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{d}\u{61}\u{27}", &["\u{d}", "\u{61}", "\u{27}"]), ("\u{d}\u{308}\u{61}\u{27}",
+        &["\u{d}", "\u{308}", "\u{61}", "\u{27}"]), ("\u{d}\u{61}\u{27}\u{2060}", &["\u{d}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{d}\u{308}\u{61}\u{27}\u{2060}", &["\u{d}", "\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{d}\u{61}\u{2c}", &["\u{d}", "\u{61}", "\u{2c}"]),
+        ("\u{d}\u{308}\u{61}\u{2c}", &["\u{d}", "\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{d}\u{31}\u{3a}", &["\u{d}", "\u{31}", "\u{3a}"]), ("\u{d}\u{308}\u{31}\u{3a}",
+        &["\u{d}", "\u{308}", "\u{31}", "\u{3a}"]), ("\u{d}\u{31}\u{27}", &["\u{d}", "\u{31}",
+        "\u{27}"]), ("\u{d}\u{308}\u{31}\u{27}", &["\u{d}", "\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{d}\u{31}\u{2c}", &["\u{d}", "\u{31}", "\u{2c}"]), ("\u{d}\u{308}\u{31}\u{2c}",
+        &["\u{d}", "\u{308}", "\u{31}", "\u{2c}"]), ("\u{d}\u{31}\u{2e}\u{2060}", &["\u{d}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{d}\u{308}\u{31}\u{2e}\u{2060}", &["\u{d}", "\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{a}\u{1}", &["\u{a}", "\u{1}"]), ("\u{a}\u{308}\u{1}",
+        &["\u{a}", "\u{308}", "\u{1}"]), ("\u{a}\u{d}", &["\u{a}", "\u{d}"]), ("\u{a}\u{308}\u{d}",
+        &["\u{a}", "\u{308}", "\u{d}"]), ("\u{a}\u{a}", &["\u{a}", "\u{a}"]), ("\u{a}\u{308}\u{a}",
+        &["\u{a}", "\u{308}", "\u{a}"]), ("\u{a}\u{b}", &["\u{a}", "\u{b}"]), ("\u{a}\u{308}\u{b}",
+        &["\u{a}", "\u{308}", "\u{b}"]), ("\u{a}\u{3031}", &["\u{a}", "\u{3031}"]),
+        ("\u{a}\u{308}\u{3031}", &["\u{a}", "\u{308}", "\u{3031}"]), ("\u{a}\u{41}", &["\u{a}",
+        "\u{41}"]), ("\u{a}\u{308}\u{41}", &["\u{a}", "\u{308}", "\u{41}"]), ("\u{a}\u{3a}",
+        &["\u{a}", "\u{3a}"]), ("\u{a}\u{308}\u{3a}", &["\u{a}", "\u{308}", "\u{3a}"]),
+        ("\u{a}\u{2c}", &["\u{a}", "\u{2c}"]), ("\u{a}\u{308}\u{2c}", &["\u{a}", "\u{308}",
+        "\u{2c}"]), ("\u{a}\u{2e}", &["\u{a}", "\u{2e}"]), ("\u{a}\u{308}\u{2e}", &["\u{a}",
+        "\u{308}", "\u{2e}"]), ("\u{a}\u{30}", &["\u{a}", "\u{30}"]), ("\u{a}\u{308}\u{30}",
+        &["\u{a}", "\u{308}", "\u{30}"]), ("\u{a}\u{5f}", &["\u{a}", "\u{5f}"]),
+        ("\u{a}\u{308}\u{5f}", &["\u{a}", "\u{308}", "\u{5f}"]), ("\u{a}\u{1f1e6}", &["\u{a}",
+        "\u{1f1e6}"]), ("\u{a}\u{308}\u{1f1e6}", &["\u{a}", "\u{308}", "\u{1f1e6}"]),
+        ("\u{a}\u{5d0}", &["\u{a}", "\u{5d0}"]), ("\u{a}\u{308}\u{5d0}", &["\u{a}", "\u{308}",
+        "\u{5d0}"]), ("\u{a}\u{22}", &["\u{a}", "\u{22}"]), ("\u{a}\u{308}\u{22}", &["\u{a}",
+        "\u{308}", "\u{22}"]), ("\u{a}\u{27}", &["\u{a}", "\u{27}"]), ("\u{a}\u{308}\u{27}",
+        &["\u{a}", "\u{308}", "\u{27}"]), ("\u{a}\u{231a}", &["\u{a}", "\u{231a}"]),
+        ("\u{a}\u{308}\u{231a}", &["\u{a}", "\u{308}", "\u{231a}"]), ("\u{a}\u{20}", &["\u{a}",
+        "\u{20}"]), ("\u{a}\u{308}\u{20}", &["\u{a}", "\u{308}", "\u{20}"]), ("\u{a}\u{ad}",
+        &["\u{a}", "\u{ad}"]), ("\u{a}\u{308}\u{ad}", &["\u{a}", "\u{308}\u{ad}"]), ("\u{a}\u{300}",
+        &["\u{a}", "\u{300}"]), ("\u{a}\u{308}\u{300}", &["\u{a}", "\u{308}\u{300}"]),
+        ("\u{a}\u{200d}", &["\u{a}", "\u{200d}"]), ("\u{a}\u{308}\u{200d}", &["\u{a}",
+        "\u{308}\u{200d}"]), ("\u{a}\u{61}\u{2060}", &["\u{a}", "\u{61}\u{2060}"]),
+        ("\u{a}\u{308}\u{61}\u{2060}", &["\u{a}", "\u{308}", "\u{61}\u{2060}"]),
+        ("\u{a}\u{61}\u{3a}", &["\u{a}", "\u{61}", "\u{3a}"]), ("\u{a}\u{308}\u{61}\u{3a}",
+        &["\u{a}", "\u{308}", "\u{61}", "\u{3a}"]), ("\u{a}\u{61}\u{27}", &["\u{a}", "\u{61}",
+        "\u{27}"]), ("\u{a}\u{308}\u{61}\u{27}", &["\u{a}", "\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{a}\u{61}\u{27}\u{2060}", &["\u{a}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{a}\u{308}\u{61}\u{27}\u{2060}", &["\u{a}", "\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{a}\u{61}\u{2c}", &["\u{a}", "\u{61}", "\u{2c}"]), ("\u{a}\u{308}\u{61}\u{2c}",
+        &["\u{a}", "\u{308}", "\u{61}", "\u{2c}"]), ("\u{a}\u{31}\u{3a}", &["\u{a}", "\u{31}",
+        "\u{3a}"]), ("\u{a}\u{308}\u{31}\u{3a}", &["\u{a}", "\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{a}\u{31}\u{27}", &["\u{a}", "\u{31}", "\u{27}"]), ("\u{a}\u{308}\u{31}\u{27}",
+        &["\u{a}", "\u{308}", "\u{31}", "\u{27}"]), ("\u{a}\u{31}\u{2c}", &["\u{a}", "\u{31}",
+        "\u{2c}"]), ("\u{a}\u{308}\u{31}\u{2c}", &["\u{a}", "\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{a}\u{31}\u{2e}\u{2060}", &["\u{a}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{a}\u{308}\u{31}\u{2e}\u{2060}", &["\u{a}", "\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{b}\u{1}", &["\u{b}", "\u{1}"]), ("\u{b}\u{308}\u{1}", &["\u{b}", "\u{308}", "\u{1}"]),
+        ("\u{b}\u{d}", &["\u{b}", "\u{d}"]), ("\u{b}\u{308}\u{d}", &["\u{b}", "\u{308}", "\u{d}"]),
+        ("\u{b}\u{a}", &["\u{b}", "\u{a}"]), ("\u{b}\u{308}\u{a}", &["\u{b}", "\u{308}", "\u{a}"]),
+        ("\u{b}\u{b}", &["\u{b}", "\u{b}"]), ("\u{b}\u{308}\u{b}", &["\u{b}", "\u{308}", "\u{b}"]),
+        ("\u{b}\u{3031}", &["\u{b}", "\u{3031}"]), ("\u{b}\u{308}\u{3031}", &["\u{b}", "\u{308}",
+        "\u{3031}"]), ("\u{b}\u{41}", &["\u{b}", "\u{41}"]), ("\u{b}\u{308}\u{41}", &["\u{b}",
+        "\u{308}", "\u{41}"]), ("\u{b}\u{3a}", &["\u{b}", "\u{3a}"]), ("\u{b}\u{308}\u{3a}",
+        &["\u{b}", "\u{308}", "\u{3a}"]), ("\u{b}\u{2c}", &["\u{b}", "\u{2c}"]),
+        ("\u{b}\u{308}\u{2c}", &["\u{b}", "\u{308}", "\u{2c}"]), ("\u{b}\u{2e}", &["\u{b}",
+        "\u{2e}"]), ("\u{b}\u{308}\u{2e}", &["\u{b}", "\u{308}", "\u{2e}"]), ("\u{b}\u{30}",
+        &["\u{b}", "\u{30}"]), ("\u{b}\u{308}\u{30}", &["\u{b}", "\u{308}", "\u{30}"]),
+        ("\u{b}\u{5f}", &["\u{b}", "\u{5f}"]), ("\u{b}\u{308}\u{5f}", &["\u{b}", "\u{308}",
+        "\u{5f}"]), ("\u{b}\u{1f1e6}", &["\u{b}", "\u{1f1e6}"]), ("\u{b}\u{308}\u{1f1e6}",
+        &["\u{b}", "\u{308}", "\u{1f1e6}"]), ("\u{b}\u{5d0}", &["\u{b}", "\u{5d0}"]),
+        ("\u{b}\u{308}\u{5d0}", &["\u{b}", "\u{308}", "\u{5d0}"]), ("\u{b}\u{22}", &["\u{b}",
+        "\u{22}"]), ("\u{b}\u{308}\u{22}", &["\u{b}", "\u{308}", "\u{22}"]), ("\u{b}\u{27}",
+        &["\u{b}", "\u{27}"]), ("\u{b}\u{308}\u{27}", &["\u{b}", "\u{308}", "\u{27}"]),
+        ("\u{b}\u{231a}", &["\u{b}", "\u{231a}"]), ("\u{b}\u{308}\u{231a}", &["\u{b}", "\u{308}",
+        "\u{231a}"]), ("\u{b}\u{20}", &["\u{b}", "\u{20}"]), ("\u{b}\u{308}\u{20}", &["\u{b}",
+        "\u{308}", "\u{20}"]), ("\u{b}\u{ad}", &["\u{b}", "\u{ad}"]), ("\u{b}\u{308}\u{ad}",
+        &["\u{b}", "\u{308}\u{ad}"]), ("\u{b}\u{300}", &["\u{b}", "\u{300}"]),
+        ("\u{b}\u{308}\u{300}", &["\u{b}", "\u{308}\u{300}"]), ("\u{b}\u{200d}", &["\u{b}",
+        "\u{200d}"]), ("\u{b}\u{308}\u{200d}", &["\u{b}", "\u{308}\u{200d}"]),
+        ("\u{b}\u{61}\u{2060}", &["\u{b}", "\u{61}\u{2060}"]), ("\u{b}\u{308}\u{61}\u{2060}",
+        &["\u{b}", "\u{308}", "\u{61}\u{2060}"]), ("\u{b}\u{61}\u{3a}", &["\u{b}", "\u{61}",
+        "\u{3a}"]), ("\u{b}\u{308}\u{61}\u{3a}", &["\u{b}", "\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{b}\u{61}\u{27}", &["\u{b}", "\u{61}", "\u{27}"]), ("\u{b}\u{308}\u{61}\u{27}",
+        &["\u{b}", "\u{308}", "\u{61}", "\u{27}"]), ("\u{b}\u{61}\u{27}\u{2060}", &["\u{b}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{b}\u{308}\u{61}\u{27}\u{2060}", &["\u{b}", "\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{b}\u{61}\u{2c}", &["\u{b}", "\u{61}", "\u{2c}"]),
+        ("\u{b}\u{308}\u{61}\u{2c}", &["\u{b}", "\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{b}\u{31}\u{3a}", &["\u{b}", "\u{31}", "\u{3a}"]), ("\u{b}\u{308}\u{31}\u{3a}",
+        &["\u{b}", "\u{308}", "\u{31}", "\u{3a}"]), ("\u{b}\u{31}\u{27}", &["\u{b}", "\u{31}",
+        "\u{27}"]), ("\u{b}\u{308}\u{31}\u{27}", &["\u{b}", "\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{b}\u{31}\u{2c}", &["\u{b}", "\u{31}", "\u{2c}"]), ("\u{b}\u{308}\u{31}\u{2c}",
+        &["\u{b}", "\u{308}", "\u{31}", "\u{2c}"]), ("\u{b}\u{31}\u{2e}\u{2060}", &["\u{b}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{b}\u{308}\u{31}\u{2e}\u{2060}", &["\u{b}", "\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{3031}\u{1}", &["\u{3031}", "\u{1}"]),
+        ("\u{3031}\u{308}\u{1}", &["\u{3031}\u{308}", "\u{1}"]), ("\u{3031}\u{d}", &["\u{3031}",
+        "\u{d}"]), ("\u{3031}\u{308}\u{d}", &["\u{3031}\u{308}", "\u{d}"]), ("\u{3031}\u{a}",
+        &["\u{3031}", "\u{a}"]), ("\u{3031}\u{308}\u{a}", &["\u{3031}\u{308}", "\u{a}"]),
+        ("\u{3031}\u{b}", &["\u{3031}", "\u{b}"]), ("\u{3031}\u{308}\u{b}", &["\u{3031}\u{308}",
+        "\u{b}"]), ("\u{3031}\u{3031}", &["\u{3031}\u{3031}"]), ("\u{3031}\u{308}\u{3031}",
+        &["\u{3031}\u{308}\u{3031}"]), ("\u{3031}\u{41}", &["\u{3031}", "\u{41}"]),
+        ("\u{3031}\u{308}\u{41}", &["\u{3031}\u{308}", "\u{41}"]), ("\u{3031}\u{3a}", &["\u{3031}",
+        "\u{3a}"]), ("\u{3031}\u{308}\u{3a}", &["\u{3031}\u{308}", "\u{3a}"]), ("\u{3031}\u{2c}",
+        &["\u{3031}", "\u{2c}"]), ("\u{3031}\u{308}\u{2c}", &["\u{3031}\u{308}", "\u{2c}"]),
+        ("\u{3031}\u{2e}", &["\u{3031}", "\u{2e}"]), ("\u{3031}\u{308}\u{2e}", &["\u{3031}\u{308}",
+        "\u{2e}"]), ("\u{3031}\u{30}", &["\u{3031}", "\u{30}"]), ("\u{3031}\u{308}\u{30}",
+        &["\u{3031}\u{308}", "\u{30}"]), ("\u{3031}\u{5f}", &["\u{3031}\u{5f}"]),
+        ("\u{3031}\u{308}\u{5f}", &["\u{3031}\u{308}\u{5f}"]), ("\u{3031}\u{1f1e6}", &["\u{3031}",
+        "\u{1f1e6}"]), ("\u{3031}\u{308}\u{1f1e6}", &["\u{3031}\u{308}", "\u{1f1e6}"]),
+        ("\u{3031}\u{5d0}", &["\u{3031}", "\u{5d0}"]), ("\u{3031}\u{308}\u{5d0}",
+        &["\u{3031}\u{308}", "\u{5d0}"]), ("\u{3031}\u{22}", &["\u{3031}", "\u{22}"]),
+        ("\u{3031}\u{308}\u{22}", &["\u{3031}\u{308}", "\u{22}"]), ("\u{3031}\u{27}", &["\u{3031}",
+        "\u{27}"]), ("\u{3031}\u{308}\u{27}", &["\u{3031}\u{308}", "\u{27}"]), ("\u{3031}\u{231a}",
+        &["\u{3031}", "\u{231a}"]), ("\u{3031}\u{308}\u{231a}", &["\u{3031}\u{308}", "\u{231a}"]),
+        ("\u{3031}\u{20}", &["\u{3031}", "\u{20}"]), ("\u{3031}\u{308}\u{20}", &["\u{3031}\u{308}",
+        "\u{20}"]), ("\u{3031}\u{ad}", &["\u{3031}\u{ad}"]), ("\u{3031}\u{308}\u{ad}",
+        &["\u{3031}\u{308}\u{ad}"]), ("\u{3031}\u{300}", &["\u{3031}\u{300}"]),
+        ("\u{3031}\u{308}\u{300}", &["\u{3031}\u{308}\u{300}"]), ("\u{3031}\u{200d}",
+        &["\u{3031}\u{200d}"]), ("\u{3031}\u{308}\u{200d}", &["\u{3031}\u{308}\u{200d}"]),
+        ("\u{3031}\u{61}\u{2060}", &["\u{3031}", "\u{61}\u{2060}"]),
+        ("\u{3031}\u{308}\u{61}\u{2060}", &["\u{3031}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{3031}\u{61}\u{3a}", &["\u{3031}", "\u{61}", "\u{3a}"]), ("\u{3031}\u{308}\u{61}\u{3a}",
+        &["\u{3031}\u{308}", "\u{61}", "\u{3a}"]), ("\u{3031}\u{61}\u{27}", &["\u{3031}", "\u{61}",
+        "\u{27}"]), ("\u{3031}\u{308}\u{61}\u{27}", &["\u{3031}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{3031}\u{61}\u{27}\u{2060}", &["\u{3031}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{3031}\u{308}\u{61}\u{27}\u{2060}", &["\u{3031}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{3031}\u{61}\u{2c}", &["\u{3031}", "\u{61}", "\u{2c}"]), ("\u{3031}\u{308}\u{61}\u{2c}",
+        &["\u{3031}\u{308}", "\u{61}", "\u{2c}"]), ("\u{3031}\u{31}\u{3a}", &["\u{3031}", "\u{31}",
+        "\u{3a}"]), ("\u{3031}\u{308}\u{31}\u{3a}", &["\u{3031}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{3031}\u{31}\u{27}", &["\u{3031}", "\u{31}", "\u{27}"]), ("\u{3031}\u{308}\u{31}\u{27}",
+        &["\u{3031}\u{308}", "\u{31}", "\u{27}"]), ("\u{3031}\u{31}\u{2c}", &["\u{3031}", "\u{31}",
+        "\u{2c}"]), ("\u{3031}\u{308}\u{31}\u{2c}", &["\u{3031}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{3031}\u{31}\u{2e}\u{2060}", &["\u{3031}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{3031}\u{308}\u{31}\u{2e}\u{2060}", &["\u{3031}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{41}\u{1}", &["\u{41}", "\u{1}"]), ("\u{41}\u{308}\u{1}", &["\u{41}\u{308}", "\u{1}"]),
+        ("\u{41}\u{d}", &["\u{41}", "\u{d}"]), ("\u{41}\u{308}\u{d}", &["\u{41}\u{308}", "\u{d}"]),
+        ("\u{41}\u{a}", &["\u{41}", "\u{a}"]), ("\u{41}\u{308}\u{a}", &["\u{41}\u{308}", "\u{a}"]),
+        ("\u{41}\u{b}", &["\u{41}", "\u{b}"]), ("\u{41}\u{308}\u{b}", &["\u{41}\u{308}", "\u{b}"]),
+        ("\u{41}\u{3031}", &["\u{41}", "\u{3031}"]), ("\u{41}\u{308}\u{3031}", &["\u{41}\u{308}",
+        "\u{3031}"]), ("\u{41}\u{41}", &["\u{41}\u{41}"]), ("\u{41}\u{308}\u{41}",
+        &["\u{41}\u{308}\u{41}"]), ("\u{41}\u{3a}", &["\u{41}", "\u{3a}"]), ("\u{41}\u{308}\u{3a}",
+        &["\u{41}\u{308}", "\u{3a}"]), ("\u{41}\u{2c}", &["\u{41}", "\u{2c}"]),
+        ("\u{41}\u{308}\u{2c}", &["\u{41}\u{308}", "\u{2c}"]), ("\u{41}\u{2e}", &["\u{41}",
+        "\u{2e}"]), ("\u{41}\u{308}\u{2e}", &["\u{41}\u{308}", "\u{2e}"]), ("\u{41}\u{30}",
+        &["\u{41}\u{30}"]), ("\u{41}\u{308}\u{30}", &["\u{41}\u{308}\u{30}"]), ("\u{41}\u{5f}",
+        &["\u{41}\u{5f}"]), ("\u{41}\u{308}\u{5f}", &["\u{41}\u{308}\u{5f}"]), ("\u{41}\u{1f1e6}",
+        &["\u{41}", "\u{1f1e6}"]), ("\u{41}\u{308}\u{1f1e6}", &["\u{41}\u{308}", "\u{1f1e6}"]),
+        ("\u{41}\u{5d0}", &["\u{41}\u{5d0}"]), ("\u{41}\u{308}\u{5d0}", &["\u{41}\u{308}\u{5d0}"]),
+        ("\u{41}\u{22}", &["\u{41}", "\u{22}"]), ("\u{41}\u{308}\u{22}", &["\u{41}\u{308}",
+        "\u{22}"]), ("\u{41}\u{27}", &["\u{41}", "\u{27}"]), ("\u{41}\u{308}\u{27}",
+        &["\u{41}\u{308}", "\u{27}"]), ("\u{41}\u{231a}", &["\u{41}", "\u{231a}"]),
+        ("\u{41}\u{308}\u{231a}", &["\u{41}\u{308}", "\u{231a}"]), ("\u{41}\u{20}", &["\u{41}",
+        "\u{20}"]), ("\u{41}\u{308}\u{20}", &["\u{41}\u{308}", "\u{20}"]), ("\u{41}\u{ad}",
+        &["\u{41}\u{ad}"]), ("\u{41}\u{308}\u{ad}", &["\u{41}\u{308}\u{ad}"]), ("\u{41}\u{300}",
+        &["\u{41}\u{300}"]), ("\u{41}\u{308}\u{300}", &["\u{41}\u{308}\u{300}"]), ("\u{41}\u{200d}",
+        &["\u{41}\u{200d}"]), ("\u{41}\u{308}\u{200d}", &["\u{41}\u{308}\u{200d}"]),
+        ("\u{41}\u{61}\u{2060}", &["\u{41}\u{61}\u{2060}"]), ("\u{41}\u{308}\u{61}\u{2060}",
+        &["\u{41}\u{308}\u{61}\u{2060}"]), ("\u{41}\u{61}\u{3a}", &["\u{41}\u{61}", "\u{3a}"]),
+        ("\u{41}\u{308}\u{61}\u{3a}", &["\u{41}\u{308}\u{61}", "\u{3a}"]), ("\u{41}\u{61}\u{27}",
+        &["\u{41}\u{61}", "\u{27}"]), ("\u{41}\u{308}\u{61}\u{27}", &["\u{41}\u{308}\u{61}",
+        "\u{27}"]), ("\u{41}\u{61}\u{27}\u{2060}", &["\u{41}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{41}\u{308}\u{61}\u{27}\u{2060}", &["\u{41}\u{308}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{41}\u{61}\u{2c}", &["\u{41}\u{61}", "\u{2c}"]), ("\u{41}\u{308}\u{61}\u{2c}",
+        &["\u{41}\u{308}\u{61}", "\u{2c}"]), ("\u{41}\u{31}\u{3a}", &["\u{41}\u{31}", "\u{3a}"]),
+        ("\u{41}\u{308}\u{31}\u{3a}", &["\u{41}\u{308}\u{31}", "\u{3a}"]), ("\u{41}\u{31}\u{27}",
+        &["\u{41}\u{31}", "\u{27}"]), ("\u{41}\u{308}\u{31}\u{27}", &["\u{41}\u{308}\u{31}",
+        "\u{27}"]), ("\u{41}\u{31}\u{2c}", &["\u{41}\u{31}", "\u{2c}"]),
+        ("\u{41}\u{308}\u{31}\u{2c}", &["\u{41}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{41}\u{31}\u{2e}\u{2060}", &["\u{41}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{41}\u{308}\u{31}\u{2e}\u{2060}", &["\u{41}\u{308}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{3a}\u{1}", &["\u{3a}", "\u{1}"]), ("\u{3a}\u{308}\u{1}", &["\u{3a}\u{308}", "\u{1}"]),
+        ("\u{3a}\u{d}", &["\u{3a}", "\u{d}"]), ("\u{3a}\u{308}\u{d}", &["\u{3a}\u{308}", "\u{d}"]),
+        ("\u{3a}\u{a}", &["\u{3a}", "\u{a}"]), ("\u{3a}\u{308}\u{a}", &["\u{3a}\u{308}", "\u{a}"]),
+        ("\u{3a}\u{b}", &["\u{3a}", "\u{b}"]), ("\u{3a}\u{308}\u{b}", &["\u{3a}\u{308}", "\u{b}"]),
+        ("\u{3a}\u{3031}", &["\u{3a}", "\u{3031}"]), ("\u{3a}\u{308}\u{3031}", &["\u{3a}\u{308}",
+        "\u{3031}"]), ("\u{3a}\u{41}", &["\u{3a}", "\u{41}"]), ("\u{3a}\u{308}\u{41}",
+        &["\u{3a}\u{308}", "\u{41}"]), ("\u{3a}\u{3a}", &["\u{3a}", "\u{3a}"]),
+        ("\u{3a}\u{308}\u{3a}", &["\u{3a}\u{308}", "\u{3a}"]), ("\u{3a}\u{2c}", &["\u{3a}",
+        "\u{2c}"]), ("\u{3a}\u{308}\u{2c}", &["\u{3a}\u{308}", "\u{2c}"]), ("\u{3a}\u{2e}",
+        &["\u{3a}", "\u{2e}"]), ("\u{3a}\u{308}\u{2e}", &["\u{3a}\u{308}", "\u{2e}"]),
+        ("\u{3a}\u{30}", &["\u{3a}", "\u{30}"]), ("\u{3a}\u{308}\u{30}", &["\u{3a}\u{308}",
+        "\u{30}"]), ("\u{3a}\u{5f}", &["\u{3a}", "\u{5f}"]), ("\u{3a}\u{308}\u{5f}",
+        &["\u{3a}\u{308}", "\u{5f}"]), ("\u{3a}\u{1f1e6}", &["\u{3a}", "\u{1f1e6}"]),
+        ("\u{3a}\u{308}\u{1f1e6}", &["\u{3a}\u{308}", "\u{1f1e6}"]), ("\u{3a}\u{5d0}", &["\u{3a}",
+        "\u{5d0}"]), ("\u{3a}\u{308}\u{5d0}", &["\u{3a}\u{308}", "\u{5d0}"]), ("\u{3a}\u{22}",
+        &["\u{3a}", "\u{22}"]), ("\u{3a}\u{308}\u{22}", &["\u{3a}\u{308}", "\u{22}"]),
+        ("\u{3a}\u{27}", &["\u{3a}", "\u{27}"]), ("\u{3a}\u{308}\u{27}", &["\u{3a}\u{308}",
+        "\u{27}"]), ("\u{3a}\u{231a}", &["\u{3a}", "\u{231a}"]), ("\u{3a}\u{308}\u{231a}",
+        &["\u{3a}\u{308}", "\u{231a}"]), ("\u{3a}\u{20}", &["\u{3a}", "\u{20}"]),
+        ("\u{3a}\u{308}\u{20}", &["\u{3a}\u{308}", "\u{20}"]), ("\u{3a}\u{ad}", &["\u{3a}\u{ad}"]),
+        ("\u{3a}\u{308}\u{ad}", &["\u{3a}\u{308}\u{ad}"]), ("\u{3a}\u{300}", &["\u{3a}\u{300}"]),
+        ("\u{3a}\u{308}\u{300}", &["\u{3a}\u{308}\u{300}"]), ("\u{3a}\u{200d}",
+        &["\u{3a}\u{200d}"]), ("\u{3a}\u{308}\u{200d}", &["\u{3a}\u{308}\u{200d}"]),
+        ("\u{3a}\u{61}\u{2060}", &["\u{3a}", "\u{61}\u{2060}"]), ("\u{3a}\u{308}\u{61}\u{2060}",
+        &["\u{3a}\u{308}", "\u{61}\u{2060}"]), ("\u{3a}\u{61}\u{3a}", &["\u{3a}", "\u{61}",
+        "\u{3a}"]), ("\u{3a}\u{308}\u{61}\u{3a}", &["\u{3a}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{3a}\u{61}\u{27}", &["\u{3a}", "\u{61}", "\u{27}"]), ("\u{3a}\u{308}\u{61}\u{27}",
+        &["\u{3a}\u{308}", "\u{61}", "\u{27}"]), ("\u{3a}\u{61}\u{27}\u{2060}", &["\u{3a}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{3a}\u{308}\u{61}\u{27}\u{2060}", &["\u{3a}\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{3a}\u{61}\u{2c}", &["\u{3a}", "\u{61}", "\u{2c}"]),
+        ("\u{3a}\u{308}\u{61}\u{2c}", &["\u{3a}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{3a}\u{31}\u{3a}", &["\u{3a}", "\u{31}", "\u{3a}"]), ("\u{3a}\u{308}\u{31}\u{3a}",
+        &["\u{3a}\u{308}", "\u{31}", "\u{3a}"]), ("\u{3a}\u{31}\u{27}", &["\u{3a}", "\u{31}",
+        "\u{27}"]), ("\u{3a}\u{308}\u{31}\u{27}", &["\u{3a}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{3a}\u{31}\u{2c}", &["\u{3a}", "\u{31}", "\u{2c}"]), ("\u{3a}\u{308}\u{31}\u{2c}",
+        &["\u{3a}\u{308}", "\u{31}", "\u{2c}"]), ("\u{3a}\u{31}\u{2e}\u{2060}", &["\u{3a}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{3a}\u{308}\u{31}\u{2e}\u{2060}", &["\u{3a}\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{2c}\u{1}", &["\u{2c}", "\u{1}"]), ("\u{2c}\u{308}\u{1}",
+        &["\u{2c}\u{308}", "\u{1}"]), ("\u{2c}\u{d}", &["\u{2c}", "\u{d}"]), ("\u{2c}\u{308}\u{d}",
+        &["\u{2c}\u{308}", "\u{d}"]), ("\u{2c}\u{a}", &["\u{2c}", "\u{a}"]), ("\u{2c}\u{308}\u{a}",
+        &["\u{2c}\u{308}", "\u{a}"]), ("\u{2c}\u{b}", &["\u{2c}", "\u{b}"]), ("\u{2c}\u{308}\u{b}",
+        &["\u{2c}\u{308}", "\u{b}"]), ("\u{2c}\u{3031}", &["\u{2c}", "\u{3031}"]),
+        ("\u{2c}\u{308}\u{3031}", &["\u{2c}\u{308}", "\u{3031}"]), ("\u{2c}\u{41}", &["\u{2c}",
+        "\u{41}"]), ("\u{2c}\u{308}\u{41}", &["\u{2c}\u{308}", "\u{41}"]), ("\u{2c}\u{3a}",
+        &["\u{2c}", "\u{3a}"]), ("\u{2c}\u{308}\u{3a}", &["\u{2c}\u{308}", "\u{3a}"]),
+        ("\u{2c}\u{2c}", &["\u{2c}", "\u{2c}"]), ("\u{2c}\u{308}\u{2c}", &["\u{2c}\u{308}",
+        "\u{2c}"]), ("\u{2c}\u{2e}", &["\u{2c}", "\u{2e}"]), ("\u{2c}\u{308}\u{2e}",
+        &["\u{2c}\u{308}", "\u{2e}"]), ("\u{2c}\u{30}", &["\u{2c}", "\u{30}"]),
+        ("\u{2c}\u{308}\u{30}", &["\u{2c}\u{308}", "\u{30}"]), ("\u{2c}\u{5f}", &["\u{2c}",
+        "\u{5f}"]), ("\u{2c}\u{308}\u{5f}", &["\u{2c}\u{308}", "\u{5f}"]), ("\u{2c}\u{1f1e6}",
+        &["\u{2c}", "\u{1f1e6}"]), ("\u{2c}\u{308}\u{1f1e6}", &["\u{2c}\u{308}", "\u{1f1e6}"]),
+        ("\u{2c}\u{5d0}", &["\u{2c}", "\u{5d0}"]), ("\u{2c}\u{308}\u{5d0}", &["\u{2c}\u{308}",
+        "\u{5d0}"]), ("\u{2c}\u{22}", &["\u{2c}", "\u{22}"]), ("\u{2c}\u{308}\u{22}",
+        &["\u{2c}\u{308}", "\u{22}"]), ("\u{2c}\u{27}", &["\u{2c}", "\u{27}"]),
+        ("\u{2c}\u{308}\u{27}", &["\u{2c}\u{308}", "\u{27}"]), ("\u{2c}\u{231a}", &["\u{2c}",
+        "\u{231a}"]), ("\u{2c}\u{308}\u{231a}", &["\u{2c}\u{308}", "\u{231a}"]), ("\u{2c}\u{20}",
+        &["\u{2c}", "\u{20}"]), ("\u{2c}\u{308}\u{20}", &["\u{2c}\u{308}", "\u{20}"]),
+        ("\u{2c}\u{ad}", &["\u{2c}\u{ad}"]), ("\u{2c}\u{308}\u{ad}", &["\u{2c}\u{308}\u{ad}"]),
+        ("\u{2c}\u{300}", &["\u{2c}\u{300}"]), ("\u{2c}\u{308}\u{300}", &["\u{2c}\u{308}\u{300}"]),
+        ("\u{2c}\u{200d}", &["\u{2c}\u{200d}"]), ("\u{2c}\u{308}\u{200d}",
+        &["\u{2c}\u{308}\u{200d}"]), ("\u{2c}\u{61}\u{2060}", &["\u{2c}", "\u{61}\u{2060}"]),
+        ("\u{2c}\u{308}\u{61}\u{2060}", &["\u{2c}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{2c}\u{61}\u{3a}", &["\u{2c}", "\u{61}", "\u{3a}"]), ("\u{2c}\u{308}\u{61}\u{3a}",
+        &["\u{2c}\u{308}", "\u{61}", "\u{3a}"]), ("\u{2c}\u{61}\u{27}", &["\u{2c}", "\u{61}",
+        "\u{27}"]), ("\u{2c}\u{308}\u{61}\u{27}", &["\u{2c}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{2c}\u{61}\u{27}\u{2060}", &["\u{2c}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{2c}\u{308}\u{61}\u{27}\u{2060}", &["\u{2c}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{2c}\u{61}\u{2c}", &["\u{2c}", "\u{61}", "\u{2c}"]), ("\u{2c}\u{308}\u{61}\u{2c}",
+        &["\u{2c}\u{308}", "\u{61}", "\u{2c}"]), ("\u{2c}\u{31}\u{3a}", &["\u{2c}", "\u{31}",
+        "\u{3a}"]), ("\u{2c}\u{308}\u{31}\u{3a}", &["\u{2c}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{2c}\u{31}\u{27}", &["\u{2c}", "\u{31}", "\u{27}"]), ("\u{2c}\u{308}\u{31}\u{27}",
+        &["\u{2c}\u{308}", "\u{31}", "\u{27}"]), ("\u{2c}\u{31}\u{2c}", &["\u{2c}", "\u{31}",
+        "\u{2c}"]), ("\u{2c}\u{308}\u{31}\u{2c}", &["\u{2c}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{2c}\u{31}\u{2e}\u{2060}", &["\u{2c}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{2c}\u{308}\u{31}\u{2e}\u{2060}", &["\u{2c}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{2e}\u{1}", &["\u{2e}", "\u{1}"]), ("\u{2e}\u{308}\u{1}", &["\u{2e}\u{308}", "\u{1}"]),
+        ("\u{2e}\u{d}", &["\u{2e}", "\u{d}"]), ("\u{2e}\u{308}\u{d}", &["\u{2e}\u{308}", "\u{d}"]),
+        ("\u{2e}\u{a}", &["\u{2e}", "\u{a}"]), ("\u{2e}\u{308}\u{a}", &["\u{2e}\u{308}", "\u{a}"]),
+        ("\u{2e}\u{b}", &["\u{2e}", "\u{b}"]), ("\u{2e}\u{308}\u{b}", &["\u{2e}\u{308}", "\u{b}"]),
+        ("\u{2e}\u{3031}", &["\u{2e}", "\u{3031}"]), ("\u{2e}\u{308}\u{3031}", &["\u{2e}\u{308}",
+        "\u{3031}"]), ("\u{2e}\u{41}", &["\u{2e}", "\u{41}"]), ("\u{2e}\u{308}\u{41}",
+        &["\u{2e}\u{308}", "\u{41}"]), ("\u{2e}\u{3a}", &["\u{2e}", "\u{3a}"]),
+        ("\u{2e}\u{308}\u{3a}", &["\u{2e}\u{308}", "\u{3a}"]), ("\u{2e}\u{2c}", &["\u{2e}",
+        "\u{2c}"]), ("\u{2e}\u{308}\u{2c}", &["\u{2e}\u{308}", "\u{2c}"]), ("\u{2e}\u{2e}",
+        &["\u{2e}", "\u{2e}"]), ("\u{2e}\u{308}\u{2e}", &["\u{2e}\u{308}", "\u{2e}"]),
+        ("\u{2e}\u{30}", &["\u{2e}", "\u{30}"]), ("\u{2e}\u{308}\u{30}", &["\u{2e}\u{308}",
+        "\u{30}"]), ("\u{2e}\u{5f}", &["\u{2e}", "\u{5f}"]), ("\u{2e}\u{308}\u{5f}",
+        &["\u{2e}\u{308}", "\u{5f}"]), ("\u{2e}\u{1f1e6}", &["\u{2e}", "\u{1f1e6}"]),
+        ("\u{2e}\u{308}\u{1f1e6}", &["\u{2e}\u{308}", "\u{1f1e6}"]), ("\u{2e}\u{5d0}", &["\u{2e}",
+        "\u{5d0}"]), ("\u{2e}\u{308}\u{5d0}", &["\u{2e}\u{308}", "\u{5d0}"]), ("\u{2e}\u{22}",
+        &["\u{2e}", "\u{22}"]), ("\u{2e}\u{308}\u{22}", &["\u{2e}\u{308}", "\u{22}"]),
+        ("\u{2e}\u{27}", &["\u{2e}", "\u{27}"]), ("\u{2e}\u{308}\u{27}", &["\u{2e}\u{308}",
+        "\u{27}"]), ("\u{2e}\u{231a}", &["\u{2e}", "\u{231a}"]), ("\u{2e}\u{308}\u{231a}",
+        &["\u{2e}\u{308}", "\u{231a}"]), ("\u{2e}\u{20}", &["\u{2e}", "\u{20}"]),
+        ("\u{2e}\u{308}\u{20}", &["\u{2e}\u{308}", "\u{20}"]), ("\u{2e}\u{ad}", &["\u{2e}\u{ad}"]),
+        ("\u{2e}\u{308}\u{ad}", &["\u{2e}\u{308}\u{ad}"]), ("\u{2e}\u{300}", &["\u{2e}\u{300}"]),
+        ("\u{2e}\u{308}\u{300}", &["\u{2e}\u{308}\u{300}"]), ("\u{2e}\u{200d}",
+        &["\u{2e}\u{200d}"]), ("\u{2e}\u{308}\u{200d}", &["\u{2e}\u{308}\u{200d}"]),
+        ("\u{2e}\u{61}\u{2060}", &["\u{2e}", "\u{61}\u{2060}"]), ("\u{2e}\u{308}\u{61}\u{2060}",
+        &["\u{2e}\u{308}", "\u{61}\u{2060}"]), ("\u{2e}\u{61}\u{3a}", &["\u{2e}", "\u{61}",
+        "\u{3a}"]), ("\u{2e}\u{308}\u{61}\u{3a}", &["\u{2e}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{2e}\u{61}\u{27}", &["\u{2e}", "\u{61}", "\u{27}"]), ("\u{2e}\u{308}\u{61}\u{27}",
+        &["\u{2e}\u{308}", "\u{61}", "\u{27}"]), ("\u{2e}\u{61}\u{27}\u{2060}", &["\u{2e}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{2e}\u{308}\u{61}\u{27}\u{2060}", &["\u{2e}\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{2e}\u{61}\u{2c}", &["\u{2e}", "\u{61}", "\u{2c}"]),
+        ("\u{2e}\u{308}\u{61}\u{2c}", &["\u{2e}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{2e}\u{31}\u{3a}", &["\u{2e}", "\u{31}", "\u{3a}"]), ("\u{2e}\u{308}\u{31}\u{3a}",
+        &["\u{2e}\u{308}", "\u{31}", "\u{3a}"]), ("\u{2e}\u{31}\u{27}", &["\u{2e}", "\u{31}",
+        "\u{27}"]), ("\u{2e}\u{308}\u{31}\u{27}", &["\u{2e}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{2e}\u{31}\u{2c}", &["\u{2e}", "\u{31}", "\u{2c}"]), ("\u{2e}\u{308}\u{31}\u{2c}",
+        &["\u{2e}\u{308}", "\u{31}", "\u{2c}"]), ("\u{2e}\u{31}\u{2e}\u{2060}", &["\u{2e}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{2e}\u{308}\u{31}\u{2e}\u{2060}", &["\u{2e}\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{30}\u{1}", &["\u{30}", "\u{1}"]), ("\u{30}\u{308}\u{1}",
+        &["\u{30}\u{308}", "\u{1}"]), ("\u{30}\u{d}", &["\u{30}", "\u{d}"]), ("\u{30}\u{308}\u{d}",
+        &["\u{30}\u{308}", "\u{d}"]), ("\u{30}\u{a}", &["\u{30}", "\u{a}"]), ("\u{30}\u{308}\u{a}",
+        &["\u{30}\u{308}", "\u{a}"]), ("\u{30}\u{b}", &["\u{30}", "\u{b}"]), ("\u{30}\u{308}\u{b}",
+        &["\u{30}\u{308}", "\u{b}"]), ("\u{30}\u{3031}", &["\u{30}", "\u{3031}"]),
+        ("\u{30}\u{308}\u{3031}", &["\u{30}\u{308}", "\u{3031}"]), ("\u{30}\u{41}",
+        &["\u{30}\u{41}"]), ("\u{30}\u{308}\u{41}", &["\u{30}\u{308}\u{41}"]), ("\u{30}\u{3a}",
+        &["\u{30}", "\u{3a}"]), ("\u{30}\u{308}\u{3a}", &["\u{30}\u{308}", "\u{3a}"]),
+        ("\u{30}\u{2c}", &["\u{30}", "\u{2c}"]), ("\u{30}\u{308}\u{2c}", &["\u{30}\u{308}",
+        "\u{2c}"]), ("\u{30}\u{2e}", &["\u{30}", "\u{2e}"]), ("\u{30}\u{308}\u{2e}",
+        &["\u{30}\u{308}", "\u{2e}"]), ("\u{30}\u{30}", &["\u{30}\u{30}"]), ("\u{30}\u{308}\u{30}",
+        &["\u{30}\u{308}\u{30}"]), ("\u{30}\u{5f}", &["\u{30}\u{5f}"]), ("\u{30}\u{308}\u{5f}",
+        &["\u{30}\u{308}\u{5f}"]), ("\u{30}\u{1f1e6}", &["\u{30}", "\u{1f1e6}"]),
+        ("\u{30}\u{308}\u{1f1e6}", &["\u{30}\u{308}", "\u{1f1e6}"]), ("\u{30}\u{5d0}",
+        &["\u{30}\u{5d0}"]), ("\u{30}\u{308}\u{5d0}", &["\u{30}\u{308}\u{5d0}"]), ("\u{30}\u{22}",
+        &["\u{30}", "\u{22}"]), ("\u{30}\u{308}\u{22}", &["\u{30}\u{308}", "\u{22}"]),
+        ("\u{30}\u{27}", &["\u{30}", "\u{27}"]), ("\u{30}\u{308}\u{27}", &["\u{30}\u{308}",
+        "\u{27}"]), ("\u{30}\u{231a}", &["\u{30}", "\u{231a}"]), ("\u{30}\u{308}\u{231a}",
+        &["\u{30}\u{308}", "\u{231a}"]), ("\u{30}\u{20}", &["\u{30}", "\u{20}"]),
+        ("\u{30}\u{308}\u{20}", &["\u{30}\u{308}", "\u{20}"]), ("\u{30}\u{ad}", &["\u{30}\u{ad}"]),
+        ("\u{30}\u{308}\u{ad}", &["\u{30}\u{308}\u{ad}"]), ("\u{30}\u{300}", &["\u{30}\u{300}"]),
+        ("\u{30}\u{308}\u{300}", &["\u{30}\u{308}\u{300}"]), ("\u{30}\u{200d}",
+        &["\u{30}\u{200d}"]), ("\u{30}\u{308}\u{200d}", &["\u{30}\u{308}\u{200d}"]),
+        ("\u{30}\u{61}\u{2060}", &["\u{30}\u{61}\u{2060}"]), ("\u{30}\u{308}\u{61}\u{2060}",
+        &["\u{30}\u{308}\u{61}\u{2060}"]), ("\u{30}\u{61}\u{3a}", &["\u{30}\u{61}", "\u{3a}"]),
+        ("\u{30}\u{308}\u{61}\u{3a}", &["\u{30}\u{308}\u{61}", "\u{3a}"]), ("\u{30}\u{61}\u{27}",
+        &["\u{30}\u{61}", "\u{27}"]), ("\u{30}\u{308}\u{61}\u{27}", &["\u{30}\u{308}\u{61}",
+        "\u{27}"]), ("\u{30}\u{61}\u{27}\u{2060}", &["\u{30}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{30}\u{308}\u{61}\u{27}\u{2060}", &["\u{30}\u{308}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{30}\u{61}\u{2c}", &["\u{30}\u{61}", "\u{2c}"]), ("\u{30}\u{308}\u{61}\u{2c}",
+        &["\u{30}\u{308}\u{61}", "\u{2c}"]), ("\u{30}\u{31}\u{3a}", &["\u{30}\u{31}", "\u{3a}"]),
+        ("\u{30}\u{308}\u{31}\u{3a}", &["\u{30}\u{308}\u{31}", "\u{3a}"]), ("\u{30}\u{31}\u{27}",
+        &["\u{30}\u{31}", "\u{27}"]), ("\u{30}\u{308}\u{31}\u{27}", &["\u{30}\u{308}\u{31}",
+        "\u{27}"]), ("\u{30}\u{31}\u{2c}", &["\u{30}\u{31}", "\u{2c}"]),
+        ("\u{30}\u{308}\u{31}\u{2c}", &["\u{30}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{30}\u{31}\u{2e}\u{2060}", &["\u{30}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{30}\u{308}\u{31}\u{2e}\u{2060}", &["\u{30}\u{308}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{5f}\u{1}", &["\u{5f}", "\u{1}"]), ("\u{5f}\u{308}\u{1}", &["\u{5f}\u{308}", "\u{1}"]),
+        ("\u{5f}\u{d}", &["\u{5f}", "\u{d}"]), ("\u{5f}\u{308}\u{d}", &["\u{5f}\u{308}", "\u{d}"]),
+        ("\u{5f}\u{a}", &["\u{5f}", "\u{a}"]), ("\u{5f}\u{308}\u{a}", &["\u{5f}\u{308}", "\u{a}"]),
+        ("\u{5f}\u{b}", &["\u{5f}", "\u{b}"]), ("\u{5f}\u{308}\u{b}", &["\u{5f}\u{308}", "\u{b}"]),
+        ("\u{5f}\u{3031}", &["\u{5f}\u{3031}"]), ("\u{5f}\u{308}\u{3031}",
+        &["\u{5f}\u{308}\u{3031}"]), ("\u{5f}\u{41}", &["\u{5f}\u{41}"]), ("\u{5f}\u{308}\u{41}",
+        &["\u{5f}\u{308}\u{41}"]), ("\u{5f}\u{3a}", &["\u{5f}", "\u{3a}"]), ("\u{5f}\u{308}\u{3a}",
+        &["\u{5f}\u{308}", "\u{3a}"]), ("\u{5f}\u{2c}", &["\u{5f}", "\u{2c}"]),
+        ("\u{5f}\u{308}\u{2c}", &["\u{5f}\u{308}", "\u{2c}"]), ("\u{5f}\u{2e}", &["\u{5f}",
+        "\u{2e}"]), ("\u{5f}\u{308}\u{2e}", &["\u{5f}\u{308}", "\u{2e}"]), ("\u{5f}\u{30}",
+        &["\u{5f}\u{30}"]), ("\u{5f}\u{308}\u{30}", &["\u{5f}\u{308}\u{30}"]), ("\u{5f}\u{5f}",
+        &["\u{5f}\u{5f}"]), ("\u{5f}\u{308}\u{5f}", &["\u{5f}\u{308}\u{5f}"]), ("\u{5f}\u{1f1e6}",
+        &["\u{5f}", "\u{1f1e6}"]), ("\u{5f}\u{308}\u{1f1e6}", &["\u{5f}\u{308}", "\u{1f1e6}"]),
+        ("\u{5f}\u{5d0}", &["\u{5f}\u{5d0}"]), ("\u{5f}\u{308}\u{5d0}", &["\u{5f}\u{308}\u{5d0}"]),
+        ("\u{5f}\u{22}", &["\u{5f}", "\u{22}"]), ("\u{5f}\u{308}\u{22}", &["\u{5f}\u{308}",
+        "\u{22}"]), ("\u{5f}\u{27}", &["\u{5f}", "\u{27}"]), ("\u{5f}\u{308}\u{27}",
+        &["\u{5f}\u{308}", "\u{27}"]), ("\u{5f}\u{231a}", &["\u{5f}", "\u{231a}"]),
+        ("\u{5f}\u{308}\u{231a}", &["\u{5f}\u{308}", "\u{231a}"]), ("\u{5f}\u{20}", &["\u{5f}",
+        "\u{20}"]), ("\u{5f}\u{308}\u{20}", &["\u{5f}\u{308}", "\u{20}"]), ("\u{5f}\u{ad}",
+        &["\u{5f}\u{ad}"]), ("\u{5f}\u{308}\u{ad}", &["\u{5f}\u{308}\u{ad}"]), ("\u{5f}\u{300}",
+        &["\u{5f}\u{300}"]), ("\u{5f}\u{308}\u{300}", &["\u{5f}\u{308}\u{300}"]), ("\u{5f}\u{200d}",
+        &["\u{5f}\u{200d}"]), ("\u{5f}\u{308}\u{200d}", &["\u{5f}\u{308}\u{200d}"]),
+        ("\u{5f}\u{61}\u{2060}", &["\u{5f}\u{61}\u{2060}"]), ("\u{5f}\u{308}\u{61}\u{2060}",
+        &["\u{5f}\u{308}\u{61}\u{2060}"]), ("\u{5f}\u{61}\u{3a}", &["\u{5f}\u{61}", "\u{3a}"]),
+        ("\u{5f}\u{308}\u{61}\u{3a}", &["\u{5f}\u{308}\u{61}", "\u{3a}"]), ("\u{5f}\u{61}\u{27}",
+        &["\u{5f}\u{61}", "\u{27}"]), ("\u{5f}\u{308}\u{61}\u{27}", &["\u{5f}\u{308}\u{61}",
+        "\u{27}"]), ("\u{5f}\u{61}\u{27}\u{2060}", &["\u{5f}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{5f}\u{308}\u{61}\u{27}\u{2060}", &["\u{5f}\u{308}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{5f}\u{61}\u{2c}", &["\u{5f}\u{61}", "\u{2c}"]), ("\u{5f}\u{308}\u{61}\u{2c}",
+        &["\u{5f}\u{308}\u{61}", "\u{2c}"]), ("\u{5f}\u{31}\u{3a}", &["\u{5f}\u{31}", "\u{3a}"]),
+        ("\u{5f}\u{308}\u{31}\u{3a}", &["\u{5f}\u{308}\u{31}", "\u{3a}"]), ("\u{5f}\u{31}\u{27}",
+        &["\u{5f}\u{31}", "\u{27}"]), ("\u{5f}\u{308}\u{31}\u{27}", &["\u{5f}\u{308}\u{31}",
+        "\u{27}"]), ("\u{5f}\u{31}\u{2c}", &["\u{5f}\u{31}", "\u{2c}"]),
+        ("\u{5f}\u{308}\u{31}\u{2c}", &["\u{5f}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{5f}\u{31}\u{2e}\u{2060}", &["\u{5f}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{5f}\u{308}\u{31}\u{2e}\u{2060}", &["\u{5f}\u{308}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{1f1e6}\u{1}", &["\u{1f1e6}", "\u{1}"]), ("\u{1f1e6}\u{308}\u{1}", &["\u{1f1e6}\u{308}",
+        "\u{1}"]), ("\u{1f1e6}\u{d}", &["\u{1f1e6}", "\u{d}"]), ("\u{1f1e6}\u{308}\u{d}",
+        &["\u{1f1e6}\u{308}", "\u{d}"]), ("\u{1f1e6}\u{a}", &["\u{1f1e6}", "\u{a}"]),
+        ("\u{1f1e6}\u{308}\u{a}", &["\u{1f1e6}\u{308}", "\u{a}"]), ("\u{1f1e6}\u{b}", &["\u{1f1e6}",
+        "\u{b}"]), ("\u{1f1e6}\u{308}\u{b}", &["\u{1f1e6}\u{308}", "\u{b}"]), ("\u{1f1e6}\u{3031}",
+        &["\u{1f1e6}", "\u{3031}"]), ("\u{1f1e6}\u{308}\u{3031}", &["\u{1f1e6}\u{308}",
+        "\u{3031}"]), ("\u{1f1e6}\u{41}", &["\u{1f1e6}", "\u{41}"]), ("\u{1f1e6}\u{308}\u{41}",
+        &["\u{1f1e6}\u{308}", "\u{41}"]), ("\u{1f1e6}\u{3a}", &["\u{1f1e6}", "\u{3a}"]),
+        ("\u{1f1e6}\u{308}\u{3a}", &["\u{1f1e6}\u{308}", "\u{3a}"]), ("\u{1f1e6}\u{2c}",
+        &["\u{1f1e6}", "\u{2c}"]), ("\u{1f1e6}\u{308}\u{2c}", &["\u{1f1e6}\u{308}", "\u{2c}"]),
+        ("\u{1f1e6}\u{2e}", &["\u{1f1e6}", "\u{2e}"]), ("\u{1f1e6}\u{308}\u{2e}",
+        &["\u{1f1e6}\u{308}", "\u{2e}"]), ("\u{1f1e6}\u{30}", &["\u{1f1e6}", "\u{30}"]),
+        ("\u{1f1e6}\u{308}\u{30}", &["\u{1f1e6}\u{308}", "\u{30}"]), ("\u{1f1e6}\u{5f}",
+        &["\u{1f1e6}", "\u{5f}"]), ("\u{1f1e6}\u{308}\u{5f}", &["\u{1f1e6}\u{308}", "\u{5f}"]),
+        ("\u{1f1e6}\u{1f1e6}", &["\u{1f1e6}\u{1f1e6}"]), ("\u{1f1e6}\u{308}\u{1f1e6}",
+        &["\u{1f1e6}\u{308}\u{1f1e6}"]), ("\u{1f1e6}\u{5d0}", &["\u{1f1e6}", "\u{5d0}"]),
+        ("\u{1f1e6}\u{308}\u{5d0}", &["\u{1f1e6}\u{308}", "\u{5d0}"]), ("\u{1f1e6}\u{22}",
+        &["\u{1f1e6}", "\u{22}"]), ("\u{1f1e6}\u{308}\u{22}", &["\u{1f1e6}\u{308}", "\u{22}"]),
+        ("\u{1f1e6}\u{27}", &["\u{1f1e6}", "\u{27}"]), ("\u{1f1e6}\u{308}\u{27}",
+        &["\u{1f1e6}\u{308}", "\u{27}"]), ("\u{1f1e6}\u{231a}", &["\u{1f1e6}", "\u{231a}"]),
+        ("\u{1f1e6}\u{308}\u{231a}", &["\u{1f1e6}\u{308}", "\u{231a}"]), ("\u{1f1e6}\u{20}",
+        &["\u{1f1e6}", "\u{20}"]), ("\u{1f1e6}\u{308}\u{20}", &["\u{1f1e6}\u{308}", "\u{20}"]),
+        ("\u{1f1e6}\u{ad}", &["\u{1f1e6}\u{ad}"]), ("\u{1f1e6}\u{308}\u{ad}",
+        &["\u{1f1e6}\u{308}\u{ad}"]), ("\u{1f1e6}\u{300}", &["\u{1f1e6}\u{300}"]),
+        ("\u{1f1e6}\u{308}\u{300}", &["\u{1f1e6}\u{308}\u{300}"]), ("\u{1f1e6}\u{200d}",
+        &["\u{1f1e6}\u{200d}"]), ("\u{1f1e6}\u{308}\u{200d}", &["\u{1f1e6}\u{308}\u{200d}"]),
+        ("\u{1f1e6}\u{61}\u{2060}", &["\u{1f1e6}", "\u{61}\u{2060}"]),
+        ("\u{1f1e6}\u{308}\u{61}\u{2060}", &["\u{1f1e6}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{1f1e6}\u{61}\u{3a}", &["\u{1f1e6}", "\u{61}", "\u{3a}"]),
+        ("\u{1f1e6}\u{308}\u{61}\u{3a}", &["\u{1f1e6}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{1f1e6}\u{61}\u{27}", &["\u{1f1e6}", "\u{61}", "\u{27}"]),
+        ("\u{1f1e6}\u{308}\u{61}\u{27}", &["\u{1f1e6}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{1f1e6}\u{61}\u{27}\u{2060}", &["\u{1f1e6}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{1f1e6}\u{308}\u{61}\u{27}\u{2060}", &["\u{1f1e6}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{1f1e6}\u{61}\u{2c}", &["\u{1f1e6}", "\u{61}", "\u{2c}"]),
+        ("\u{1f1e6}\u{308}\u{61}\u{2c}", &["\u{1f1e6}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{1f1e6}\u{31}\u{3a}", &["\u{1f1e6}", "\u{31}", "\u{3a}"]),
+        ("\u{1f1e6}\u{308}\u{31}\u{3a}", &["\u{1f1e6}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{1f1e6}\u{31}\u{27}", &["\u{1f1e6}", "\u{31}", "\u{27}"]),
+        ("\u{1f1e6}\u{308}\u{31}\u{27}", &["\u{1f1e6}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{1f1e6}\u{31}\u{2c}", &["\u{1f1e6}", "\u{31}", "\u{2c}"]),
+        ("\u{1f1e6}\u{308}\u{31}\u{2c}", &["\u{1f1e6}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{1f1e6}\u{31}\u{2e}\u{2060}", &["\u{1f1e6}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{1f1e6}\u{308}\u{31}\u{2e}\u{2060}", &["\u{1f1e6}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{5d0}\u{1}", &["\u{5d0}", "\u{1}"]), ("\u{5d0}\u{308}\u{1}", &["\u{5d0}\u{308}",
+        "\u{1}"]), ("\u{5d0}\u{d}", &["\u{5d0}", "\u{d}"]), ("\u{5d0}\u{308}\u{d}",
+        &["\u{5d0}\u{308}", "\u{d}"]), ("\u{5d0}\u{a}", &["\u{5d0}", "\u{a}"]),
+        ("\u{5d0}\u{308}\u{a}", &["\u{5d0}\u{308}", "\u{a}"]), ("\u{5d0}\u{b}", &["\u{5d0}",
+        "\u{b}"]), ("\u{5d0}\u{308}\u{b}", &["\u{5d0}\u{308}", "\u{b}"]), ("\u{5d0}\u{3031}",
+        &["\u{5d0}", "\u{3031}"]), ("\u{5d0}\u{308}\u{3031}", &["\u{5d0}\u{308}", "\u{3031}"]),
+        ("\u{5d0}\u{41}", &["\u{5d0}\u{41}"]), ("\u{5d0}\u{308}\u{41}", &["\u{5d0}\u{308}\u{41}"]),
+        ("\u{5d0}\u{3a}", &["\u{5d0}", "\u{3a}"]), ("\u{5d0}\u{308}\u{3a}", &["\u{5d0}\u{308}",
+        "\u{3a}"]), ("\u{5d0}\u{2c}", &["\u{5d0}", "\u{2c}"]), ("\u{5d0}\u{308}\u{2c}",
+        &["\u{5d0}\u{308}", "\u{2c}"]), ("\u{5d0}\u{2e}", &["\u{5d0}", "\u{2e}"]),
+        ("\u{5d0}\u{308}\u{2e}", &["\u{5d0}\u{308}", "\u{2e}"]), ("\u{5d0}\u{30}",
+        &["\u{5d0}\u{30}"]), ("\u{5d0}\u{308}\u{30}", &["\u{5d0}\u{308}\u{30}"]), ("\u{5d0}\u{5f}",
+        &["\u{5d0}\u{5f}"]), ("\u{5d0}\u{308}\u{5f}", &["\u{5d0}\u{308}\u{5f}"]),
+        ("\u{5d0}\u{1f1e6}", &["\u{5d0}", "\u{1f1e6}"]), ("\u{5d0}\u{308}\u{1f1e6}",
+        &["\u{5d0}\u{308}", "\u{1f1e6}"]), ("\u{5d0}\u{5d0}", &["\u{5d0}\u{5d0}"]),
+        ("\u{5d0}\u{308}\u{5d0}", &["\u{5d0}\u{308}\u{5d0}"]), ("\u{5d0}\u{22}", &["\u{5d0}",
+        "\u{22}"]), ("\u{5d0}\u{308}\u{22}", &["\u{5d0}\u{308}", "\u{22}"]), ("\u{5d0}\u{27}",
+        &["\u{5d0}\u{27}"]), ("\u{5d0}\u{308}\u{27}", &["\u{5d0}\u{308}\u{27}"]),
+        ("\u{5d0}\u{231a}", &["\u{5d0}", "\u{231a}"]), ("\u{5d0}\u{308}\u{231a}",
+        &["\u{5d0}\u{308}", "\u{231a}"]), ("\u{5d0}\u{20}", &["\u{5d0}", "\u{20}"]),
+        ("\u{5d0}\u{308}\u{20}", &["\u{5d0}\u{308}", "\u{20}"]), ("\u{5d0}\u{ad}",
+        &["\u{5d0}\u{ad}"]), ("\u{5d0}\u{308}\u{ad}", &["\u{5d0}\u{308}\u{ad}"]), ("\u{5d0}\u{300}",
+        &["\u{5d0}\u{300}"]), ("\u{5d0}\u{308}\u{300}", &["\u{5d0}\u{308}\u{300}"]),
+        ("\u{5d0}\u{200d}", &["\u{5d0}\u{200d}"]), ("\u{5d0}\u{308}\u{200d}",
+        &["\u{5d0}\u{308}\u{200d}"]), ("\u{5d0}\u{61}\u{2060}", &["\u{5d0}\u{61}\u{2060}"]),
+        ("\u{5d0}\u{308}\u{61}\u{2060}", &["\u{5d0}\u{308}\u{61}\u{2060}"]), ("\u{5d0}\u{61}\u{3a}",
+        &["\u{5d0}\u{61}", "\u{3a}"]), ("\u{5d0}\u{308}\u{61}\u{3a}", &["\u{5d0}\u{308}\u{61}",
+        "\u{3a}"]), ("\u{5d0}\u{61}\u{27}", &["\u{5d0}\u{61}", "\u{27}"]),
+        ("\u{5d0}\u{308}\u{61}\u{27}", &["\u{5d0}\u{308}\u{61}", "\u{27}"]),
+        ("\u{5d0}\u{61}\u{27}\u{2060}", &["\u{5d0}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{5d0}\u{308}\u{61}\u{27}\u{2060}", &["\u{5d0}\u{308}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{5d0}\u{61}\u{2c}", &["\u{5d0}\u{61}", "\u{2c}"]), ("\u{5d0}\u{308}\u{61}\u{2c}",
+        &["\u{5d0}\u{308}\u{61}", "\u{2c}"]), ("\u{5d0}\u{31}\u{3a}", &["\u{5d0}\u{31}", "\u{3a}"]),
+        ("\u{5d0}\u{308}\u{31}\u{3a}", &["\u{5d0}\u{308}\u{31}", "\u{3a}"]), ("\u{5d0}\u{31}\u{27}",
+        &["\u{5d0}\u{31}", "\u{27}"]), ("\u{5d0}\u{308}\u{31}\u{27}", &["\u{5d0}\u{308}\u{31}",
+        "\u{27}"]), ("\u{5d0}\u{31}\u{2c}", &["\u{5d0}\u{31}", "\u{2c}"]),
+        ("\u{5d0}\u{308}\u{31}\u{2c}", &["\u{5d0}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{5d0}\u{31}\u{2e}\u{2060}", &["\u{5d0}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{5d0}\u{308}\u{31}\u{2e}\u{2060}", &["\u{5d0}\u{308}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{22}\u{1}", &["\u{22}", "\u{1}"]), ("\u{22}\u{308}\u{1}", &["\u{22}\u{308}", "\u{1}"]),
+        ("\u{22}\u{d}", &["\u{22}", "\u{d}"]), ("\u{22}\u{308}\u{d}", &["\u{22}\u{308}", "\u{d}"]),
+        ("\u{22}\u{a}", &["\u{22}", "\u{a}"]), ("\u{22}\u{308}\u{a}", &["\u{22}\u{308}", "\u{a}"]),
+        ("\u{22}\u{b}", &["\u{22}", "\u{b}"]), ("\u{22}\u{308}\u{b}", &["\u{22}\u{308}", "\u{b}"]),
+        ("\u{22}\u{3031}", &["\u{22}", "\u{3031}"]), ("\u{22}\u{308}\u{3031}", &["\u{22}\u{308}",
+        "\u{3031}"]), ("\u{22}\u{41}", &["\u{22}", "\u{41}"]), ("\u{22}\u{308}\u{41}",
+        &["\u{22}\u{308}", "\u{41}"]), ("\u{22}\u{3a}", &["\u{22}", "\u{3a}"]),
+        ("\u{22}\u{308}\u{3a}", &["\u{22}\u{308}", "\u{3a}"]), ("\u{22}\u{2c}", &["\u{22}",
+        "\u{2c}"]), ("\u{22}\u{308}\u{2c}", &["\u{22}\u{308}", "\u{2c}"]), ("\u{22}\u{2e}",
+        &["\u{22}", "\u{2e}"]), ("\u{22}\u{308}\u{2e}", &["\u{22}\u{308}", "\u{2e}"]),
+        ("\u{22}\u{30}", &["\u{22}", "\u{30}"]), ("\u{22}\u{308}\u{30}", &["\u{22}\u{308}",
+        "\u{30}"]), ("\u{22}\u{5f}", &["\u{22}", "\u{5f}"]), ("\u{22}\u{308}\u{5f}",
+        &["\u{22}\u{308}", "\u{5f}"]), ("\u{22}\u{1f1e6}", &["\u{22}", "\u{1f1e6}"]),
+        ("\u{22}\u{308}\u{1f1e6}", &["\u{22}\u{308}", "\u{1f1e6}"]), ("\u{22}\u{5d0}", &["\u{22}",
+        "\u{5d0}"]), ("\u{22}\u{308}\u{5d0}", &["\u{22}\u{308}", "\u{5d0}"]), ("\u{22}\u{22}",
+        &["\u{22}", "\u{22}"]), ("\u{22}\u{308}\u{22}", &["\u{22}\u{308}", "\u{22}"]),
+        ("\u{22}\u{27}", &["\u{22}", "\u{27}"]), ("\u{22}\u{308}\u{27}", &["\u{22}\u{308}",
+        "\u{27}"]), ("\u{22}\u{231a}", &["\u{22}", "\u{231a}"]), ("\u{22}\u{308}\u{231a}",
+        &["\u{22}\u{308}", "\u{231a}"]), ("\u{22}\u{20}", &["\u{22}", "\u{20}"]),
+        ("\u{22}\u{308}\u{20}", &["\u{22}\u{308}", "\u{20}"]), ("\u{22}\u{ad}", &["\u{22}\u{ad}"]),
+        ("\u{22}\u{308}\u{ad}", &["\u{22}\u{308}\u{ad}"]), ("\u{22}\u{300}", &["\u{22}\u{300}"]),
+        ("\u{22}\u{308}\u{300}", &["\u{22}\u{308}\u{300}"]), ("\u{22}\u{200d}",
+        &["\u{22}\u{200d}"]), ("\u{22}\u{308}\u{200d}", &["\u{22}\u{308}\u{200d}"]),
+        ("\u{22}\u{61}\u{2060}", &["\u{22}", "\u{61}\u{2060}"]), ("\u{22}\u{308}\u{61}\u{2060}",
+        &["\u{22}\u{308}", "\u{61}\u{2060}"]), ("\u{22}\u{61}\u{3a}", &["\u{22}", "\u{61}",
+        "\u{3a}"]), ("\u{22}\u{308}\u{61}\u{3a}", &["\u{22}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{22}\u{61}\u{27}", &["\u{22}", "\u{61}", "\u{27}"]), ("\u{22}\u{308}\u{61}\u{27}",
+        &["\u{22}\u{308}", "\u{61}", "\u{27}"]), ("\u{22}\u{61}\u{27}\u{2060}", &["\u{22}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{22}\u{308}\u{61}\u{27}\u{2060}", &["\u{22}\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{22}\u{61}\u{2c}", &["\u{22}", "\u{61}", "\u{2c}"]),
+        ("\u{22}\u{308}\u{61}\u{2c}", &["\u{22}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{22}\u{31}\u{3a}", &["\u{22}", "\u{31}", "\u{3a}"]), ("\u{22}\u{308}\u{31}\u{3a}",
+        &["\u{22}\u{308}", "\u{31}", "\u{3a}"]), ("\u{22}\u{31}\u{27}", &["\u{22}", "\u{31}",
+        "\u{27}"]), ("\u{22}\u{308}\u{31}\u{27}", &["\u{22}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{22}\u{31}\u{2c}", &["\u{22}", "\u{31}", "\u{2c}"]), ("\u{22}\u{308}\u{31}\u{2c}",
+        &["\u{22}\u{308}", "\u{31}", "\u{2c}"]), ("\u{22}\u{31}\u{2e}\u{2060}", &["\u{22}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{22}\u{308}\u{31}\u{2e}\u{2060}", &["\u{22}\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{27}\u{1}", &["\u{27}", "\u{1}"]), ("\u{27}\u{308}\u{1}",
+        &["\u{27}\u{308}", "\u{1}"]), ("\u{27}\u{d}", &["\u{27}", "\u{d}"]), ("\u{27}\u{308}\u{d}",
+        &["\u{27}\u{308}", "\u{d}"]), ("\u{27}\u{a}", &["\u{27}", "\u{a}"]), ("\u{27}\u{308}\u{a}",
+        &["\u{27}\u{308}", "\u{a}"]), ("\u{27}\u{b}", &["\u{27}", "\u{b}"]), ("\u{27}\u{308}\u{b}",
+        &["\u{27}\u{308}", "\u{b}"]), ("\u{27}\u{3031}", &["\u{27}", "\u{3031}"]),
+        ("\u{27}\u{308}\u{3031}", &["\u{27}\u{308}", "\u{3031}"]), ("\u{27}\u{41}", &["\u{27}",
+        "\u{41}"]), ("\u{27}\u{308}\u{41}", &["\u{27}\u{308}", "\u{41}"]), ("\u{27}\u{3a}",
+        &["\u{27}", "\u{3a}"]), ("\u{27}\u{308}\u{3a}", &["\u{27}\u{308}", "\u{3a}"]),
+        ("\u{27}\u{2c}", &["\u{27}", "\u{2c}"]), ("\u{27}\u{308}\u{2c}", &["\u{27}\u{308}",
+        "\u{2c}"]), ("\u{27}\u{2e}", &["\u{27}", "\u{2e}"]), ("\u{27}\u{308}\u{2e}",
+        &["\u{27}\u{308}", "\u{2e}"]), ("\u{27}\u{30}", &["\u{27}", "\u{30}"]),
+        ("\u{27}\u{308}\u{30}", &["\u{27}\u{308}", "\u{30}"]), ("\u{27}\u{5f}", &["\u{27}",
+        "\u{5f}"]), ("\u{27}\u{308}\u{5f}", &["\u{27}\u{308}", "\u{5f}"]), ("\u{27}\u{1f1e6}",
+        &["\u{27}", "\u{1f1e6}"]), ("\u{27}\u{308}\u{1f1e6}", &["\u{27}\u{308}", "\u{1f1e6}"]),
+        ("\u{27}\u{5d0}", &["\u{27}", "\u{5d0}"]), ("\u{27}\u{308}\u{5d0}", &["\u{27}\u{308}",
+        "\u{5d0}"]), ("\u{27}\u{22}", &["\u{27}", "\u{22}"]), ("\u{27}\u{308}\u{22}",
+        &["\u{27}\u{308}", "\u{22}"]), ("\u{27}\u{27}", &["\u{27}", "\u{27}"]),
+        ("\u{27}\u{308}\u{27}", &["\u{27}\u{308}", "\u{27}"]), ("\u{27}\u{231a}", &["\u{27}",
+        "\u{231a}"]), ("\u{27}\u{308}\u{231a}", &["\u{27}\u{308}", "\u{231a}"]), ("\u{27}\u{20}",
+        &["\u{27}", "\u{20}"]), ("\u{27}\u{308}\u{20}", &["\u{27}\u{308}", "\u{20}"]),
+        ("\u{27}\u{ad}", &["\u{27}\u{ad}"]), ("\u{27}\u{308}\u{ad}", &["\u{27}\u{308}\u{ad}"]),
+        ("\u{27}\u{300}", &["\u{27}\u{300}"]), ("\u{27}\u{308}\u{300}", &["\u{27}\u{308}\u{300}"]),
+        ("\u{27}\u{200d}", &["\u{27}\u{200d}"]), ("\u{27}\u{308}\u{200d}",
+        &["\u{27}\u{308}\u{200d}"]), ("\u{27}\u{61}\u{2060}", &["\u{27}", "\u{61}\u{2060}"]),
+        ("\u{27}\u{308}\u{61}\u{2060}", &["\u{27}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{27}\u{61}\u{3a}", &["\u{27}", "\u{61}", "\u{3a}"]), ("\u{27}\u{308}\u{61}\u{3a}",
+        &["\u{27}\u{308}", "\u{61}", "\u{3a}"]), ("\u{27}\u{61}\u{27}", &["\u{27}", "\u{61}",
+        "\u{27}"]), ("\u{27}\u{308}\u{61}\u{27}", &["\u{27}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{27}\u{61}\u{27}\u{2060}", &["\u{27}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{27}\u{308}\u{61}\u{27}\u{2060}", &["\u{27}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{27}\u{61}\u{2c}", &["\u{27}", "\u{61}", "\u{2c}"]), ("\u{27}\u{308}\u{61}\u{2c}",
+        &["\u{27}\u{308}", "\u{61}", "\u{2c}"]), ("\u{27}\u{31}\u{3a}", &["\u{27}", "\u{31}",
+        "\u{3a}"]), ("\u{27}\u{308}\u{31}\u{3a}", &["\u{27}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{27}\u{31}\u{27}", &["\u{27}", "\u{31}", "\u{27}"]), ("\u{27}\u{308}\u{31}\u{27}",
+        &["\u{27}\u{308}", "\u{31}", "\u{27}"]), ("\u{27}\u{31}\u{2c}", &["\u{27}", "\u{31}",
+        "\u{2c}"]), ("\u{27}\u{308}\u{31}\u{2c}", &["\u{27}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{27}\u{31}\u{2e}\u{2060}", &["\u{27}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{27}\u{308}\u{31}\u{2e}\u{2060}", &["\u{27}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{231a}\u{1}", &["\u{231a}", "\u{1}"]), ("\u{231a}\u{308}\u{1}", &["\u{231a}\u{308}",
+        "\u{1}"]), ("\u{231a}\u{d}", &["\u{231a}", "\u{d}"]), ("\u{231a}\u{308}\u{d}",
+        &["\u{231a}\u{308}", "\u{d}"]), ("\u{231a}\u{a}", &["\u{231a}", "\u{a}"]),
+        ("\u{231a}\u{308}\u{a}", &["\u{231a}\u{308}", "\u{a}"]), ("\u{231a}\u{b}", &["\u{231a}",
+        "\u{b}"]), ("\u{231a}\u{308}\u{b}", &["\u{231a}\u{308}", "\u{b}"]), ("\u{231a}\u{3031}",
+        &["\u{231a}", "\u{3031}"]), ("\u{231a}\u{308}\u{3031}", &["\u{231a}\u{308}", "\u{3031}"]),
+        ("\u{231a}\u{41}", &["\u{231a}", "\u{41}"]), ("\u{231a}\u{308}\u{41}", &["\u{231a}\u{308}",
+        "\u{41}"]), ("\u{231a}\u{3a}", &["\u{231a}", "\u{3a}"]), ("\u{231a}\u{308}\u{3a}",
+        &["\u{231a}\u{308}", "\u{3a}"]), ("\u{231a}\u{2c}", &["\u{231a}", "\u{2c}"]),
+        ("\u{231a}\u{308}\u{2c}", &["\u{231a}\u{308}", "\u{2c}"]), ("\u{231a}\u{2e}", &["\u{231a}",
+        "\u{2e}"]), ("\u{231a}\u{308}\u{2e}", &["\u{231a}\u{308}", "\u{2e}"]), ("\u{231a}\u{30}",
+        &["\u{231a}", "\u{30}"]), ("\u{231a}\u{308}\u{30}", &["\u{231a}\u{308}", "\u{30}"]),
+        ("\u{231a}\u{5f}", &["\u{231a}", "\u{5f}"]), ("\u{231a}\u{308}\u{5f}", &["\u{231a}\u{308}",
+        "\u{5f}"]), ("\u{231a}\u{1f1e6}", &["\u{231a}", "\u{1f1e6}"]), ("\u{231a}\u{308}\u{1f1e6}",
+        &["\u{231a}\u{308}", "\u{1f1e6}"]), ("\u{231a}\u{5d0}", &["\u{231a}", "\u{5d0}"]),
+        ("\u{231a}\u{308}\u{5d0}", &["\u{231a}\u{308}", "\u{5d0}"]), ("\u{231a}\u{22}",
+        &["\u{231a}", "\u{22}"]), ("\u{231a}\u{308}\u{22}", &["\u{231a}\u{308}", "\u{22}"]),
+        ("\u{231a}\u{27}", &["\u{231a}", "\u{27}"]), ("\u{231a}\u{308}\u{27}", &["\u{231a}\u{308}",
+        "\u{27}"]), ("\u{231a}\u{231a}", &["\u{231a}", "\u{231a}"]), ("\u{231a}\u{308}\u{231a}",
+        &["\u{231a}\u{308}", "\u{231a}"]), ("\u{231a}\u{20}", &["\u{231a}", "\u{20}"]),
+        ("\u{231a}\u{308}\u{20}", &["\u{231a}\u{308}", "\u{20}"]), ("\u{231a}\u{ad}",
+        &["\u{231a}\u{ad}"]), ("\u{231a}\u{308}\u{ad}", &["\u{231a}\u{308}\u{ad}"]),
+        ("\u{231a}\u{300}", &["\u{231a}\u{300}"]), ("\u{231a}\u{308}\u{300}",
+        &["\u{231a}\u{308}\u{300}"]), ("\u{231a}\u{200d}", &["\u{231a}\u{200d}"]),
+        ("\u{231a}\u{308}\u{200d}", &["\u{231a}\u{308}\u{200d}"]), ("\u{231a}\u{61}\u{2060}",
+        &["\u{231a}", "\u{61}\u{2060}"]), ("\u{231a}\u{308}\u{61}\u{2060}", &["\u{231a}\u{308}",
+        "\u{61}\u{2060}"]), ("\u{231a}\u{61}\u{3a}", &["\u{231a}", "\u{61}", "\u{3a}"]),
+        ("\u{231a}\u{308}\u{61}\u{3a}", &["\u{231a}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{231a}\u{61}\u{27}", &["\u{231a}", "\u{61}", "\u{27}"]), ("\u{231a}\u{308}\u{61}\u{27}",
+        &["\u{231a}\u{308}", "\u{61}", "\u{27}"]), ("\u{231a}\u{61}\u{27}\u{2060}", &["\u{231a}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{231a}\u{308}\u{61}\u{27}\u{2060}", &["\u{231a}\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{231a}\u{61}\u{2c}", &["\u{231a}", "\u{61}", "\u{2c}"]),
+        ("\u{231a}\u{308}\u{61}\u{2c}", &["\u{231a}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{231a}\u{31}\u{3a}", &["\u{231a}", "\u{31}", "\u{3a}"]), ("\u{231a}\u{308}\u{31}\u{3a}",
+        &["\u{231a}\u{308}", "\u{31}", "\u{3a}"]), ("\u{231a}\u{31}\u{27}", &["\u{231a}", "\u{31}",
+        "\u{27}"]), ("\u{231a}\u{308}\u{31}\u{27}", &["\u{231a}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{231a}\u{31}\u{2c}", &["\u{231a}", "\u{31}", "\u{2c}"]), ("\u{231a}\u{308}\u{31}\u{2c}",
+        &["\u{231a}\u{308}", "\u{31}", "\u{2c}"]), ("\u{231a}\u{31}\u{2e}\u{2060}", &["\u{231a}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{231a}\u{308}\u{31}\u{2e}\u{2060}", &["\u{231a}\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{20}\u{1}", &["\u{20}", "\u{1}"]), ("\u{20}\u{308}\u{1}",
+        &["\u{20}\u{308}", "\u{1}"]), ("\u{20}\u{d}", &["\u{20}", "\u{d}"]), ("\u{20}\u{308}\u{d}",
+        &["\u{20}\u{308}", "\u{d}"]), ("\u{20}\u{a}", &["\u{20}", "\u{a}"]), ("\u{20}\u{308}\u{a}",
+        &["\u{20}\u{308}", "\u{a}"]), ("\u{20}\u{b}", &["\u{20}", "\u{b}"]), ("\u{20}\u{308}\u{b}",
+        &["\u{20}\u{308}", "\u{b}"]), ("\u{20}\u{3031}", &["\u{20}", "\u{3031}"]),
+        ("\u{20}\u{308}\u{3031}", &["\u{20}\u{308}", "\u{3031}"]), ("\u{20}\u{41}", &["\u{20}",
+        "\u{41}"]), ("\u{20}\u{308}\u{41}", &["\u{20}\u{308}", "\u{41}"]), ("\u{20}\u{3a}",
+        &["\u{20}", "\u{3a}"]), ("\u{20}\u{308}\u{3a}", &["\u{20}\u{308}", "\u{3a}"]),
+        ("\u{20}\u{2c}", &["\u{20}", "\u{2c}"]), ("\u{20}\u{308}\u{2c}", &["\u{20}\u{308}",
+        "\u{2c}"]), ("\u{20}\u{2e}", &["\u{20}", "\u{2e}"]), ("\u{20}\u{308}\u{2e}",
+        &["\u{20}\u{308}", "\u{2e}"]), ("\u{20}\u{30}", &["\u{20}", "\u{30}"]),
+        ("\u{20}\u{308}\u{30}", &["\u{20}\u{308}", "\u{30}"]), ("\u{20}\u{5f}", &["\u{20}",
+        "\u{5f}"]), ("\u{20}\u{308}\u{5f}", &["\u{20}\u{308}", "\u{5f}"]), ("\u{20}\u{1f1e6}",
+        &["\u{20}", "\u{1f1e6}"]), ("\u{20}\u{308}\u{1f1e6}", &["\u{20}\u{308}", "\u{1f1e6}"]),
+        ("\u{20}\u{5d0}", &["\u{20}", "\u{5d0}"]), ("\u{20}\u{308}\u{5d0}", &["\u{20}\u{308}",
+        "\u{5d0}"]), ("\u{20}\u{22}", &["\u{20}", "\u{22}"]), ("\u{20}\u{308}\u{22}",
+        &["\u{20}\u{308}", "\u{22}"]), ("\u{20}\u{27}", &["\u{20}", "\u{27}"]),
+        ("\u{20}\u{308}\u{27}", &["\u{20}\u{308}", "\u{27}"]), ("\u{20}\u{231a}", &["\u{20}",
+        "\u{231a}"]), ("\u{20}\u{308}\u{231a}", &["\u{20}\u{308}", "\u{231a}"]), ("\u{20}\u{20}",
+        &["\u{20}\u{20}"]), ("\u{20}\u{308}\u{20}", &["\u{20}\u{308}", "\u{20}"]), ("\u{20}\u{ad}",
+        &["\u{20}\u{ad}"]), ("\u{20}\u{308}\u{ad}", &["\u{20}\u{308}\u{ad}"]), ("\u{20}\u{300}",
+        &["\u{20}\u{300}"]), ("\u{20}\u{308}\u{300}", &["\u{20}\u{308}\u{300}"]), ("\u{20}\u{200d}",
+        &["\u{20}\u{200d}"]), ("\u{20}\u{308}\u{200d}", &["\u{20}\u{308}\u{200d}"]),
+        ("\u{20}\u{61}\u{2060}", &["\u{20}", "\u{61}\u{2060}"]), ("\u{20}\u{308}\u{61}\u{2060}",
+        &["\u{20}\u{308}", "\u{61}\u{2060}"]), ("\u{20}\u{61}\u{3a}", &["\u{20}", "\u{61}",
+        "\u{3a}"]), ("\u{20}\u{308}\u{61}\u{3a}", &["\u{20}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{20}\u{61}\u{27}", &["\u{20}", "\u{61}", "\u{27}"]), ("\u{20}\u{308}\u{61}\u{27}",
+        &["\u{20}\u{308}", "\u{61}", "\u{27}"]), ("\u{20}\u{61}\u{27}\u{2060}", &["\u{20}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{20}\u{308}\u{61}\u{27}\u{2060}", &["\u{20}\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{20}\u{61}\u{2c}", &["\u{20}", "\u{61}", "\u{2c}"]),
+        ("\u{20}\u{308}\u{61}\u{2c}", &["\u{20}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{20}\u{31}\u{3a}", &["\u{20}", "\u{31}", "\u{3a}"]), ("\u{20}\u{308}\u{31}\u{3a}",
+        &["\u{20}\u{308}", "\u{31}", "\u{3a}"]), ("\u{20}\u{31}\u{27}", &["\u{20}", "\u{31}",
+        "\u{27}"]), ("\u{20}\u{308}\u{31}\u{27}", &["\u{20}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{20}\u{31}\u{2c}", &["\u{20}", "\u{31}", "\u{2c}"]), ("\u{20}\u{308}\u{31}\u{2c}",
+        &["\u{20}\u{308}", "\u{31}", "\u{2c}"]), ("\u{20}\u{31}\u{2e}\u{2060}", &["\u{20}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{20}\u{308}\u{31}\u{2e}\u{2060}", &["\u{20}\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{ad}\u{1}", &["\u{ad}", "\u{1}"]), ("\u{ad}\u{308}\u{1}",
+        &["\u{ad}\u{308}", "\u{1}"]), ("\u{ad}\u{d}", &["\u{ad}", "\u{d}"]), ("\u{ad}\u{308}\u{d}",
+        &["\u{ad}\u{308}", "\u{d}"]), ("\u{ad}\u{a}", &["\u{ad}", "\u{a}"]), ("\u{ad}\u{308}\u{a}",
+        &["\u{ad}\u{308}", "\u{a}"]), ("\u{ad}\u{b}", &["\u{ad}", "\u{b}"]), ("\u{ad}\u{308}\u{b}",
+        &["\u{ad}\u{308}", "\u{b}"]), ("\u{ad}\u{3031}", &["\u{ad}", "\u{3031}"]),
+        ("\u{ad}\u{308}\u{3031}", &["\u{ad}\u{308}", "\u{3031}"]), ("\u{ad}\u{41}", &["\u{ad}",
+        "\u{41}"]), ("\u{ad}\u{308}\u{41}", &["\u{ad}\u{308}", "\u{41}"]), ("\u{ad}\u{3a}",
+        &["\u{ad}", "\u{3a}"]), ("\u{ad}\u{308}\u{3a}", &["\u{ad}\u{308}", "\u{3a}"]),
+        ("\u{ad}\u{2c}", &["\u{ad}", "\u{2c}"]), ("\u{ad}\u{308}\u{2c}", &["\u{ad}\u{308}",
+        "\u{2c}"]), ("\u{ad}\u{2e}", &["\u{ad}", "\u{2e}"]), ("\u{ad}\u{308}\u{2e}",
+        &["\u{ad}\u{308}", "\u{2e}"]), ("\u{ad}\u{30}", &["\u{ad}", "\u{30}"]),
+        ("\u{ad}\u{308}\u{30}", &["\u{ad}\u{308}", "\u{30}"]), ("\u{ad}\u{5f}", &["\u{ad}",
+        "\u{5f}"]), ("\u{ad}\u{308}\u{5f}", &["\u{ad}\u{308}", "\u{5f}"]), ("\u{ad}\u{1f1e6}",
+        &["\u{ad}", "\u{1f1e6}"]), ("\u{ad}\u{308}\u{1f1e6}", &["\u{ad}\u{308}", "\u{1f1e6}"]),
+        ("\u{ad}\u{5d0}", &["\u{ad}", "\u{5d0}"]), ("\u{ad}\u{308}\u{5d0}", &["\u{ad}\u{308}",
+        "\u{5d0}"]), ("\u{ad}\u{22}", &["\u{ad}", "\u{22}"]), ("\u{ad}\u{308}\u{22}",
+        &["\u{ad}\u{308}", "\u{22}"]), ("\u{ad}\u{27}", &["\u{ad}", "\u{27}"]),
+        ("\u{ad}\u{308}\u{27}", &["\u{ad}\u{308}", "\u{27}"]), ("\u{ad}\u{231a}", &["\u{ad}",
+        "\u{231a}"]), ("\u{ad}\u{308}\u{231a}", &["\u{ad}\u{308}", "\u{231a}"]), ("\u{ad}\u{20}",
+        &["\u{ad}", "\u{20}"]), ("\u{ad}\u{308}\u{20}", &["\u{ad}\u{308}", "\u{20}"]),
+        ("\u{ad}\u{ad}", &["\u{ad}\u{ad}"]), ("\u{ad}\u{308}\u{ad}", &["\u{ad}\u{308}\u{ad}"]),
+        ("\u{ad}\u{300}", &["\u{ad}\u{300}"]), ("\u{ad}\u{308}\u{300}", &["\u{ad}\u{308}\u{300}"]),
+        ("\u{ad}\u{200d}", &["\u{ad}\u{200d}"]), ("\u{ad}\u{308}\u{200d}",
+        &["\u{ad}\u{308}\u{200d}"]), ("\u{ad}\u{61}\u{2060}", &["\u{ad}", "\u{61}\u{2060}"]),
+        ("\u{ad}\u{308}\u{61}\u{2060}", &["\u{ad}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{ad}\u{61}\u{3a}", &["\u{ad}", "\u{61}", "\u{3a}"]), ("\u{ad}\u{308}\u{61}\u{3a}",
+        &["\u{ad}\u{308}", "\u{61}", "\u{3a}"]), ("\u{ad}\u{61}\u{27}", &["\u{ad}", "\u{61}",
+        "\u{27}"]), ("\u{ad}\u{308}\u{61}\u{27}", &["\u{ad}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{ad}\u{61}\u{27}\u{2060}", &["\u{ad}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{ad}\u{308}\u{61}\u{27}\u{2060}", &["\u{ad}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{ad}\u{61}\u{2c}", &["\u{ad}", "\u{61}", "\u{2c}"]), ("\u{ad}\u{308}\u{61}\u{2c}",
+        &["\u{ad}\u{308}", "\u{61}", "\u{2c}"]), ("\u{ad}\u{31}\u{3a}", &["\u{ad}", "\u{31}",
+        "\u{3a}"]), ("\u{ad}\u{308}\u{31}\u{3a}", &["\u{ad}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{ad}\u{31}\u{27}", &["\u{ad}", "\u{31}", "\u{27}"]), ("\u{ad}\u{308}\u{31}\u{27}",
+        &["\u{ad}\u{308}", "\u{31}", "\u{27}"]), ("\u{ad}\u{31}\u{2c}", &["\u{ad}", "\u{31}",
+        "\u{2c}"]), ("\u{ad}\u{308}\u{31}\u{2c}", &["\u{ad}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{ad}\u{31}\u{2e}\u{2060}", &["\u{ad}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{ad}\u{308}\u{31}\u{2e}\u{2060}", &["\u{ad}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{300}\u{1}", &["\u{300}", "\u{1}"]), ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}",
+        "\u{1}"]), ("\u{300}\u{d}", &["\u{300}", "\u{d}"]), ("\u{300}\u{308}\u{d}",
+        &["\u{300}\u{308}", "\u{d}"]), ("\u{300}\u{a}", &["\u{300}", "\u{a}"]),
+        ("\u{300}\u{308}\u{a}", &["\u{300}\u{308}", "\u{a}"]), ("\u{300}\u{b}", &["\u{300}",
+        "\u{b}"]), ("\u{300}\u{308}\u{b}", &["\u{300}\u{308}", "\u{b}"]), ("\u{300}\u{3031}",
+        &["\u{300}", "\u{3031}"]), ("\u{300}\u{308}\u{3031}", &["\u{300}\u{308}", "\u{3031}"]),
+        ("\u{300}\u{41}", &["\u{300}", "\u{41}"]), ("\u{300}\u{308}\u{41}", &["\u{300}\u{308}",
+        "\u{41}"]), ("\u{300}\u{3a}", &["\u{300}", "\u{3a}"]), ("\u{300}\u{308}\u{3a}",
+        &["\u{300}\u{308}", "\u{3a}"]), ("\u{300}\u{2c}", &["\u{300}", "\u{2c}"]),
+        ("\u{300}\u{308}\u{2c}", &["\u{300}\u{308}", "\u{2c}"]), ("\u{300}\u{2e}", &["\u{300}",
+        "\u{2e}"]), ("\u{300}\u{308}\u{2e}", &["\u{300}\u{308}", "\u{2e}"]), ("\u{300}\u{30}",
+        &["\u{300}", "\u{30}"]), ("\u{300}\u{308}\u{30}", &["\u{300}\u{308}", "\u{30}"]),
+        ("\u{300}\u{5f}", &["\u{300}", "\u{5f}"]), ("\u{300}\u{308}\u{5f}", &["\u{300}\u{308}",
+        "\u{5f}"]), ("\u{300}\u{1f1e6}", &["\u{300}", "\u{1f1e6}"]), ("\u{300}\u{308}\u{1f1e6}",
+        &["\u{300}\u{308}", "\u{1f1e6}"]), ("\u{300}\u{5d0}", &["\u{300}", "\u{5d0}"]),
+        ("\u{300}\u{308}\u{5d0}", &["\u{300}\u{308}", "\u{5d0}"]), ("\u{300}\u{22}", &["\u{300}",
+        "\u{22}"]), ("\u{300}\u{308}\u{22}", &["\u{300}\u{308}", "\u{22}"]), ("\u{300}\u{27}",
+        &["\u{300}", "\u{27}"]), ("\u{300}\u{308}\u{27}", &["\u{300}\u{308}", "\u{27}"]),
+        ("\u{300}\u{231a}", &["\u{300}", "\u{231a}"]), ("\u{300}\u{308}\u{231a}",
+        &["\u{300}\u{308}", "\u{231a}"]), ("\u{300}\u{20}", &["\u{300}", "\u{20}"]),
+        ("\u{300}\u{308}\u{20}", &["\u{300}\u{308}", "\u{20}"]), ("\u{300}\u{ad}",
+        &["\u{300}\u{ad}"]), ("\u{300}\u{308}\u{ad}", &["\u{300}\u{308}\u{ad}"]), ("\u{300}\u{300}",
+        &["\u{300}\u{300}"]), ("\u{300}\u{308}\u{300}", &["\u{300}\u{308}\u{300}"]),
+        ("\u{300}\u{200d}", &["\u{300}\u{200d}"]), ("\u{300}\u{308}\u{200d}",
+        &["\u{300}\u{308}\u{200d}"]), ("\u{300}\u{61}\u{2060}", &["\u{300}", "\u{61}\u{2060}"]),
+        ("\u{300}\u{308}\u{61}\u{2060}", &["\u{300}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{300}\u{61}\u{3a}", &["\u{300}", "\u{61}", "\u{3a}"]), ("\u{300}\u{308}\u{61}\u{3a}",
+        &["\u{300}\u{308}", "\u{61}", "\u{3a}"]), ("\u{300}\u{61}\u{27}", &["\u{300}", "\u{61}",
+        "\u{27}"]), ("\u{300}\u{308}\u{61}\u{27}", &["\u{300}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{300}\u{61}\u{27}\u{2060}", &["\u{300}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{300}\u{308}\u{61}\u{27}\u{2060}", &["\u{300}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{300}\u{61}\u{2c}", &["\u{300}", "\u{61}", "\u{2c}"]), ("\u{300}\u{308}\u{61}\u{2c}",
+        &["\u{300}\u{308}", "\u{61}", "\u{2c}"]), ("\u{300}\u{31}\u{3a}", &["\u{300}", "\u{31}",
+        "\u{3a}"]), ("\u{300}\u{308}\u{31}\u{3a}", &["\u{300}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{300}\u{31}\u{27}", &["\u{300}", "\u{31}", "\u{27}"]), ("\u{300}\u{308}\u{31}\u{27}",
+        &["\u{300}\u{308}", "\u{31}", "\u{27}"]), ("\u{300}\u{31}\u{2c}", &["\u{300}", "\u{31}",
+        "\u{2c}"]), ("\u{300}\u{308}\u{31}\u{2c}", &["\u{300}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{300}\u{31}\u{2e}\u{2060}", &["\u{300}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{300}\u{308}\u{31}\u{2e}\u{2060}", &["\u{300}\u{308}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{200d}\u{1}", &["\u{200d}", "\u{1}"]), ("\u{200d}\u{308}\u{1}", &["\u{200d}\u{308}",
+        "\u{1}"]), ("\u{200d}\u{d}", &["\u{200d}", "\u{d}"]), ("\u{200d}\u{308}\u{d}",
+        &["\u{200d}\u{308}", "\u{d}"]), ("\u{200d}\u{a}", &["\u{200d}", "\u{a}"]),
+        ("\u{200d}\u{308}\u{a}", &["\u{200d}\u{308}", "\u{a}"]), ("\u{200d}\u{b}", &["\u{200d}",
+        "\u{b}"]), ("\u{200d}\u{308}\u{b}", &["\u{200d}\u{308}", "\u{b}"]), ("\u{200d}\u{3031}",
+        &["\u{200d}", "\u{3031}"]), ("\u{200d}\u{308}\u{3031}", &["\u{200d}\u{308}", "\u{3031}"]),
+        ("\u{200d}\u{41}", &["\u{200d}", "\u{41}"]), ("\u{200d}\u{308}\u{41}", &["\u{200d}\u{308}",
+        "\u{41}"]), ("\u{200d}\u{3a}", &["\u{200d}", "\u{3a}"]), ("\u{200d}\u{308}\u{3a}",
+        &["\u{200d}\u{308}", "\u{3a}"]), ("\u{200d}\u{2c}", &["\u{200d}", "\u{2c}"]),
+        ("\u{200d}\u{308}\u{2c}", &["\u{200d}\u{308}", "\u{2c}"]), ("\u{200d}\u{2e}", &["\u{200d}",
+        "\u{2e}"]), ("\u{200d}\u{308}\u{2e}", &["\u{200d}\u{308}", "\u{2e}"]), ("\u{200d}\u{30}",
+        &["\u{200d}", "\u{30}"]), ("\u{200d}\u{308}\u{30}", &["\u{200d}\u{308}", "\u{30}"]),
+        ("\u{200d}\u{5f}", &["\u{200d}", "\u{5f}"]), ("\u{200d}\u{308}\u{5f}", &["\u{200d}\u{308}",
+        "\u{5f}"]), ("\u{200d}\u{1f1e6}", &["\u{200d}", "\u{1f1e6}"]), ("\u{200d}\u{308}\u{1f1e6}",
+        &["\u{200d}\u{308}", "\u{1f1e6}"]), ("\u{200d}\u{5d0}", &["\u{200d}", "\u{5d0}"]),
+        ("\u{200d}\u{308}\u{5d0}", &["\u{200d}\u{308}", "\u{5d0}"]), ("\u{200d}\u{22}",
+        &["\u{200d}", "\u{22}"]), ("\u{200d}\u{308}\u{22}", &["\u{200d}\u{308}", "\u{22}"]),
+        ("\u{200d}\u{27}", &["\u{200d}", "\u{27}"]), ("\u{200d}\u{308}\u{27}", &["\u{200d}\u{308}",
+        "\u{27}"]), ("\u{200d}\u{231a}", &["\u{200d}\u{231a}"]), ("\u{200d}\u{308}\u{231a}",
+        &["\u{200d}\u{308}", "\u{231a}"]), ("\u{200d}\u{20}", &["\u{200d}", "\u{20}"]),
+        ("\u{200d}\u{308}\u{20}", &["\u{200d}\u{308}", "\u{20}"]), ("\u{200d}\u{ad}",
+        &["\u{200d}\u{ad}"]), ("\u{200d}\u{308}\u{ad}", &["\u{200d}\u{308}\u{ad}"]),
+        ("\u{200d}\u{300}", &["\u{200d}\u{300}"]), ("\u{200d}\u{308}\u{300}",
+        &["\u{200d}\u{308}\u{300}"]), ("\u{200d}\u{200d}", &["\u{200d}\u{200d}"]),
+        ("\u{200d}\u{308}\u{200d}", &["\u{200d}\u{308}\u{200d}"]), ("\u{200d}\u{61}\u{2060}",
+        &["\u{200d}", "\u{61}\u{2060}"]), ("\u{200d}\u{308}\u{61}\u{2060}", &["\u{200d}\u{308}",
+        "\u{61}\u{2060}"]), ("\u{200d}\u{61}\u{3a}", &["\u{200d}", "\u{61}", "\u{3a}"]),
+        ("\u{200d}\u{308}\u{61}\u{3a}", &["\u{200d}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{200d}\u{61}\u{27}", &["\u{200d}", "\u{61}", "\u{27}"]), ("\u{200d}\u{308}\u{61}\u{27}",
+        &["\u{200d}\u{308}", "\u{61}", "\u{27}"]), ("\u{200d}\u{61}\u{27}\u{2060}", &["\u{200d}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{200d}\u{308}\u{61}\u{27}\u{2060}", &["\u{200d}\u{308}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{200d}\u{61}\u{2c}", &["\u{200d}", "\u{61}", "\u{2c}"]),
+        ("\u{200d}\u{308}\u{61}\u{2c}", &["\u{200d}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{200d}\u{31}\u{3a}", &["\u{200d}", "\u{31}", "\u{3a}"]), ("\u{200d}\u{308}\u{31}\u{3a}",
+        &["\u{200d}\u{308}", "\u{31}", "\u{3a}"]), ("\u{200d}\u{31}\u{27}", &["\u{200d}", "\u{31}",
+        "\u{27}"]), ("\u{200d}\u{308}\u{31}\u{27}", &["\u{200d}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{200d}\u{31}\u{2c}", &["\u{200d}", "\u{31}", "\u{2c}"]), ("\u{200d}\u{308}\u{31}\u{2c}",
+        &["\u{200d}\u{308}", "\u{31}", "\u{2c}"]), ("\u{200d}\u{31}\u{2e}\u{2060}", &["\u{200d}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{200d}\u{308}\u{31}\u{2e}\u{2060}", &["\u{200d}\u{308}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{61}\u{2060}\u{1}", &["\u{61}\u{2060}", "\u{1}"]),
+        ("\u{61}\u{2060}\u{308}\u{1}", &["\u{61}\u{2060}\u{308}", "\u{1}"]), ("\u{61}\u{2060}\u{d}",
+        &["\u{61}\u{2060}", "\u{d}"]), ("\u{61}\u{2060}\u{308}\u{d}", &["\u{61}\u{2060}\u{308}",
+        "\u{d}"]), ("\u{61}\u{2060}\u{a}", &["\u{61}\u{2060}", "\u{a}"]),
+        ("\u{61}\u{2060}\u{308}\u{a}", &["\u{61}\u{2060}\u{308}", "\u{a}"]), ("\u{61}\u{2060}\u{b}",
+        &["\u{61}\u{2060}", "\u{b}"]), ("\u{61}\u{2060}\u{308}\u{b}", &["\u{61}\u{2060}\u{308}",
+        "\u{b}"]), ("\u{61}\u{2060}\u{3031}", &["\u{61}\u{2060}", "\u{3031}"]),
+        ("\u{61}\u{2060}\u{308}\u{3031}", &["\u{61}\u{2060}\u{308}", "\u{3031}"]),
+        ("\u{61}\u{2060}\u{41}", &["\u{61}\u{2060}\u{41}"]), ("\u{61}\u{2060}\u{308}\u{41}",
+        &["\u{61}\u{2060}\u{308}\u{41}"]), ("\u{61}\u{2060}\u{3a}", &["\u{61}\u{2060}", "\u{3a}"]),
+        ("\u{61}\u{2060}\u{308}\u{3a}", &["\u{61}\u{2060}\u{308}", "\u{3a}"]),
+        ("\u{61}\u{2060}\u{2c}", &["\u{61}\u{2060}", "\u{2c}"]), ("\u{61}\u{2060}\u{308}\u{2c}",
+        &["\u{61}\u{2060}\u{308}", "\u{2c}"]), ("\u{61}\u{2060}\u{2e}", &["\u{61}\u{2060}",
+        "\u{2e}"]), ("\u{61}\u{2060}\u{308}\u{2e}", &["\u{61}\u{2060}\u{308}", "\u{2e}"]),
+        ("\u{61}\u{2060}\u{30}", &["\u{61}\u{2060}\u{30}"]), ("\u{61}\u{2060}\u{308}\u{30}",
+        &["\u{61}\u{2060}\u{308}\u{30}"]), ("\u{61}\u{2060}\u{5f}", &["\u{61}\u{2060}\u{5f}"]),
+        ("\u{61}\u{2060}\u{308}\u{5f}", &["\u{61}\u{2060}\u{308}\u{5f}"]),
+        ("\u{61}\u{2060}\u{1f1e6}", &["\u{61}\u{2060}", "\u{1f1e6}"]),
+        ("\u{61}\u{2060}\u{308}\u{1f1e6}", &["\u{61}\u{2060}\u{308}", "\u{1f1e6}"]),
+        ("\u{61}\u{2060}\u{5d0}", &["\u{61}\u{2060}\u{5d0}"]), ("\u{61}\u{2060}\u{308}\u{5d0}",
+        &["\u{61}\u{2060}\u{308}\u{5d0}"]), ("\u{61}\u{2060}\u{22}", &["\u{61}\u{2060}", "\u{22}"]),
+        ("\u{61}\u{2060}\u{308}\u{22}", &["\u{61}\u{2060}\u{308}", "\u{22}"]),
+        ("\u{61}\u{2060}\u{27}", &["\u{61}\u{2060}", "\u{27}"]), ("\u{61}\u{2060}\u{308}\u{27}",
+        &["\u{61}\u{2060}\u{308}", "\u{27}"]), ("\u{61}\u{2060}\u{231a}", &["\u{61}\u{2060}",
+        "\u{231a}"]), ("\u{61}\u{2060}\u{308}\u{231a}", &["\u{61}\u{2060}\u{308}", "\u{231a}"]),
+        ("\u{61}\u{2060}\u{20}", &["\u{61}\u{2060}", "\u{20}"]), ("\u{61}\u{2060}\u{308}\u{20}",
+        &["\u{61}\u{2060}\u{308}", "\u{20}"]), ("\u{61}\u{2060}\u{ad}", &["\u{61}\u{2060}\u{ad}"]),
+        ("\u{61}\u{2060}\u{308}\u{ad}", &["\u{61}\u{2060}\u{308}\u{ad}"]), ("\u{61}\u{2060}\u{300}",
+        &["\u{61}\u{2060}\u{300}"]), ("\u{61}\u{2060}\u{308}\u{300}",
+        &["\u{61}\u{2060}\u{308}\u{300}"]), ("\u{61}\u{2060}\u{200d}", &["\u{61}\u{2060}\u{200d}"]),
+        ("\u{61}\u{2060}\u{308}\u{200d}", &["\u{61}\u{2060}\u{308}\u{200d}"]),
+        ("\u{61}\u{2060}\u{61}\u{2060}", &["\u{61}\u{2060}\u{61}\u{2060}"]),
+        ("\u{61}\u{2060}\u{308}\u{61}\u{2060}", &["\u{61}\u{2060}\u{308}\u{61}\u{2060}"]),
+        ("\u{61}\u{2060}\u{61}\u{3a}", &["\u{61}\u{2060}\u{61}", "\u{3a}"]),
+        ("\u{61}\u{2060}\u{308}\u{61}\u{3a}", &["\u{61}\u{2060}\u{308}\u{61}", "\u{3a}"]),
+        ("\u{61}\u{2060}\u{61}\u{27}", &["\u{61}\u{2060}\u{61}", "\u{27}"]),
+        ("\u{61}\u{2060}\u{308}\u{61}\u{27}", &["\u{61}\u{2060}\u{308}\u{61}", "\u{27}"]),
+        ("\u{61}\u{2060}\u{61}\u{27}\u{2060}", &["\u{61}\u{2060}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{61}\u{2060}\u{308}\u{61}\u{27}\u{2060}", &["\u{61}\u{2060}\u{308}\u{61}",
+        "\u{27}\u{2060}"]), ("\u{61}\u{2060}\u{61}\u{2c}", &["\u{61}\u{2060}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{2060}\u{308}\u{61}\u{2c}", &["\u{61}\u{2060}\u{308}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{2060}\u{31}\u{3a}", &["\u{61}\u{2060}\u{31}", "\u{3a}"]),
+        ("\u{61}\u{2060}\u{308}\u{31}\u{3a}", &["\u{61}\u{2060}\u{308}\u{31}", "\u{3a}"]),
+        ("\u{61}\u{2060}\u{31}\u{27}", &["\u{61}\u{2060}\u{31}", "\u{27}"]),
+        ("\u{61}\u{2060}\u{308}\u{31}\u{27}", &["\u{61}\u{2060}\u{308}\u{31}", "\u{27}"]),
+        ("\u{61}\u{2060}\u{31}\u{2c}", &["\u{61}\u{2060}\u{31}", "\u{2c}"]),
+        ("\u{61}\u{2060}\u{308}\u{31}\u{2c}", &["\u{61}\u{2060}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{61}\u{2060}\u{31}\u{2e}\u{2060}", &["\u{61}\u{2060}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{61}\u{2060}\u{308}\u{31}\u{2e}\u{2060}", &["\u{61}\u{2060}\u{308}\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{61}\u{3a}\u{1}", &["\u{61}", "\u{3a}", "\u{1}"]),
+        ("\u{61}\u{3a}\u{308}\u{1}", &["\u{61}", "\u{3a}\u{308}", "\u{1}"]), ("\u{61}\u{3a}\u{d}",
+        &["\u{61}", "\u{3a}", "\u{d}"]), ("\u{61}\u{3a}\u{308}\u{d}", &["\u{61}", "\u{3a}\u{308}",
+        "\u{d}"]), ("\u{61}\u{3a}\u{a}", &["\u{61}", "\u{3a}", "\u{a}"]),
+        ("\u{61}\u{3a}\u{308}\u{a}", &["\u{61}", "\u{3a}\u{308}", "\u{a}"]), ("\u{61}\u{3a}\u{b}",
+        &["\u{61}", "\u{3a}", "\u{b}"]), ("\u{61}\u{3a}\u{308}\u{b}", &["\u{61}", "\u{3a}\u{308}",
+        "\u{b}"]), ("\u{61}\u{3a}\u{3031}", &["\u{61}", "\u{3a}", "\u{3031}"]),
+        ("\u{61}\u{3a}\u{308}\u{3031}", &["\u{61}", "\u{3a}\u{308}", "\u{3031}"]),
+        ("\u{61}\u{3a}\u{41}", &["\u{61}\u{3a}\u{41}"]), ("\u{61}\u{3a}\u{308}\u{41}",
+        &["\u{61}\u{3a}\u{308}\u{41}"]), ("\u{61}\u{3a}\u{3a}", &["\u{61}", "\u{3a}", "\u{3a}"]),
+        ("\u{61}\u{3a}\u{308}\u{3a}", &["\u{61}", "\u{3a}\u{308}", "\u{3a}"]),
+        ("\u{61}\u{3a}\u{2c}", &["\u{61}", "\u{3a}", "\u{2c}"]), ("\u{61}\u{3a}\u{308}\u{2c}",
+        &["\u{61}", "\u{3a}\u{308}", "\u{2c}"]), ("\u{61}\u{3a}\u{2e}", &["\u{61}", "\u{3a}",
+        "\u{2e}"]), ("\u{61}\u{3a}\u{308}\u{2e}", &["\u{61}", "\u{3a}\u{308}", "\u{2e}"]),
+        ("\u{61}\u{3a}\u{30}", &["\u{61}", "\u{3a}", "\u{30}"]), ("\u{61}\u{3a}\u{308}\u{30}",
+        &["\u{61}", "\u{3a}\u{308}", "\u{30}"]), ("\u{61}\u{3a}\u{5f}", &["\u{61}", "\u{3a}",
+        "\u{5f}"]), ("\u{61}\u{3a}\u{308}\u{5f}", &["\u{61}", "\u{3a}\u{308}", "\u{5f}"]),
+        ("\u{61}\u{3a}\u{1f1e6}", &["\u{61}", "\u{3a}", "\u{1f1e6}"]),
+        ("\u{61}\u{3a}\u{308}\u{1f1e6}", &["\u{61}", "\u{3a}\u{308}", "\u{1f1e6}"]),
+        ("\u{61}\u{3a}\u{5d0}", &["\u{61}\u{3a}\u{5d0}"]), ("\u{61}\u{3a}\u{308}\u{5d0}",
+        &["\u{61}\u{3a}\u{308}\u{5d0}"]), ("\u{61}\u{3a}\u{22}", &["\u{61}", "\u{3a}", "\u{22}"]),
+        ("\u{61}\u{3a}\u{308}\u{22}", &["\u{61}", "\u{3a}\u{308}", "\u{22}"]),
+        ("\u{61}\u{3a}\u{27}", &["\u{61}", "\u{3a}", "\u{27}"]), ("\u{61}\u{3a}\u{308}\u{27}",
+        &["\u{61}", "\u{3a}\u{308}", "\u{27}"]), ("\u{61}\u{3a}\u{231a}", &["\u{61}", "\u{3a}",
+        "\u{231a}"]), ("\u{61}\u{3a}\u{308}\u{231a}", &["\u{61}", "\u{3a}\u{308}", "\u{231a}"]),
+        ("\u{61}\u{3a}\u{20}", &["\u{61}", "\u{3a}", "\u{20}"]), ("\u{61}\u{3a}\u{308}\u{20}",
+        &["\u{61}", "\u{3a}\u{308}", "\u{20}"]), ("\u{61}\u{3a}\u{ad}", &["\u{61}",
+        "\u{3a}\u{ad}"]), ("\u{61}\u{3a}\u{308}\u{ad}", &["\u{61}", "\u{3a}\u{308}\u{ad}"]),
+        ("\u{61}\u{3a}\u{300}", &["\u{61}", "\u{3a}\u{300}"]), ("\u{61}\u{3a}\u{308}\u{300}",
+        &["\u{61}", "\u{3a}\u{308}\u{300}"]), ("\u{61}\u{3a}\u{200d}", &["\u{61}",
+        "\u{3a}\u{200d}"]), ("\u{61}\u{3a}\u{308}\u{200d}", &["\u{61}", "\u{3a}\u{308}\u{200d}"]),
+        ("\u{61}\u{3a}\u{61}\u{2060}", &["\u{61}\u{3a}\u{61}\u{2060}"]),
+        ("\u{61}\u{3a}\u{308}\u{61}\u{2060}", &["\u{61}\u{3a}\u{308}\u{61}\u{2060}"]),
+        ("\u{61}\u{3a}\u{61}\u{3a}", &["\u{61}\u{3a}\u{61}", "\u{3a}"]),
+        ("\u{61}\u{3a}\u{308}\u{61}\u{3a}", &["\u{61}\u{3a}\u{308}\u{61}", "\u{3a}"]),
+        ("\u{61}\u{3a}\u{61}\u{27}", &["\u{61}\u{3a}\u{61}", "\u{27}"]),
+        ("\u{61}\u{3a}\u{308}\u{61}\u{27}", &["\u{61}\u{3a}\u{308}\u{61}", "\u{27}"]),
+        ("\u{61}\u{3a}\u{61}\u{27}\u{2060}", &["\u{61}\u{3a}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{61}\u{3a}\u{308}\u{61}\u{27}\u{2060}", &["\u{61}\u{3a}\u{308}\u{61}",
+        "\u{27}\u{2060}"]), ("\u{61}\u{3a}\u{61}\u{2c}", &["\u{61}\u{3a}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{3a}\u{308}\u{61}\u{2c}", &["\u{61}\u{3a}\u{308}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{3a}\u{31}\u{3a}", &["\u{61}", "\u{3a}", "\u{31}", "\u{3a}"]),
+        ("\u{61}\u{3a}\u{308}\u{31}\u{3a}", &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{61}\u{3a}\u{31}\u{27}", &["\u{61}", "\u{3a}", "\u{31}", "\u{27}"]),
+        ("\u{61}\u{3a}\u{308}\u{31}\u{27}", &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{61}\u{3a}\u{31}\u{2c}", &["\u{61}", "\u{3a}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{3a}\u{308}\u{31}\u{2c}", &["\u{61}", "\u{3a}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{3a}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{3a}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{61}\u{3a}\u{308}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{3a}\u{308}", "\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{61}\u{27}\u{1}", &["\u{61}", "\u{27}", "\u{1}"]),
+        ("\u{61}\u{27}\u{308}\u{1}", &["\u{61}", "\u{27}\u{308}", "\u{1}"]), ("\u{61}\u{27}\u{d}",
+        &["\u{61}", "\u{27}", "\u{d}"]), ("\u{61}\u{27}\u{308}\u{d}", &["\u{61}", "\u{27}\u{308}",
+        "\u{d}"]), ("\u{61}\u{27}\u{a}", &["\u{61}", "\u{27}", "\u{a}"]),
+        ("\u{61}\u{27}\u{308}\u{a}", &["\u{61}", "\u{27}\u{308}", "\u{a}"]), ("\u{61}\u{27}\u{b}",
+        &["\u{61}", "\u{27}", "\u{b}"]), ("\u{61}\u{27}\u{308}\u{b}", &["\u{61}", "\u{27}\u{308}",
+        "\u{b}"]), ("\u{61}\u{27}\u{3031}", &["\u{61}", "\u{27}", "\u{3031}"]),
+        ("\u{61}\u{27}\u{308}\u{3031}", &["\u{61}", "\u{27}\u{308}", "\u{3031}"]),
+        ("\u{61}\u{27}\u{41}", &["\u{61}\u{27}\u{41}"]), ("\u{61}\u{27}\u{308}\u{41}",
+        &["\u{61}\u{27}\u{308}\u{41}"]), ("\u{61}\u{27}\u{3a}", &["\u{61}", "\u{27}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{308}\u{3a}", &["\u{61}", "\u{27}\u{308}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{2c}", &["\u{61}", "\u{27}", "\u{2c}"]), ("\u{61}\u{27}\u{308}\u{2c}",
+        &["\u{61}", "\u{27}\u{308}", "\u{2c}"]), ("\u{61}\u{27}\u{2e}", &["\u{61}", "\u{27}",
+        "\u{2e}"]), ("\u{61}\u{27}\u{308}\u{2e}", &["\u{61}", "\u{27}\u{308}", "\u{2e}"]),
+        ("\u{61}\u{27}\u{30}", &["\u{61}", "\u{27}", "\u{30}"]), ("\u{61}\u{27}\u{308}\u{30}",
+        &["\u{61}", "\u{27}\u{308}", "\u{30}"]), ("\u{61}\u{27}\u{5f}", &["\u{61}", "\u{27}",
+        "\u{5f}"]), ("\u{61}\u{27}\u{308}\u{5f}", &["\u{61}", "\u{27}\u{308}", "\u{5f}"]),
+        ("\u{61}\u{27}\u{1f1e6}", &["\u{61}", "\u{27}", "\u{1f1e6}"]),
+        ("\u{61}\u{27}\u{308}\u{1f1e6}", &["\u{61}", "\u{27}\u{308}", "\u{1f1e6}"]),
+        ("\u{61}\u{27}\u{5d0}", &["\u{61}\u{27}\u{5d0}"]), ("\u{61}\u{27}\u{308}\u{5d0}",
+        &["\u{61}\u{27}\u{308}\u{5d0}"]), ("\u{61}\u{27}\u{22}", &["\u{61}", "\u{27}", "\u{22}"]),
+        ("\u{61}\u{27}\u{308}\u{22}", &["\u{61}", "\u{27}\u{308}", "\u{22}"]),
+        ("\u{61}\u{27}\u{27}", &["\u{61}", "\u{27}", "\u{27}"]), ("\u{61}\u{27}\u{308}\u{27}",
+        &["\u{61}", "\u{27}\u{308}", "\u{27}"]), ("\u{61}\u{27}\u{231a}", &["\u{61}", "\u{27}",
+        "\u{231a}"]), ("\u{61}\u{27}\u{308}\u{231a}", &["\u{61}", "\u{27}\u{308}", "\u{231a}"]),
+        ("\u{61}\u{27}\u{20}", &["\u{61}", "\u{27}", "\u{20}"]), ("\u{61}\u{27}\u{308}\u{20}",
+        &["\u{61}", "\u{27}\u{308}", "\u{20}"]), ("\u{61}\u{27}\u{ad}", &["\u{61}",
+        "\u{27}\u{ad}"]), ("\u{61}\u{27}\u{308}\u{ad}", &["\u{61}", "\u{27}\u{308}\u{ad}"]),
+        ("\u{61}\u{27}\u{300}", &["\u{61}", "\u{27}\u{300}"]), ("\u{61}\u{27}\u{308}\u{300}",
+        &["\u{61}", "\u{27}\u{308}\u{300}"]), ("\u{61}\u{27}\u{200d}", &["\u{61}",
+        "\u{27}\u{200d}"]), ("\u{61}\u{27}\u{308}\u{200d}", &["\u{61}", "\u{27}\u{308}\u{200d}"]),
+        ("\u{61}\u{27}\u{61}\u{2060}", &["\u{61}\u{27}\u{61}\u{2060}"]),
+        ("\u{61}\u{27}\u{308}\u{61}\u{2060}", &["\u{61}\u{27}\u{308}\u{61}\u{2060}"]),
+        ("\u{61}\u{27}\u{61}\u{3a}", &["\u{61}\u{27}\u{61}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{308}\u{61}\u{3a}", &["\u{61}\u{27}\u{308}\u{61}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{61}\u{27}", &["\u{61}\u{27}\u{61}", "\u{27}"]),
+        ("\u{61}\u{27}\u{308}\u{61}\u{27}", &["\u{61}\u{27}\u{308}\u{61}", "\u{27}"]),
+        ("\u{61}\u{27}\u{61}\u{27}\u{2060}", &["\u{61}\u{27}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{61}\u{27}\u{308}\u{61}\u{27}\u{2060}", &["\u{61}\u{27}\u{308}\u{61}",
+        "\u{27}\u{2060}"]), ("\u{61}\u{27}\u{61}\u{2c}", &["\u{61}\u{27}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{308}\u{61}\u{2c}", &["\u{61}\u{27}\u{308}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{31}\u{3a}", &["\u{61}", "\u{27}", "\u{31}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{308}\u{31}\u{3a}", &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{31}\u{27}", &["\u{61}", "\u{27}", "\u{31}", "\u{27}"]),
+        ("\u{61}\u{27}\u{308}\u{31}\u{27}", &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{61}\u{27}\u{31}\u{2c}", &["\u{61}", "\u{27}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{308}\u{31}\u{2c}", &["\u{61}", "\u{27}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{27}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{61}\u{27}\u{308}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{27}\u{308}", "\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{61}\u{27}\u{2060}\u{1}", &["\u{61}", "\u{27}\u{2060}", "\u{1}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{1}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{1}"]),
+        ("\u{61}\u{27}\u{2060}\u{d}", &["\u{61}", "\u{27}\u{2060}", "\u{d}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{d}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{d}"]),
+        ("\u{61}\u{27}\u{2060}\u{a}", &["\u{61}", "\u{27}\u{2060}", "\u{a}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{a}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{a}"]),
+        ("\u{61}\u{27}\u{2060}\u{b}", &["\u{61}", "\u{27}\u{2060}", "\u{b}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{b}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{b}"]),
+        ("\u{61}\u{27}\u{2060}\u{3031}", &["\u{61}", "\u{27}\u{2060}", "\u{3031}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{3031}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{3031}"]),
+        ("\u{61}\u{27}\u{2060}\u{41}", &["\u{61}\u{27}\u{2060}\u{41}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{41}", &["\u{61}\u{27}\u{2060}\u{308}\u{41}"]),
+        ("\u{61}\u{27}\u{2060}\u{3a}", &["\u{61}", "\u{27}\u{2060}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{3a}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{3a}"]),
+        ("\u{61}\u{27}\u{2060}\u{2c}", &["\u{61}", "\u{27}\u{2060}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{2c}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{2060}\u{2e}", &["\u{61}", "\u{27}\u{2060}", "\u{2e}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{2e}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{2e}"]),
+        ("\u{61}\u{27}\u{2060}\u{30}", &["\u{61}", "\u{27}\u{2060}", "\u{30}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{30}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{30}"]),
+        ("\u{61}\u{27}\u{2060}\u{5f}", &["\u{61}", "\u{27}\u{2060}", "\u{5f}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{5f}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{5f}"]),
+        ("\u{61}\u{27}\u{2060}\u{1f1e6}", &["\u{61}", "\u{27}\u{2060}", "\u{1f1e6}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{1f1e6}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{1f1e6}"]),
+        ("\u{61}\u{27}\u{2060}\u{5d0}", &["\u{61}\u{27}\u{2060}\u{5d0}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{5d0}", &["\u{61}\u{27}\u{2060}\u{308}\u{5d0}"]),
+        ("\u{61}\u{27}\u{2060}\u{22}", &["\u{61}", "\u{27}\u{2060}", "\u{22}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{22}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{22}"]),
+        ("\u{61}\u{27}\u{2060}\u{27}", &["\u{61}", "\u{27}\u{2060}", "\u{27}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{27}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{27}"]),
+        ("\u{61}\u{27}\u{2060}\u{231a}", &["\u{61}", "\u{27}\u{2060}", "\u{231a}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{231a}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{231a}"]),
+        ("\u{61}\u{27}\u{2060}\u{20}", &["\u{61}", "\u{27}\u{2060}", "\u{20}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{20}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{20}"]),
+        ("\u{61}\u{27}\u{2060}\u{ad}", &["\u{61}", "\u{27}\u{2060}\u{ad}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{ad}", &["\u{61}", "\u{27}\u{2060}\u{308}\u{ad}"]),
+        ("\u{61}\u{27}\u{2060}\u{300}", &["\u{61}", "\u{27}\u{2060}\u{300}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{300}", &["\u{61}", "\u{27}\u{2060}\u{308}\u{300}"]),
+        ("\u{61}\u{27}\u{2060}\u{200d}", &["\u{61}", "\u{27}\u{2060}\u{200d}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{200d}", &["\u{61}", "\u{27}\u{2060}\u{308}\u{200d}"]),
+        ("\u{61}\u{27}\u{2060}\u{61}\u{2060}", &["\u{61}\u{27}\u{2060}\u{61}\u{2060}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{61}\u{2060}",
+        &["\u{61}\u{27}\u{2060}\u{308}\u{61}\u{2060}"]), ("\u{61}\u{27}\u{2060}\u{61}\u{3a}",
+        &["\u{61}\u{27}\u{2060}\u{61}", "\u{3a}"]), ("\u{61}\u{27}\u{2060}\u{308}\u{61}\u{3a}",
+        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{3a}"]), ("\u{61}\u{27}\u{2060}\u{61}\u{27}",
+        &["\u{61}\u{27}\u{2060}\u{61}", "\u{27}"]), ("\u{61}\u{27}\u{2060}\u{308}\u{61}\u{27}",
+        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{27}"]),
+        ("\u{61}\u{27}\u{2060}\u{61}\u{27}\u{2060}", &["\u{61}\u{27}\u{2060}\u{61}",
+        "\u{27}\u{2060}"]), ("\u{61}\u{27}\u{2060}\u{308}\u{61}\u{27}\u{2060}",
+        &["\u{61}\u{27}\u{2060}\u{308}\u{61}", "\u{27}\u{2060}"]),
+        ("\u{61}\u{27}\u{2060}\u{61}\u{2c}", &["\u{61}\u{27}\u{2060}\u{61}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{61}\u{2c}", &["\u{61}\u{27}\u{2060}\u{308}\u{61}",
+        "\u{2c}"]), ("\u{61}\u{27}\u{2060}\u{31}\u{3a}", &["\u{61}", "\u{27}\u{2060}", "\u{31}",
+        "\u{3a}"]), ("\u{61}\u{27}\u{2060}\u{308}\u{31}\u{3a}", &["\u{61}", "\u{27}\u{2060}\u{308}",
+        "\u{31}", "\u{3a}"]), ("\u{61}\u{27}\u{2060}\u{31}\u{27}", &["\u{61}", "\u{27}\u{2060}",
+        "\u{31}", "\u{27}"]), ("\u{61}\u{27}\u{2060}\u{308}\u{31}\u{27}", &["\u{61}",
+        "\u{27}\u{2060}\u{308}", "\u{31}", "\u{27}"]), ("\u{61}\u{27}\u{2060}\u{31}\u{2c}",
+        &["\u{61}", "\u{27}\u{2060}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{27}\u{2060}\u{308}\u{31}\u{2c}", &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{31}",
+        "\u{2c}"]), ("\u{61}\u{27}\u{2060}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{27}\u{2060}",
+        "\u{31}", "\u{2e}\u{2060}"]), ("\u{61}\u{27}\u{2060}\u{308}\u{31}\u{2e}\u{2060}",
+        &["\u{61}", "\u{27}\u{2060}\u{308}", "\u{31}", "\u{2e}\u{2060}"]), ("\u{61}\u{2c}\u{1}",
+        &["\u{61}", "\u{2c}", "\u{1}"]), ("\u{61}\u{2c}\u{308}\u{1}", &["\u{61}", "\u{2c}\u{308}",
+        "\u{1}"]), ("\u{61}\u{2c}\u{d}", &["\u{61}", "\u{2c}", "\u{d}"]),
+        ("\u{61}\u{2c}\u{308}\u{d}", &["\u{61}", "\u{2c}\u{308}", "\u{d}"]), ("\u{61}\u{2c}\u{a}",
+        &["\u{61}", "\u{2c}", "\u{a}"]), ("\u{61}\u{2c}\u{308}\u{a}", &["\u{61}", "\u{2c}\u{308}",
+        "\u{a}"]), ("\u{61}\u{2c}\u{b}", &["\u{61}", "\u{2c}", "\u{b}"]),
+        ("\u{61}\u{2c}\u{308}\u{b}", &["\u{61}", "\u{2c}\u{308}", "\u{b}"]),
+        ("\u{61}\u{2c}\u{3031}", &["\u{61}", "\u{2c}", "\u{3031}"]), ("\u{61}\u{2c}\u{308}\u{3031}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{3031}"]), ("\u{61}\u{2c}\u{41}", &["\u{61}", "\u{2c}",
+        "\u{41}"]), ("\u{61}\u{2c}\u{308}\u{41}", &["\u{61}", "\u{2c}\u{308}", "\u{41}"]),
+        ("\u{61}\u{2c}\u{3a}", &["\u{61}", "\u{2c}", "\u{3a}"]), ("\u{61}\u{2c}\u{308}\u{3a}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{3a}"]), ("\u{61}\u{2c}\u{2c}", &["\u{61}", "\u{2c}",
+        "\u{2c}"]), ("\u{61}\u{2c}\u{308}\u{2c}", &["\u{61}", "\u{2c}\u{308}", "\u{2c}"]),
+        ("\u{61}\u{2c}\u{2e}", &["\u{61}", "\u{2c}", "\u{2e}"]), ("\u{61}\u{2c}\u{308}\u{2e}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{2e}"]), ("\u{61}\u{2c}\u{30}", &["\u{61}", "\u{2c}",
+        "\u{30}"]), ("\u{61}\u{2c}\u{308}\u{30}", &["\u{61}", "\u{2c}\u{308}", "\u{30}"]),
+        ("\u{61}\u{2c}\u{5f}", &["\u{61}", "\u{2c}", "\u{5f}"]), ("\u{61}\u{2c}\u{308}\u{5f}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{5f}"]), ("\u{61}\u{2c}\u{1f1e6}", &["\u{61}", "\u{2c}",
+        "\u{1f1e6}"]), ("\u{61}\u{2c}\u{308}\u{1f1e6}", &["\u{61}", "\u{2c}\u{308}", "\u{1f1e6}"]),
+        ("\u{61}\u{2c}\u{5d0}", &["\u{61}", "\u{2c}", "\u{5d0}"]), ("\u{61}\u{2c}\u{308}\u{5d0}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{5d0}"]), ("\u{61}\u{2c}\u{22}", &["\u{61}", "\u{2c}",
+        "\u{22}"]), ("\u{61}\u{2c}\u{308}\u{22}", &["\u{61}", "\u{2c}\u{308}", "\u{22}"]),
+        ("\u{61}\u{2c}\u{27}", &["\u{61}", "\u{2c}", "\u{27}"]), ("\u{61}\u{2c}\u{308}\u{27}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{27}"]), ("\u{61}\u{2c}\u{231a}", &["\u{61}", "\u{2c}",
+        "\u{231a}"]), ("\u{61}\u{2c}\u{308}\u{231a}", &["\u{61}", "\u{2c}\u{308}", "\u{231a}"]),
+        ("\u{61}\u{2c}\u{20}", &["\u{61}", "\u{2c}", "\u{20}"]), ("\u{61}\u{2c}\u{308}\u{20}",
+        &["\u{61}", "\u{2c}\u{308}", "\u{20}"]), ("\u{61}\u{2c}\u{ad}", &["\u{61}",
+        "\u{2c}\u{ad}"]), ("\u{61}\u{2c}\u{308}\u{ad}", &["\u{61}", "\u{2c}\u{308}\u{ad}"]),
+        ("\u{61}\u{2c}\u{300}", &["\u{61}", "\u{2c}\u{300}"]), ("\u{61}\u{2c}\u{308}\u{300}",
+        &["\u{61}", "\u{2c}\u{308}\u{300}"]), ("\u{61}\u{2c}\u{200d}", &["\u{61}",
+        "\u{2c}\u{200d}"]), ("\u{61}\u{2c}\u{308}\u{200d}", &["\u{61}", "\u{2c}\u{308}\u{200d}"]),
+        ("\u{61}\u{2c}\u{61}\u{2060}", &["\u{61}", "\u{2c}", "\u{61}\u{2060}"]),
+        ("\u{61}\u{2c}\u{308}\u{61}\u{2060}", &["\u{61}", "\u{2c}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{61}\u{2c}\u{61}\u{3a}", &["\u{61}", "\u{2c}", "\u{61}", "\u{3a}"]),
+        ("\u{61}\u{2c}\u{308}\u{61}\u{3a}", &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{61}\u{2c}\u{61}\u{27}", &["\u{61}", "\u{2c}", "\u{61}", "\u{27}"]),
+        ("\u{61}\u{2c}\u{308}\u{61}\u{27}", &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{61}\u{2c}\u{61}\u{27}\u{2060}", &["\u{61}", "\u{2c}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{61}\u{2c}\u{308}\u{61}\u{27}\u{2060}", &["\u{61}", "\u{2c}\u{308}", "\u{61}",
+        "\u{27}\u{2060}"]), ("\u{61}\u{2c}\u{61}\u{2c}", &["\u{61}", "\u{2c}", "\u{61}", "\u{2c}"]),
+        ("\u{61}\u{2c}\u{308}\u{61}\u{2c}", &["\u{61}", "\u{2c}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{61}\u{2c}\u{31}\u{3a}", &["\u{61}", "\u{2c}", "\u{31}", "\u{3a}"]),
+        ("\u{61}\u{2c}\u{308}\u{31}\u{3a}", &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{61}\u{2c}\u{31}\u{27}", &["\u{61}", "\u{2c}", "\u{31}", "\u{27}"]),
+        ("\u{61}\u{2c}\u{308}\u{31}\u{27}", &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{61}\u{2c}\u{31}\u{2c}", &["\u{61}", "\u{2c}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{2c}\u{308}\u{31}\u{2c}", &["\u{61}", "\u{2c}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{61}\u{2c}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{2c}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{61}\u{2c}\u{308}\u{31}\u{2e}\u{2060}", &["\u{61}", "\u{2c}\u{308}", "\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{31}\u{3a}\u{1}", &["\u{31}", "\u{3a}", "\u{1}"]),
+        ("\u{31}\u{3a}\u{308}\u{1}", &["\u{31}", "\u{3a}\u{308}", "\u{1}"]), ("\u{31}\u{3a}\u{d}",
+        &["\u{31}", "\u{3a}", "\u{d}"]), ("\u{31}\u{3a}\u{308}\u{d}", &["\u{31}", "\u{3a}\u{308}",
+        "\u{d}"]), ("\u{31}\u{3a}\u{a}", &["\u{31}", "\u{3a}", "\u{a}"]),
+        ("\u{31}\u{3a}\u{308}\u{a}", &["\u{31}", "\u{3a}\u{308}", "\u{a}"]), ("\u{31}\u{3a}\u{b}",
+        &["\u{31}", "\u{3a}", "\u{b}"]), ("\u{31}\u{3a}\u{308}\u{b}", &["\u{31}", "\u{3a}\u{308}",
+        "\u{b}"]), ("\u{31}\u{3a}\u{3031}", &["\u{31}", "\u{3a}", "\u{3031}"]),
+        ("\u{31}\u{3a}\u{308}\u{3031}", &["\u{31}", "\u{3a}\u{308}", "\u{3031}"]),
+        ("\u{31}\u{3a}\u{41}", &["\u{31}", "\u{3a}", "\u{41}"]), ("\u{31}\u{3a}\u{308}\u{41}",
+        &["\u{31}", "\u{3a}\u{308}", "\u{41}"]), ("\u{31}\u{3a}\u{3a}", &["\u{31}", "\u{3a}",
+        "\u{3a}"]), ("\u{31}\u{3a}\u{308}\u{3a}", &["\u{31}", "\u{3a}\u{308}", "\u{3a}"]),
+        ("\u{31}\u{3a}\u{2c}", &["\u{31}", "\u{3a}", "\u{2c}"]), ("\u{31}\u{3a}\u{308}\u{2c}",
+        &["\u{31}", "\u{3a}\u{308}", "\u{2c}"]), ("\u{31}\u{3a}\u{2e}", &["\u{31}", "\u{3a}",
+        "\u{2e}"]), ("\u{31}\u{3a}\u{308}\u{2e}", &["\u{31}", "\u{3a}\u{308}", "\u{2e}"]),
+        ("\u{31}\u{3a}\u{30}", &["\u{31}", "\u{3a}", "\u{30}"]), ("\u{31}\u{3a}\u{308}\u{30}",
+        &["\u{31}", "\u{3a}\u{308}", "\u{30}"]), ("\u{31}\u{3a}\u{5f}", &["\u{31}", "\u{3a}",
+        "\u{5f}"]), ("\u{31}\u{3a}\u{308}\u{5f}", &["\u{31}", "\u{3a}\u{308}", "\u{5f}"]),
+        ("\u{31}\u{3a}\u{1f1e6}", &["\u{31}", "\u{3a}", "\u{1f1e6}"]),
+        ("\u{31}\u{3a}\u{308}\u{1f1e6}", &["\u{31}", "\u{3a}\u{308}", "\u{1f1e6}"]),
+        ("\u{31}\u{3a}\u{5d0}", &["\u{31}", "\u{3a}", "\u{5d0}"]), ("\u{31}\u{3a}\u{308}\u{5d0}",
+        &["\u{31}", "\u{3a}\u{308}", "\u{5d0}"]), ("\u{31}\u{3a}\u{22}", &["\u{31}", "\u{3a}",
+        "\u{22}"]), ("\u{31}\u{3a}\u{308}\u{22}", &["\u{31}", "\u{3a}\u{308}", "\u{22}"]),
+        ("\u{31}\u{3a}\u{27}", &["\u{31}", "\u{3a}", "\u{27}"]), ("\u{31}\u{3a}\u{308}\u{27}",
+        &["\u{31}", "\u{3a}\u{308}", "\u{27}"]), ("\u{31}\u{3a}\u{231a}", &["\u{31}", "\u{3a}",
+        "\u{231a}"]), ("\u{31}\u{3a}\u{308}\u{231a}", &["\u{31}", "\u{3a}\u{308}", "\u{231a}"]),
+        ("\u{31}\u{3a}\u{20}", &["\u{31}", "\u{3a}", "\u{20}"]), ("\u{31}\u{3a}\u{308}\u{20}",
+        &["\u{31}", "\u{3a}\u{308}", "\u{20}"]), ("\u{31}\u{3a}\u{ad}", &["\u{31}",
+        "\u{3a}\u{ad}"]), ("\u{31}\u{3a}\u{308}\u{ad}", &["\u{31}", "\u{3a}\u{308}\u{ad}"]),
+        ("\u{31}\u{3a}\u{300}", &["\u{31}", "\u{3a}\u{300}"]), ("\u{31}\u{3a}\u{308}\u{300}",
+        &["\u{31}", "\u{3a}\u{308}\u{300}"]), ("\u{31}\u{3a}\u{200d}", &["\u{31}",
+        "\u{3a}\u{200d}"]), ("\u{31}\u{3a}\u{308}\u{200d}", &["\u{31}", "\u{3a}\u{308}\u{200d}"]),
+        ("\u{31}\u{3a}\u{61}\u{2060}", &["\u{31}", "\u{3a}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{3a}\u{308}\u{61}\u{2060}", &["\u{31}", "\u{3a}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{3a}\u{61}\u{3a}", &["\u{31}", "\u{3a}", "\u{61}", "\u{3a}"]),
+        ("\u{31}\u{3a}\u{308}\u{61}\u{3a}", &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{31}\u{3a}\u{61}\u{27}", &["\u{31}", "\u{3a}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{3a}\u{308}\u{61}\u{27}", &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{3a}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{3a}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{31}\u{3a}\u{308}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{3a}\u{308}", "\u{61}",
+        "\u{27}\u{2060}"]), ("\u{31}\u{3a}\u{61}\u{2c}", &["\u{31}", "\u{3a}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{3a}\u{308}\u{61}\u{2c}", &["\u{31}", "\u{3a}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{3a}\u{31}\u{3a}", &["\u{31}", "\u{3a}", "\u{31}", "\u{3a}"]),
+        ("\u{31}\u{3a}\u{308}\u{31}\u{3a}", &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{3a}"]),
+        ("\u{31}\u{3a}\u{31}\u{27}", &["\u{31}", "\u{3a}", "\u{31}", "\u{27}"]),
+        ("\u{31}\u{3a}\u{308}\u{31}\u{27}", &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{27}"]),
+        ("\u{31}\u{3a}\u{31}\u{2c}", &["\u{31}", "\u{3a}", "\u{31}", "\u{2c}"]),
+        ("\u{31}\u{3a}\u{308}\u{31}\u{2c}", &["\u{31}", "\u{3a}\u{308}", "\u{31}", "\u{2c}"]),
+        ("\u{31}\u{3a}\u{31}\u{2e}\u{2060}", &["\u{31}", "\u{3a}", "\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{31}\u{3a}\u{308}\u{31}\u{2e}\u{2060}", &["\u{31}", "\u{3a}\u{308}", "\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{31}\u{27}\u{1}", &["\u{31}", "\u{27}", "\u{1}"]),
+        ("\u{31}\u{27}\u{308}\u{1}", &["\u{31}", "\u{27}\u{308}", "\u{1}"]), ("\u{31}\u{27}\u{d}",
+        &["\u{31}", "\u{27}", "\u{d}"]), ("\u{31}\u{27}\u{308}\u{d}", &["\u{31}", "\u{27}\u{308}",
+        "\u{d}"]), ("\u{31}\u{27}\u{a}", &["\u{31}", "\u{27}", "\u{a}"]),
+        ("\u{31}\u{27}\u{308}\u{a}", &["\u{31}", "\u{27}\u{308}", "\u{a}"]), ("\u{31}\u{27}\u{b}",
+        &["\u{31}", "\u{27}", "\u{b}"]), ("\u{31}\u{27}\u{308}\u{b}", &["\u{31}", "\u{27}\u{308}",
+        "\u{b}"]), ("\u{31}\u{27}\u{3031}", &["\u{31}", "\u{27}", "\u{3031}"]),
+        ("\u{31}\u{27}\u{308}\u{3031}", &["\u{31}", "\u{27}\u{308}", "\u{3031}"]),
+        ("\u{31}\u{27}\u{41}", &["\u{31}", "\u{27}", "\u{41}"]), ("\u{31}\u{27}\u{308}\u{41}",
+        &["\u{31}", "\u{27}\u{308}", "\u{41}"]), ("\u{31}\u{27}\u{3a}", &["\u{31}", "\u{27}",
+        "\u{3a}"]), ("\u{31}\u{27}\u{308}\u{3a}", &["\u{31}", "\u{27}\u{308}", "\u{3a}"]),
+        ("\u{31}\u{27}\u{2c}", &["\u{31}", "\u{27}", "\u{2c}"]), ("\u{31}\u{27}\u{308}\u{2c}",
+        &["\u{31}", "\u{27}\u{308}", "\u{2c}"]), ("\u{31}\u{27}\u{2e}", &["\u{31}", "\u{27}",
+        "\u{2e}"]), ("\u{31}\u{27}\u{308}\u{2e}", &["\u{31}", "\u{27}\u{308}", "\u{2e}"]),
+        ("\u{31}\u{27}\u{30}", &["\u{31}\u{27}\u{30}"]), ("\u{31}\u{27}\u{308}\u{30}",
+        &["\u{31}\u{27}\u{308}\u{30}"]), ("\u{31}\u{27}\u{5f}", &["\u{31}", "\u{27}", "\u{5f}"]),
+        ("\u{31}\u{27}\u{308}\u{5f}", &["\u{31}", "\u{27}\u{308}", "\u{5f}"]),
+        ("\u{31}\u{27}\u{1f1e6}", &["\u{31}", "\u{27}", "\u{1f1e6}"]),
+        ("\u{31}\u{27}\u{308}\u{1f1e6}", &["\u{31}", "\u{27}\u{308}", "\u{1f1e6}"]),
+        ("\u{31}\u{27}\u{5d0}", &["\u{31}", "\u{27}", "\u{5d0}"]), ("\u{31}\u{27}\u{308}\u{5d0}",
+        &["\u{31}", "\u{27}\u{308}", "\u{5d0}"]), ("\u{31}\u{27}\u{22}", &["\u{31}", "\u{27}",
+        "\u{22}"]), ("\u{31}\u{27}\u{308}\u{22}", &["\u{31}", "\u{27}\u{308}", "\u{22}"]),
+        ("\u{31}\u{27}\u{27}", &["\u{31}", "\u{27}", "\u{27}"]), ("\u{31}\u{27}\u{308}\u{27}",
+        &["\u{31}", "\u{27}\u{308}", "\u{27}"]), ("\u{31}\u{27}\u{231a}", &["\u{31}", "\u{27}",
+        "\u{231a}"]), ("\u{31}\u{27}\u{308}\u{231a}", &["\u{31}", "\u{27}\u{308}", "\u{231a}"]),
+        ("\u{31}\u{27}\u{20}", &["\u{31}", "\u{27}", "\u{20}"]), ("\u{31}\u{27}\u{308}\u{20}",
+        &["\u{31}", "\u{27}\u{308}", "\u{20}"]), ("\u{31}\u{27}\u{ad}", &["\u{31}",
+        "\u{27}\u{ad}"]), ("\u{31}\u{27}\u{308}\u{ad}", &["\u{31}", "\u{27}\u{308}\u{ad}"]),
+        ("\u{31}\u{27}\u{300}", &["\u{31}", "\u{27}\u{300}"]), ("\u{31}\u{27}\u{308}\u{300}",
+        &["\u{31}", "\u{27}\u{308}\u{300}"]), ("\u{31}\u{27}\u{200d}", &["\u{31}",
+        "\u{27}\u{200d}"]), ("\u{31}\u{27}\u{308}\u{200d}", &["\u{31}", "\u{27}\u{308}\u{200d}"]),
+        ("\u{31}\u{27}\u{61}\u{2060}", &["\u{31}", "\u{27}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{27}\u{308}\u{61}\u{2060}", &["\u{31}", "\u{27}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{27}\u{61}\u{3a}", &["\u{31}", "\u{27}", "\u{61}", "\u{3a}"]),
+        ("\u{31}\u{27}\u{308}\u{61}\u{3a}", &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{31}\u{27}\u{61}\u{27}", &["\u{31}", "\u{27}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{27}\u{308}\u{61}\u{27}", &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{27}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{27}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{31}\u{27}\u{308}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{27}\u{308}", "\u{61}",
+        "\u{27}\u{2060}"]), ("\u{31}\u{27}\u{61}\u{2c}", &["\u{31}", "\u{27}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{27}\u{308}\u{61}\u{2c}", &["\u{31}", "\u{27}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{27}\u{31}\u{3a}", &["\u{31}\u{27}\u{31}", "\u{3a}"]),
+        ("\u{31}\u{27}\u{308}\u{31}\u{3a}", &["\u{31}\u{27}\u{308}\u{31}", "\u{3a}"]),
+        ("\u{31}\u{27}\u{31}\u{27}", &["\u{31}\u{27}\u{31}", "\u{27}"]),
+        ("\u{31}\u{27}\u{308}\u{31}\u{27}", &["\u{31}\u{27}\u{308}\u{31}", "\u{27}"]),
+        ("\u{31}\u{27}\u{31}\u{2c}", &["\u{31}\u{27}\u{31}", "\u{2c}"]),
+        ("\u{31}\u{27}\u{308}\u{31}\u{2c}", &["\u{31}\u{27}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{31}\u{27}\u{31}\u{2e}\u{2060}", &["\u{31}\u{27}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{31}\u{27}\u{308}\u{31}\u{2e}\u{2060}", &["\u{31}\u{27}\u{308}\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{31}\u{2c}\u{1}", &["\u{31}", "\u{2c}", "\u{1}"]),
+        ("\u{31}\u{2c}\u{308}\u{1}", &["\u{31}", "\u{2c}\u{308}", "\u{1}"]), ("\u{31}\u{2c}\u{d}",
+        &["\u{31}", "\u{2c}", "\u{d}"]), ("\u{31}\u{2c}\u{308}\u{d}", &["\u{31}", "\u{2c}\u{308}",
+        "\u{d}"]), ("\u{31}\u{2c}\u{a}", &["\u{31}", "\u{2c}", "\u{a}"]),
+        ("\u{31}\u{2c}\u{308}\u{a}", &["\u{31}", "\u{2c}\u{308}", "\u{a}"]), ("\u{31}\u{2c}\u{b}",
+        &["\u{31}", "\u{2c}", "\u{b}"]), ("\u{31}\u{2c}\u{308}\u{b}", &["\u{31}", "\u{2c}\u{308}",
+        "\u{b}"]), ("\u{31}\u{2c}\u{3031}", &["\u{31}", "\u{2c}", "\u{3031}"]),
+        ("\u{31}\u{2c}\u{308}\u{3031}", &["\u{31}", "\u{2c}\u{308}", "\u{3031}"]),
+        ("\u{31}\u{2c}\u{41}", &["\u{31}", "\u{2c}", "\u{41}"]), ("\u{31}\u{2c}\u{308}\u{41}",
+        &["\u{31}", "\u{2c}\u{308}", "\u{41}"]), ("\u{31}\u{2c}\u{3a}", &["\u{31}", "\u{2c}",
+        "\u{3a}"]), ("\u{31}\u{2c}\u{308}\u{3a}", &["\u{31}", "\u{2c}\u{308}", "\u{3a}"]),
+        ("\u{31}\u{2c}\u{2c}", &["\u{31}", "\u{2c}", "\u{2c}"]), ("\u{31}\u{2c}\u{308}\u{2c}",
+        &["\u{31}", "\u{2c}\u{308}", "\u{2c}"]), ("\u{31}\u{2c}\u{2e}", &["\u{31}", "\u{2c}",
+        "\u{2e}"]), ("\u{31}\u{2c}\u{308}\u{2e}", &["\u{31}", "\u{2c}\u{308}", "\u{2e}"]),
+        ("\u{31}\u{2c}\u{30}", &["\u{31}\u{2c}\u{30}"]), ("\u{31}\u{2c}\u{308}\u{30}",
+        &["\u{31}\u{2c}\u{308}\u{30}"]), ("\u{31}\u{2c}\u{5f}", &["\u{31}", "\u{2c}", "\u{5f}"]),
+        ("\u{31}\u{2c}\u{308}\u{5f}", &["\u{31}", "\u{2c}\u{308}", "\u{5f}"]),
+        ("\u{31}\u{2c}\u{1f1e6}", &["\u{31}", "\u{2c}", "\u{1f1e6}"]),
+        ("\u{31}\u{2c}\u{308}\u{1f1e6}", &["\u{31}", "\u{2c}\u{308}", "\u{1f1e6}"]),
+        ("\u{31}\u{2c}\u{5d0}", &["\u{31}", "\u{2c}", "\u{5d0}"]), ("\u{31}\u{2c}\u{308}\u{5d0}",
+        &["\u{31}", "\u{2c}\u{308}", "\u{5d0}"]), ("\u{31}\u{2c}\u{22}", &["\u{31}", "\u{2c}",
+        "\u{22}"]), ("\u{31}\u{2c}\u{308}\u{22}", &["\u{31}", "\u{2c}\u{308}", "\u{22}"]),
+        ("\u{31}\u{2c}\u{27}", &["\u{31}", "\u{2c}", "\u{27}"]), ("\u{31}\u{2c}\u{308}\u{27}",
+        &["\u{31}", "\u{2c}\u{308}", "\u{27}"]), ("\u{31}\u{2c}\u{231a}", &["\u{31}", "\u{2c}",
+        "\u{231a}"]), ("\u{31}\u{2c}\u{308}\u{231a}", &["\u{31}", "\u{2c}\u{308}", "\u{231a}"]),
+        ("\u{31}\u{2c}\u{20}", &["\u{31}", "\u{2c}", "\u{20}"]), ("\u{31}\u{2c}\u{308}\u{20}",
+        &["\u{31}", "\u{2c}\u{308}", "\u{20}"]), ("\u{31}\u{2c}\u{ad}", &["\u{31}",
+        "\u{2c}\u{ad}"]), ("\u{31}\u{2c}\u{308}\u{ad}", &["\u{31}", "\u{2c}\u{308}\u{ad}"]),
+        ("\u{31}\u{2c}\u{300}", &["\u{31}", "\u{2c}\u{300}"]), ("\u{31}\u{2c}\u{308}\u{300}",
+        &["\u{31}", "\u{2c}\u{308}\u{300}"]), ("\u{31}\u{2c}\u{200d}", &["\u{31}",
+        "\u{2c}\u{200d}"]), ("\u{31}\u{2c}\u{308}\u{200d}", &["\u{31}", "\u{2c}\u{308}\u{200d}"]),
+        ("\u{31}\u{2c}\u{61}\u{2060}", &["\u{31}", "\u{2c}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{2c}\u{308}\u{61}\u{2060}", &["\u{31}", "\u{2c}\u{308}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{2c}\u{61}\u{3a}", &["\u{31}", "\u{2c}", "\u{61}", "\u{3a}"]),
+        ("\u{31}\u{2c}\u{308}\u{61}\u{3a}", &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{3a}"]),
+        ("\u{31}\u{2c}\u{61}\u{27}", &["\u{31}", "\u{2c}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{2c}\u{308}\u{61}\u{27}", &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{2c}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{2c}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{31}\u{2c}\u{308}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{2c}\u{308}", "\u{61}",
+        "\u{27}\u{2060}"]), ("\u{31}\u{2c}\u{61}\u{2c}", &["\u{31}", "\u{2c}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{2c}\u{308}\u{61}\u{2c}", &["\u{31}", "\u{2c}\u{308}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{2c}\u{31}\u{3a}", &["\u{31}\u{2c}\u{31}", "\u{3a}"]),
+        ("\u{31}\u{2c}\u{308}\u{31}\u{3a}", &["\u{31}\u{2c}\u{308}\u{31}", "\u{3a}"]),
+        ("\u{31}\u{2c}\u{31}\u{27}", &["\u{31}\u{2c}\u{31}", "\u{27}"]),
+        ("\u{31}\u{2c}\u{308}\u{31}\u{27}", &["\u{31}\u{2c}\u{308}\u{31}", "\u{27}"]),
+        ("\u{31}\u{2c}\u{31}\u{2c}", &["\u{31}\u{2c}\u{31}", "\u{2c}"]),
+        ("\u{31}\u{2c}\u{308}\u{31}\u{2c}", &["\u{31}\u{2c}\u{308}\u{31}", "\u{2c}"]),
+        ("\u{31}\u{2c}\u{31}\u{2e}\u{2060}", &["\u{31}\u{2c}\u{31}", "\u{2e}\u{2060}"]),
+        ("\u{31}\u{2c}\u{308}\u{31}\u{2e}\u{2060}", &["\u{31}\u{2c}\u{308}\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{31}\u{2e}\u{2060}\u{1}", &["\u{31}", "\u{2e}\u{2060}", "\u{1}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{1}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{1}"]),
+        ("\u{31}\u{2e}\u{2060}\u{d}", &["\u{31}", "\u{2e}\u{2060}", "\u{d}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{d}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{d}"]),
+        ("\u{31}\u{2e}\u{2060}\u{a}", &["\u{31}", "\u{2e}\u{2060}", "\u{a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{a}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{b}", &["\u{31}", "\u{2e}\u{2060}", "\u{b}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{b}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{b}"]),
+        ("\u{31}\u{2e}\u{2060}\u{3031}", &["\u{31}", "\u{2e}\u{2060}", "\u{3031}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{3031}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{3031}"]),
+        ("\u{31}\u{2e}\u{2060}\u{41}", &["\u{31}", "\u{2e}\u{2060}", "\u{41}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{41}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{41}"]),
+        ("\u{31}\u{2e}\u{2060}\u{3a}", &["\u{31}", "\u{2e}\u{2060}", "\u{3a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{3a}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{3a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{2c}", &["\u{31}", "\u{2e}\u{2060}", "\u{2c}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{2c}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{2c}"]),
+        ("\u{31}\u{2e}\u{2060}\u{2e}", &["\u{31}", "\u{2e}\u{2060}", "\u{2e}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{2e}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{2e}"]),
+        ("\u{31}\u{2e}\u{2060}\u{30}", &["\u{31}\u{2e}\u{2060}\u{30}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{30}", &["\u{31}\u{2e}\u{2060}\u{308}\u{30}"]),
+        ("\u{31}\u{2e}\u{2060}\u{5f}", &["\u{31}", "\u{2e}\u{2060}", "\u{5f}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{5f}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{5f}"]),
+        ("\u{31}\u{2e}\u{2060}\u{1f1e6}", &["\u{31}", "\u{2e}\u{2060}", "\u{1f1e6}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{1f1e6}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{1f1e6}"]),
+        ("\u{31}\u{2e}\u{2060}\u{5d0}", &["\u{31}", "\u{2e}\u{2060}", "\u{5d0}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{5d0}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{5d0}"]),
+        ("\u{31}\u{2e}\u{2060}\u{22}", &["\u{31}", "\u{2e}\u{2060}", "\u{22}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{22}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{22}"]),
+        ("\u{31}\u{2e}\u{2060}\u{27}", &["\u{31}", "\u{2e}\u{2060}", "\u{27}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{27}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{27}"]),
+        ("\u{31}\u{2e}\u{2060}\u{231a}", &["\u{31}", "\u{2e}\u{2060}", "\u{231a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{231a}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{231a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{20}", &["\u{31}", "\u{2e}\u{2060}", "\u{20}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{20}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{20}"]),
+        ("\u{31}\u{2e}\u{2060}\u{ad}", &["\u{31}", "\u{2e}\u{2060}\u{ad}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{ad}", &["\u{31}", "\u{2e}\u{2060}\u{308}\u{ad}"]),
+        ("\u{31}\u{2e}\u{2060}\u{300}", &["\u{31}", "\u{2e}\u{2060}\u{300}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{300}", &["\u{31}", "\u{2e}\u{2060}\u{308}\u{300}"]),
+        ("\u{31}\u{2e}\u{2060}\u{200d}", &["\u{31}", "\u{2e}\u{2060}\u{200d}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{200d}", &["\u{31}", "\u{2e}\u{2060}\u{308}\u{200d}"]),
+        ("\u{31}\u{2e}\u{2060}\u{61}\u{2060}", &["\u{31}", "\u{2e}\u{2060}", "\u{61}\u{2060}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{2060}", &["\u{31}", "\u{2e}\u{2060}\u{308}",
+        "\u{61}\u{2060}"]), ("\u{31}\u{2e}\u{2060}\u{61}\u{3a}", &["\u{31}", "\u{2e}\u{2060}",
+        "\u{61}", "\u{3a}"]), ("\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{3a}", &["\u{31}",
+        "\u{2e}\u{2060}\u{308}", "\u{61}", "\u{3a}"]), ("\u{31}\u{2e}\u{2060}\u{61}\u{27}",
+        &["\u{31}", "\u{2e}\u{2060}", "\u{61}", "\u{27}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{27}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}",
+        "\u{27}"]), ("\u{31}\u{2e}\u{2060}\u{61}\u{27}\u{2060}", &["\u{31}", "\u{2e}\u{2060}",
+        "\u{61}", "\u{27}\u{2060}"]), ("\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{27}\u{2060}",
+        &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}", "\u{27}\u{2060}"]),
+        ("\u{31}\u{2e}\u{2060}\u{61}\u{2c}", &["\u{31}", "\u{2e}\u{2060}", "\u{61}", "\u{2c}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{61}\u{2c}", &["\u{31}", "\u{2e}\u{2060}\u{308}", "\u{61}",
+        "\u{2c}"]), ("\u{31}\u{2e}\u{2060}\u{31}\u{3a}", &["\u{31}\u{2e}\u{2060}\u{31}", "\u{3a}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{3a}", &["\u{31}\u{2e}\u{2060}\u{308}\u{31}",
+        "\u{3a}"]), ("\u{31}\u{2e}\u{2060}\u{31}\u{27}", &["\u{31}\u{2e}\u{2060}\u{31}", "\u{27}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{27}", &["\u{31}\u{2e}\u{2060}\u{308}\u{31}",
+        "\u{27}"]), ("\u{31}\u{2e}\u{2060}\u{31}\u{2c}", &["\u{31}\u{2e}\u{2060}\u{31}", "\u{2c}"]),
+        ("\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{2c}", &["\u{31}\u{2e}\u{2060}\u{308}\u{31}",
+        "\u{2c}"]), ("\u{31}\u{2e}\u{2060}\u{31}\u{2e}\u{2060}", &["\u{31}\u{2e}\u{2060}\u{31}",
+        "\u{2e}\u{2060}"]), ("\u{31}\u{2e}\u{2060}\u{308}\u{31}\u{2e}\u{2060}",
+        &["\u{31}\u{2e}\u{2060}\u{308}\u{31}", "\u{2e}\u{2060}"]), ("\u{d}\u{a}\u{61}\u{a}\u{308}",
+        &["\u{d}\u{a}", "\u{61}", "\u{a}", "\u{308}"]), ("\u{61}\u{308}", &["\u{61}\u{308}"]),
+        ("\u{20}\u{200d}\u{646}", &["\u{20}\u{200d}", "\u{646}"]), ("\u{646}\u{200d}\u{20}",
+        &["\u{646}\u{200d}", "\u{20}"]),
+        ("\u{671}\u{644}\u{631}\u{64e}\u{651}\u{62d}\u{650}\u{64a}\u{645}\u{650}\u{20}\u{6dd}\u{661}",
+        &["\u{671}\u{644}\u{631}\u{64e}\u{651}\u{62d}\u{650}\u{64a}\u{645}\u{650}", "\u{20}",
+        "\u{6dd}\u{661}"]),
+        ("\u{721}\u{719}\u{721}\u{718}\u{72a}\u{710}\u{20}\u{70f}\u{71d}\u{717}",
+        &["\u{721}\u{719}\u{721}\u{718}\u{72a}\u{710}", "\u{20}", "\u{70f}\u{71d}\u{717}"]),
+        ("\u{72c}\u{70f}\u{72b}\u{712}\u{718}", &["\u{72c}\u{70f}\u{72b}\u{712}\u{718}"]),
+        ("\u{41}\u{41}\u{41}", &["\u{41}\u{41}\u{41}"]), ("\u{41}\u{3a}\u{41}",
+        &["\u{41}\u{3a}\u{41}"]), ("\u{41}\u{3a}\u{3a}\u{41}", &["\u{41}", "\u{3a}", "\u{3a}",
+        "\u{41}"]), ("\u{5d0}\u{27}", &["\u{5d0}\u{27}"]), ("\u{5d0}\u{22}\u{5d0}",
+        &["\u{5d0}\u{22}\u{5d0}"]), ("\u{41}\u{30}\u{30}\u{41}", &["\u{41}\u{30}\u{30}\u{41}"]),
+        ("\u{30}\u{2c}\u{30}", &["\u{30}\u{2c}\u{30}"]), ("\u{30}\u{2c}\u{2c}\u{30}", &["\u{30}",
+        "\u{2c}", "\u{2c}", "\u{30}"]), ("\u{3031}\u{3031}", &["\u{3031}\u{3031}"]),
+        ("\u{41}\u{5f}\u{30}\u{5f}\u{3031}\u{5f}", &["\u{41}\u{5f}\u{30}\u{5f}\u{3031}\u{5f}"]),
+        ("\u{41}\u{5f}\u{5f}\u{41}", &["\u{41}\u{5f}\u{5f}\u{41}"]),
+        ("\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}", &["\u{1f1e6}\u{1f1e7}", "\u{1f1e8}", "\u{62}"]),
+        ("\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{62}", &["\u{61}", "\u{1f1e6}\u{1f1e7}", "\u{1f1e8}",
+        "\u{62}"]), ("\u{61}\u{1f1e6}\u{1f1e7}\u{200d}\u{1f1e8}\u{62}", &["\u{61}",
+        "\u{1f1e6}\u{1f1e7}\u{200d}", "\u{1f1e8}", "\u{62}"]),
+        ("\u{61}\u{1f1e6}\u{200d}\u{1f1e7}\u{1f1e8}\u{62}", &["\u{61}",
+        "\u{1f1e6}\u{200d}\u{1f1e7}", "\u{1f1e8}", "\u{62}"]),
+        ("\u{61}\u{1f1e6}\u{1f1e7}\u{1f1e8}\u{1f1e9}\u{62}", &["\u{61}", "\u{1f1e6}\u{1f1e7}",
+        "\u{1f1e8}\u{1f1e9}", "\u{62}"]), ("\u{1f476}\u{1f3ff}\u{1f476}", &["\u{1f476}\u{1f3ff}",
+        "\u{1f476}"]), ("\u{1f6d1}\u{200d}\u{1f6d1}", &["\u{1f6d1}\u{200d}\u{1f6d1}"]),
+        ("\u{61}\u{200d}\u{1f6d1}", &["\u{61}\u{200d}\u{1f6d1}"]), ("\u{2701}\u{200d}\u{2701}",
+        &["\u{2701}\u{200d}\u{2701}"]), ("\u{61}\u{200d}\u{2701}", &["\u{61}\u{200d}\u{2701}"]),
+        ("\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}",
+        &["\u{1f476}\u{1f3ff}\u{308}\u{200d}\u{1f476}\u{1f3ff}"]), ("\u{1f6d1}\u{1f3ff}",
+        &["\u{1f6d1}\u{1f3ff}"]), ("\u{200d}\u{1f6d1}\u{1f3ff}", &["\u{200d}\u{1f6d1}\u{1f3ff}"]),
+        ("\u{200d}\u{1f6d1}", &["\u{200d}\u{1f6d1}"]), ("\u{200d}\u{1f6d1}",
+        &["\u{200d}\u{1f6d1}"]), ("\u{1f6d1}\u{1f6d1}", &["\u{1f6d1}", "\u{1f6d1}"]),
+        ("\u{61}\u{308}\u{200d}\u{308}\u{62}", &["\u{61}\u{308}\u{200d}\u{308}\u{62}"]),
+        ("\u{61}\u{20}\u{20}\u{62}", &["\u{61}", "\u{20}\u{20}", "\u{62}"]),
+        ("\u{31}\u{3a}\u{3a}\u{31}", &["\u{31}", "\u{3a}", "\u{3a}", "\u{31}"]),
+        ("\u{31}\u{5f}\u{31}\u{3a}\u{3a}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{3a}", "\u{3a}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{3a}\u{3a}\u{31}", &["\u{31}\u{5f}\u{61}", "\u{3a}",
+        "\u{3a}", "\u{31}"]), ("\u{31}\u{3a}\u{3a}\u{61}", &["\u{31}", "\u{3a}", "\u{3a}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{3a}\u{3a}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{3a}",
+        "\u{3a}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{3a}\u{3a}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{3a}", "\u{3a}", "\u{61}"]), ("\u{31}\u{3a}\u{2e}\u{31}", &["\u{31}", "\u{3a}", "\u{2e}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{3a}\u{2e}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{3a}",
+        "\u{2e}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{3a}\u{2e}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{3a}", "\u{2e}", "\u{31}"]), ("\u{31}\u{3a}\u{2e}\u{61}", &["\u{31}", "\u{3a}", "\u{2e}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{3a}\u{2e}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{3a}",
+        "\u{2e}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{3a}\u{2e}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{3a}", "\u{2e}", "\u{61}"]), ("\u{31}\u{3a}\u{2c}\u{31}", &["\u{31}", "\u{3a}", "\u{2c}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{3a}\u{2c}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{3a}",
+        "\u{2c}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{3a}\u{2c}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{3a}", "\u{2c}", "\u{31}"]), ("\u{31}\u{3a}\u{2c}\u{61}", &["\u{31}", "\u{3a}", "\u{2c}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{3a}\u{2c}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{3a}",
+        "\u{2c}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{3a}\u{2c}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{3a}", "\u{2c}", "\u{61}"]), ("\u{31}\u{2e}\u{3a}\u{31}", &["\u{31}", "\u{2e}", "\u{3a}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{2e}\u{3a}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{2e}",
+        "\u{3a}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{2e}\u{3a}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{2e}", "\u{3a}", "\u{31}"]), ("\u{31}\u{2e}\u{3a}\u{61}", &["\u{31}", "\u{2e}", "\u{3a}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{2e}\u{3a}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{2e}",
+        "\u{3a}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{2e}\u{3a}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{2e}", "\u{3a}", "\u{61}"]), ("\u{31}\u{2e}\u{2e}\u{31}", &["\u{31}", "\u{2e}", "\u{2e}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{2e}\u{2e}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{2e}",
+        "\u{2e}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{2e}\u{2e}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{2e}", "\u{2e}", "\u{31}"]), ("\u{31}\u{2e}\u{2e}\u{61}", &["\u{31}", "\u{2e}", "\u{2e}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{2e}\u{2e}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{2e}",
+        "\u{2e}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{2e}\u{2e}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{2e}", "\u{2e}", "\u{61}"]), ("\u{31}\u{2e}\u{2c}\u{31}", &["\u{31}", "\u{2e}", "\u{2c}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{2e}\u{2c}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{2e}",
+        "\u{2c}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{2e}\u{2c}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{2e}", "\u{2c}", "\u{31}"]), ("\u{31}\u{2e}\u{2c}\u{61}", &["\u{31}", "\u{2e}", "\u{2c}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{2e}\u{2c}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{2e}",
+        "\u{2c}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{2e}\u{2c}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{2e}", "\u{2c}", "\u{61}"]), ("\u{31}\u{2c}\u{3a}\u{31}", &["\u{31}", "\u{2c}", "\u{3a}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{2c}\u{3a}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{2c}",
+        "\u{3a}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{2c}\u{3a}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{2c}", "\u{3a}", "\u{31}"]), ("\u{31}\u{2c}\u{3a}\u{61}", &["\u{31}", "\u{2c}", "\u{3a}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{2c}\u{3a}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{2c}",
+        "\u{3a}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{2c}\u{3a}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{2c}", "\u{3a}", "\u{61}"]), ("\u{31}\u{2c}\u{2e}\u{31}", &["\u{31}", "\u{2c}", "\u{2e}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{2c}\u{2e}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{2c}",
+        "\u{2e}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{2c}\u{2e}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{2c}", "\u{2e}", "\u{31}"]), ("\u{31}\u{2c}\u{2e}\u{61}", &["\u{31}", "\u{2c}", "\u{2e}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{2c}\u{2e}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{2c}",
+        "\u{2e}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{2c}\u{2e}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{2c}", "\u{2e}", "\u{61}"]), ("\u{31}\u{2c}\u{2c}\u{31}", &["\u{31}", "\u{2c}", "\u{2c}",
+        "\u{31}"]), ("\u{31}\u{5f}\u{31}\u{2c}\u{2c}\u{31}", &["\u{31}\u{5f}\u{31}", "\u{2c}",
+        "\u{2c}", "\u{31}"]), ("\u{31}\u{5f}\u{61}\u{2c}\u{2c}\u{31}", &["\u{31}\u{5f}\u{61}",
+        "\u{2c}", "\u{2c}", "\u{31}"]), ("\u{31}\u{2c}\u{2c}\u{61}", &["\u{31}", "\u{2c}", "\u{2c}",
+        "\u{61}"]), ("\u{31}\u{5f}\u{31}\u{2c}\u{2c}\u{61}", &["\u{31}\u{5f}\u{31}", "\u{2c}",
+        "\u{2c}", "\u{61}"]), ("\u{31}\u{5f}\u{61}\u{2c}\u{2c}\u{61}", &["\u{31}\u{5f}\u{61}",
+        "\u{2c}", "\u{2c}", "\u{61}"]), ("\u{61}\u{3a}\u{3a}\u{31}", &["\u{61}", "\u{3a}", "\u{3a}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{3a}\u{3a}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{3a}",
+        "\u{3a}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{3a}\u{3a}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{3a}", "\u{3a}", "\u{31}"]), ("\u{61}\u{3a}\u{3a}\u{61}", &["\u{61}", "\u{3a}", "\u{3a}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{3a}\u{3a}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{3a}",
+        "\u{3a}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{3a}\u{3a}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{3a}", "\u{3a}", "\u{61}"]), ("\u{61}\u{3a}\u{2e}\u{31}", &["\u{61}", "\u{3a}", "\u{2e}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{3a}\u{2e}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{3a}",
+        "\u{2e}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{3a}\u{2e}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{3a}", "\u{2e}", "\u{31}"]), ("\u{61}\u{3a}\u{2e}\u{61}", &["\u{61}", "\u{3a}", "\u{2e}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{3a}\u{2e}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{3a}",
+        "\u{2e}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{3a}\u{2e}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{3a}", "\u{2e}", "\u{61}"]), ("\u{61}\u{3a}\u{2c}\u{31}", &["\u{61}", "\u{3a}", "\u{2c}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{3a}\u{2c}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{3a}",
+        "\u{2c}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{3a}\u{2c}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{3a}", "\u{2c}", "\u{31}"]), ("\u{61}\u{3a}\u{2c}\u{61}", &["\u{61}", "\u{3a}", "\u{2c}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{3a}\u{2c}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{3a}",
+        "\u{2c}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{3a}\u{2c}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{3a}", "\u{2c}", "\u{61}"]), ("\u{61}\u{2e}\u{3a}\u{31}", &["\u{61}", "\u{2e}", "\u{3a}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{2e}\u{3a}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{2e}",
+        "\u{3a}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{2e}\u{3a}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{2e}", "\u{3a}", "\u{31}"]), ("\u{61}\u{2e}\u{3a}\u{61}", &["\u{61}", "\u{2e}", "\u{3a}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{2e}\u{3a}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{2e}",
+        "\u{3a}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{2e}\u{3a}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{2e}", "\u{3a}", "\u{61}"]), ("\u{61}\u{2e}\u{2e}\u{31}", &["\u{61}", "\u{2e}", "\u{2e}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{2e}\u{2e}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{2e}",
+        "\u{2e}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{2e}\u{2e}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{2e}", "\u{2e}", "\u{31}"]), ("\u{61}\u{2e}\u{2e}\u{61}", &["\u{61}", "\u{2e}", "\u{2e}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{2e}\u{2e}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{2e}",
+        "\u{2e}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{2e}\u{2e}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{2e}", "\u{2e}", "\u{61}"]), ("\u{61}\u{2e}\u{2c}\u{31}", &["\u{61}", "\u{2e}", "\u{2c}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{2e}\u{2c}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{2e}",
+        "\u{2c}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{2e}\u{2c}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{2e}", "\u{2c}", "\u{31}"]), ("\u{61}\u{2e}\u{2c}\u{61}", &["\u{61}", "\u{2e}", "\u{2c}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{2e}\u{2c}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{2e}",
+        "\u{2c}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{2e}\u{2c}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{2e}", "\u{2c}", "\u{61}"]), ("\u{61}\u{2c}\u{3a}\u{31}", &["\u{61}", "\u{2c}", "\u{3a}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{2c}\u{3a}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{2c}",
+        "\u{3a}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{2c}\u{3a}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{2c}", "\u{3a}", "\u{31}"]), ("\u{61}\u{2c}\u{3a}\u{61}", &["\u{61}", "\u{2c}", "\u{3a}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{2c}\u{3a}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{2c}",
+        "\u{3a}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{2c}\u{3a}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{2c}", "\u{3a}", "\u{61}"]), ("\u{61}\u{2c}\u{2e}\u{31}", &["\u{61}", "\u{2c}", "\u{2e}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{2c}\u{2e}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{2c}",
+        "\u{2e}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{2c}\u{2e}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{2c}", "\u{2e}", "\u{31}"]), ("\u{61}\u{2c}\u{2e}\u{61}", &["\u{61}", "\u{2c}", "\u{2e}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{2c}\u{2e}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{2c}",
+        "\u{2e}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{2c}\u{2e}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{2c}", "\u{2e}", "\u{61}"]), ("\u{61}\u{2c}\u{2c}\u{31}", &["\u{61}", "\u{2c}", "\u{2c}",
+        "\u{31}"]), ("\u{61}\u{5f}\u{31}\u{2c}\u{2c}\u{31}", &["\u{61}\u{5f}\u{31}", "\u{2c}",
+        "\u{2c}", "\u{31}"]), ("\u{61}\u{5f}\u{61}\u{2c}\u{2c}\u{31}", &["\u{61}\u{5f}\u{61}",
+        "\u{2c}", "\u{2c}", "\u{31}"]), ("\u{61}\u{2c}\u{2c}\u{61}", &["\u{61}", "\u{2c}", "\u{2c}",
+        "\u{61}"]), ("\u{61}\u{5f}\u{31}\u{2c}\u{2c}\u{61}", &["\u{61}\u{5f}\u{31}", "\u{2c}",
+        "\u{2c}", "\u{61}"]), ("\u{61}\u{5f}\u{61}\u{2c}\u{2c}\u{61}", &["\u{61}\u{5f}\u{61}",
+        "\u{2c}", "\u{2c}", "\u{61}"])
+    ];
+
+    // official Unicode test data
+    // http://www.unicode.org/Public/16.0.0/ucd/auxiliary/SentenceBreakTest.txt
+    pub const TEST_SENTENCE: &[(&str, &[&str])] = &[
+        ("\u{1}\u{1}", &["\u{1}\u{1}"]), ("\u{1}\u{308}\u{1}", &["\u{1}\u{308}\u{1}"]),
+        ("\u{1}\u{d}", &["\u{1}\u{d}"]), ("\u{1}\u{308}\u{d}", &["\u{1}\u{308}\u{d}"]),
+        ("\u{1}\u{a}", &["\u{1}\u{a}"]), ("\u{1}\u{308}\u{a}", &["\u{1}\u{308}\u{a}"]),
+        ("\u{1}\u{85}", &["\u{1}\u{85}"]), ("\u{1}\u{308}\u{85}", &["\u{1}\u{308}\u{85}"]),
+        ("\u{1}\u{9}", &["\u{1}\u{9}"]), ("\u{1}\u{308}\u{9}", &["\u{1}\u{308}\u{9}"]),
+        ("\u{1}\u{61}", &["\u{1}\u{61}"]), ("\u{1}\u{308}\u{61}", &["\u{1}\u{308}\u{61}"]),
+        ("\u{1}\u{41}", &["\u{1}\u{41}"]), ("\u{1}\u{308}\u{41}", &["\u{1}\u{308}\u{41}"]),
+        ("\u{1}\u{1bb}", &["\u{1}\u{1bb}"]), ("\u{1}\u{308}\u{1bb}", &["\u{1}\u{308}\u{1bb}"]),
+        ("\u{1}\u{30}", &["\u{1}\u{30}"]), ("\u{1}\u{308}\u{30}", &["\u{1}\u{308}\u{30}"]),
+        ("\u{1}\u{2e}", &["\u{1}\u{2e}"]), ("\u{1}\u{308}\u{2e}", &["\u{1}\u{308}\u{2e}"]),
+        ("\u{1}\u{21}", &["\u{1}\u{21}"]), ("\u{1}\u{308}\u{21}", &["\u{1}\u{308}\u{21}"]),
+        ("\u{1}\u{22}", &["\u{1}\u{22}"]), ("\u{1}\u{308}\u{22}", &["\u{1}\u{308}\u{22}"]),
+        ("\u{1}\u{2c}", &["\u{1}\u{2c}"]), ("\u{1}\u{308}\u{2c}", &["\u{1}\u{308}\u{2c}"]),
+        ("\u{1}\u{ad}", &["\u{1}\u{ad}"]), ("\u{1}\u{308}\u{ad}", &["\u{1}\u{308}\u{ad}"]),
+        ("\u{1}\u{300}", &["\u{1}\u{300}"]), ("\u{1}\u{308}\u{300}", &["\u{1}\u{308}\u{300}"]),
+        ("\u{d}\u{1}", &["\u{d}", "\u{1}"]), ("\u{d}\u{308}\u{1}", &["\u{d}", "\u{308}\u{1}"]),
+        ("\u{d}\u{d}", &["\u{d}", "\u{d}"]), ("\u{d}\u{308}\u{d}", &["\u{d}", "\u{308}\u{d}"]),
+        ("\u{d}\u{a}", &["\u{d}\u{a}"]), ("\u{d}\u{308}\u{a}", &["\u{d}", "\u{308}\u{a}"]),
+        ("\u{d}\u{85}", &["\u{d}", "\u{85}"]), ("\u{d}\u{308}\u{85}", &["\u{d}", "\u{308}\u{85}"]),
+        ("\u{d}\u{9}", &["\u{d}", "\u{9}"]), ("\u{d}\u{308}\u{9}", &["\u{d}", "\u{308}\u{9}"]),
+        ("\u{d}\u{61}", &["\u{d}", "\u{61}"]), ("\u{d}\u{308}\u{61}", &["\u{d}", "\u{308}\u{61}"]),
+        ("\u{d}\u{41}", &["\u{d}", "\u{41}"]), ("\u{d}\u{308}\u{41}", &["\u{d}", "\u{308}\u{41}"]),
+        ("\u{d}\u{1bb}", &["\u{d}", "\u{1bb}"]), ("\u{d}\u{308}\u{1bb}", &["\u{d}",
+        "\u{308}\u{1bb}"]), ("\u{d}\u{30}", &["\u{d}", "\u{30}"]), ("\u{d}\u{308}\u{30}", &["\u{d}",
+        "\u{308}\u{30}"]), ("\u{d}\u{2e}", &["\u{d}", "\u{2e}"]), ("\u{d}\u{308}\u{2e}", &["\u{d}",
+        "\u{308}\u{2e}"]), ("\u{d}\u{21}", &["\u{d}", "\u{21}"]), ("\u{d}\u{308}\u{21}", &["\u{d}",
+        "\u{308}\u{21}"]), ("\u{d}\u{22}", &["\u{d}", "\u{22}"]), ("\u{d}\u{308}\u{22}", &["\u{d}",
+        "\u{308}\u{22}"]), ("\u{d}\u{2c}", &["\u{d}", "\u{2c}"]), ("\u{d}\u{308}\u{2c}", &["\u{d}",
+        "\u{308}\u{2c}"]), ("\u{d}\u{ad}", &["\u{d}", "\u{ad}"]), ("\u{d}\u{308}\u{ad}", &["\u{d}",
+        "\u{308}\u{ad}"]), ("\u{d}\u{300}", &["\u{d}", "\u{300}"]), ("\u{d}\u{308}\u{300}",
+        &["\u{d}", "\u{308}\u{300}"]), ("\u{a}\u{1}", &["\u{a}", "\u{1}"]), ("\u{a}\u{308}\u{1}",
+        &["\u{a}", "\u{308}\u{1}"]), ("\u{a}\u{d}", &["\u{a}", "\u{d}"]), ("\u{a}\u{308}\u{d}",
+        &["\u{a}", "\u{308}\u{d}"]), ("\u{a}\u{a}", &["\u{a}", "\u{a}"]), ("\u{a}\u{308}\u{a}",
+        &["\u{a}", "\u{308}\u{a}"]), ("\u{a}\u{85}", &["\u{a}", "\u{85}"]), ("\u{a}\u{308}\u{85}",
+        &["\u{a}", "\u{308}\u{85}"]), ("\u{a}\u{9}", &["\u{a}", "\u{9}"]), ("\u{a}\u{308}\u{9}",
+        &["\u{a}", "\u{308}\u{9}"]), ("\u{a}\u{61}", &["\u{a}", "\u{61}"]), ("\u{a}\u{308}\u{61}",
+        &["\u{a}", "\u{308}\u{61}"]), ("\u{a}\u{41}", &["\u{a}", "\u{41}"]), ("\u{a}\u{308}\u{41}",
+        &["\u{a}", "\u{308}\u{41}"]), ("\u{a}\u{1bb}", &["\u{a}", "\u{1bb}"]),
+        ("\u{a}\u{308}\u{1bb}", &["\u{a}", "\u{308}\u{1bb}"]), ("\u{a}\u{30}", &["\u{a}",
+        "\u{30}"]), ("\u{a}\u{308}\u{30}", &["\u{a}", "\u{308}\u{30}"]), ("\u{a}\u{2e}", &["\u{a}",
+        "\u{2e}"]), ("\u{a}\u{308}\u{2e}", &["\u{a}", "\u{308}\u{2e}"]), ("\u{a}\u{21}", &["\u{a}",
+        "\u{21}"]), ("\u{a}\u{308}\u{21}", &["\u{a}", "\u{308}\u{21}"]), ("\u{a}\u{22}", &["\u{a}",
+        "\u{22}"]), ("\u{a}\u{308}\u{22}", &["\u{a}", "\u{308}\u{22}"]), ("\u{a}\u{2c}", &["\u{a}",
+        "\u{2c}"]), ("\u{a}\u{308}\u{2c}", &["\u{a}", "\u{308}\u{2c}"]), ("\u{a}\u{ad}", &["\u{a}",
+        "\u{ad}"]), ("\u{a}\u{308}\u{ad}", &["\u{a}", "\u{308}\u{ad}"]), ("\u{a}\u{300}", &["\u{a}",
+        "\u{300}"]), ("\u{a}\u{308}\u{300}", &["\u{a}", "\u{308}\u{300}"]), ("\u{85}\u{1}",
+        &["\u{85}", "\u{1}"]), ("\u{85}\u{308}\u{1}", &["\u{85}", "\u{308}\u{1}"]), ("\u{85}\u{d}",
+        &["\u{85}", "\u{d}"]), ("\u{85}\u{308}\u{d}", &["\u{85}", "\u{308}\u{d}"]), ("\u{85}\u{a}",
+        &["\u{85}", "\u{a}"]), ("\u{85}\u{308}\u{a}", &["\u{85}", "\u{308}\u{a}"]), ("\u{85}\u{85}",
+        &["\u{85}", "\u{85}"]), ("\u{85}\u{308}\u{85}", &["\u{85}", "\u{308}\u{85}"]),
+        ("\u{85}\u{9}", &["\u{85}", "\u{9}"]), ("\u{85}\u{308}\u{9}", &["\u{85}", "\u{308}\u{9}"]),
+        ("\u{85}\u{61}", &["\u{85}", "\u{61}"]), ("\u{85}\u{308}\u{61}", &["\u{85}",
+        "\u{308}\u{61}"]), ("\u{85}\u{41}", &["\u{85}", "\u{41}"]), ("\u{85}\u{308}\u{41}",
+        &["\u{85}", "\u{308}\u{41}"]), ("\u{85}\u{1bb}", &["\u{85}", "\u{1bb}"]),
+        ("\u{85}\u{308}\u{1bb}", &["\u{85}", "\u{308}\u{1bb}"]), ("\u{85}\u{30}", &["\u{85}",
+        "\u{30}"]), ("\u{85}\u{308}\u{30}", &["\u{85}", "\u{308}\u{30}"]), ("\u{85}\u{2e}",
+        &["\u{85}", "\u{2e}"]), ("\u{85}\u{308}\u{2e}", &["\u{85}", "\u{308}\u{2e}"]),
+        ("\u{85}\u{21}", &["\u{85}", "\u{21}"]), ("\u{85}\u{308}\u{21}", &["\u{85}",
+        "\u{308}\u{21}"]), ("\u{85}\u{22}", &["\u{85}", "\u{22}"]), ("\u{85}\u{308}\u{22}",
+        &["\u{85}", "\u{308}\u{22}"]), ("\u{85}\u{2c}", &["\u{85}", "\u{2c}"]),
+        ("\u{85}\u{308}\u{2c}", &["\u{85}", "\u{308}\u{2c}"]), ("\u{85}\u{ad}", &["\u{85}",
+        "\u{ad}"]), ("\u{85}\u{308}\u{ad}", &["\u{85}", "\u{308}\u{ad}"]), ("\u{85}\u{300}",
+        &["\u{85}", "\u{300}"]), ("\u{85}\u{308}\u{300}", &["\u{85}", "\u{308}\u{300}"]),
+        ("\u{9}\u{1}", &["\u{9}\u{1}"]), ("\u{9}\u{308}\u{1}", &["\u{9}\u{308}\u{1}"]),
+        ("\u{9}\u{d}", &["\u{9}\u{d}"]), ("\u{9}\u{308}\u{d}", &["\u{9}\u{308}\u{d}"]),
+        ("\u{9}\u{a}", &["\u{9}\u{a}"]), ("\u{9}\u{308}\u{a}", &["\u{9}\u{308}\u{a}"]),
+        ("\u{9}\u{85}", &["\u{9}\u{85}"]), ("\u{9}\u{308}\u{85}", &["\u{9}\u{308}\u{85}"]),
+        ("\u{9}\u{9}", &["\u{9}\u{9}"]), ("\u{9}\u{308}\u{9}", &["\u{9}\u{308}\u{9}"]),
+        ("\u{9}\u{61}", &["\u{9}\u{61}"]), ("\u{9}\u{308}\u{61}", &["\u{9}\u{308}\u{61}"]),
+        ("\u{9}\u{41}", &["\u{9}\u{41}"]), ("\u{9}\u{308}\u{41}", &["\u{9}\u{308}\u{41}"]),
+        ("\u{9}\u{1bb}", &["\u{9}\u{1bb}"]), ("\u{9}\u{308}\u{1bb}", &["\u{9}\u{308}\u{1bb}"]),
+        ("\u{9}\u{30}", &["\u{9}\u{30}"]), ("\u{9}\u{308}\u{30}", &["\u{9}\u{308}\u{30}"]),
+        ("\u{9}\u{2e}", &["\u{9}\u{2e}"]), ("\u{9}\u{308}\u{2e}", &["\u{9}\u{308}\u{2e}"]),
+        ("\u{9}\u{21}", &["\u{9}\u{21}"]), ("\u{9}\u{308}\u{21}", &["\u{9}\u{308}\u{21}"]),
+        ("\u{9}\u{22}", &["\u{9}\u{22}"]), ("\u{9}\u{308}\u{22}", &["\u{9}\u{308}\u{22}"]),
+        ("\u{9}\u{2c}", &["\u{9}\u{2c}"]), ("\u{9}\u{308}\u{2c}", &["\u{9}\u{308}\u{2c}"]),
+        ("\u{9}\u{ad}", &["\u{9}\u{ad}"]), ("\u{9}\u{308}\u{ad}", &["\u{9}\u{308}\u{ad}"]),
+        ("\u{9}\u{300}", &["\u{9}\u{300}"]), ("\u{9}\u{308}\u{300}", &["\u{9}\u{308}\u{300}"]),
+        ("\u{61}\u{1}", &["\u{61}\u{1}"]), ("\u{61}\u{308}\u{1}", &["\u{61}\u{308}\u{1}"]),
+        ("\u{61}\u{d}", &["\u{61}\u{d}"]), ("\u{61}\u{308}\u{d}", &["\u{61}\u{308}\u{d}"]),
+        ("\u{61}\u{a}", &["\u{61}\u{a}"]), ("\u{61}\u{308}\u{a}", &["\u{61}\u{308}\u{a}"]),
+        ("\u{61}\u{85}", &["\u{61}\u{85}"]), ("\u{61}\u{308}\u{85}", &["\u{61}\u{308}\u{85}"]),
+        ("\u{61}\u{9}", &["\u{61}\u{9}"]), ("\u{61}\u{308}\u{9}", &["\u{61}\u{308}\u{9}"]),
+        ("\u{61}\u{61}", &["\u{61}\u{61}"]), ("\u{61}\u{308}\u{61}", &["\u{61}\u{308}\u{61}"]),
+        ("\u{61}\u{41}", &["\u{61}\u{41}"]), ("\u{61}\u{308}\u{41}", &["\u{61}\u{308}\u{41}"]),
+        ("\u{61}\u{1bb}", &["\u{61}\u{1bb}"]), ("\u{61}\u{308}\u{1bb}", &["\u{61}\u{308}\u{1bb}"]),
+        ("\u{61}\u{30}", &["\u{61}\u{30}"]), ("\u{61}\u{308}\u{30}", &["\u{61}\u{308}\u{30}"]),
+        ("\u{61}\u{2e}", &["\u{61}\u{2e}"]), ("\u{61}\u{308}\u{2e}", &["\u{61}\u{308}\u{2e}"]),
+        ("\u{61}\u{21}", &["\u{61}\u{21}"]), ("\u{61}\u{308}\u{21}", &["\u{61}\u{308}\u{21}"]),
+        ("\u{61}\u{22}", &["\u{61}\u{22}"]), ("\u{61}\u{308}\u{22}", &["\u{61}\u{308}\u{22}"]),
+        ("\u{61}\u{2c}", &["\u{61}\u{2c}"]), ("\u{61}\u{308}\u{2c}", &["\u{61}\u{308}\u{2c}"]),
+        ("\u{61}\u{ad}", &["\u{61}\u{ad}"]), ("\u{61}\u{308}\u{ad}", &["\u{61}\u{308}\u{ad}"]),
+        ("\u{61}\u{300}", &["\u{61}\u{300}"]), ("\u{61}\u{308}\u{300}", &["\u{61}\u{308}\u{300}"]),
+        ("\u{41}\u{1}", &["\u{41}\u{1}"]), ("\u{41}\u{308}\u{1}", &["\u{41}\u{308}\u{1}"]),
+        ("\u{41}\u{d}", &["\u{41}\u{d}"]), ("\u{41}\u{308}\u{d}", &["\u{41}\u{308}\u{d}"]),
+        ("\u{41}\u{a}", &["\u{41}\u{a}"]), ("\u{41}\u{308}\u{a}", &["\u{41}\u{308}\u{a}"]),
+        ("\u{41}\u{85}", &["\u{41}\u{85}"]), ("\u{41}\u{308}\u{85}", &["\u{41}\u{308}\u{85}"]),
+        ("\u{41}\u{9}", &["\u{41}\u{9}"]), ("\u{41}\u{308}\u{9}", &["\u{41}\u{308}\u{9}"]),
+        ("\u{41}\u{61}", &["\u{41}\u{61}"]), ("\u{41}\u{308}\u{61}", &["\u{41}\u{308}\u{61}"]),
+        ("\u{41}\u{41}", &["\u{41}\u{41}"]), ("\u{41}\u{308}\u{41}", &["\u{41}\u{308}\u{41}"]),
+        ("\u{41}\u{1bb}", &["\u{41}\u{1bb}"]), ("\u{41}\u{308}\u{1bb}", &["\u{41}\u{308}\u{1bb}"]),
+        ("\u{41}\u{30}", &["\u{41}\u{30}"]), ("\u{41}\u{308}\u{30}", &["\u{41}\u{308}\u{30}"]),
+        ("\u{41}\u{2e}", &["\u{41}\u{2e}"]), ("\u{41}\u{308}\u{2e}", &["\u{41}\u{308}\u{2e}"]),
+        ("\u{41}\u{21}", &["\u{41}\u{21}"]), ("\u{41}\u{308}\u{21}", &["\u{41}\u{308}\u{21}"]),
+        ("\u{41}\u{22}", &["\u{41}\u{22}"]), ("\u{41}\u{308}\u{22}", &["\u{41}\u{308}\u{22}"]),
+        ("\u{41}\u{2c}", &["\u{41}\u{2c}"]), ("\u{41}\u{308}\u{2c}", &["\u{41}\u{308}\u{2c}"]),
+        ("\u{41}\u{ad}", &["\u{41}\u{ad}"]), ("\u{41}\u{308}\u{ad}", &["\u{41}\u{308}\u{ad}"]),
+        ("\u{41}\u{300}", &["\u{41}\u{300}"]), ("\u{41}\u{308}\u{300}", &["\u{41}\u{308}\u{300}"]),
+        ("\u{1bb}\u{1}", &["\u{1bb}\u{1}"]), ("\u{1bb}\u{308}\u{1}", &["\u{1bb}\u{308}\u{1}"]),
+        ("\u{1bb}\u{d}", &["\u{1bb}\u{d}"]), ("\u{1bb}\u{308}\u{d}", &["\u{1bb}\u{308}\u{d}"]),
+        ("\u{1bb}\u{a}", &["\u{1bb}\u{a}"]), ("\u{1bb}\u{308}\u{a}", &["\u{1bb}\u{308}\u{a}"]),
+        ("\u{1bb}\u{85}", &["\u{1bb}\u{85}"]), ("\u{1bb}\u{308}\u{85}", &["\u{1bb}\u{308}\u{85}"]),
+        ("\u{1bb}\u{9}", &["\u{1bb}\u{9}"]), ("\u{1bb}\u{308}\u{9}", &["\u{1bb}\u{308}\u{9}"]),
+        ("\u{1bb}\u{61}", &["\u{1bb}\u{61}"]), ("\u{1bb}\u{308}\u{61}", &["\u{1bb}\u{308}\u{61}"]),
+        ("\u{1bb}\u{41}", &["\u{1bb}\u{41}"]), ("\u{1bb}\u{308}\u{41}", &["\u{1bb}\u{308}\u{41}"]),
+        ("\u{1bb}\u{1bb}", &["\u{1bb}\u{1bb}"]), ("\u{1bb}\u{308}\u{1bb}",
+        &["\u{1bb}\u{308}\u{1bb}"]), ("\u{1bb}\u{30}", &["\u{1bb}\u{30}"]), ("\u{1bb}\u{308}\u{30}",
+        &["\u{1bb}\u{308}\u{30}"]), ("\u{1bb}\u{2e}", &["\u{1bb}\u{2e}"]), ("\u{1bb}\u{308}\u{2e}",
+        &["\u{1bb}\u{308}\u{2e}"]), ("\u{1bb}\u{21}", &["\u{1bb}\u{21}"]), ("\u{1bb}\u{308}\u{21}",
+        &["\u{1bb}\u{308}\u{21}"]), ("\u{1bb}\u{22}", &["\u{1bb}\u{22}"]), ("\u{1bb}\u{308}\u{22}",
+        &["\u{1bb}\u{308}\u{22}"]), ("\u{1bb}\u{2c}", &["\u{1bb}\u{2c}"]), ("\u{1bb}\u{308}\u{2c}",
+        &["\u{1bb}\u{308}\u{2c}"]), ("\u{1bb}\u{ad}", &["\u{1bb}\u{ad}"]), ("\u{1bb}\u{308}\u{ad}",
+        &["\u{1bb}\u{308}\u{ad}"]), ("\u{1bb}\u{300}", &["\u{1bb}\u{300}"]),
+        ("\u{1bb}\u{308}\u{300}", &["\u{1bb}\u{308}\u{300}"]), ("\u{30}\u{1}", &["\u{30}\u{1}"]),
+        ("\u{30}\u{308}\u{1}", &["\u{30}\u{308}\u{1}"]), ("\u{30}\u{d}", &["\u{30}\u{d}"]),
+        ("\u{30}\u{308}\u{d}", &["\u{30}\u{308}\u{d}"]), ("\u{30}\u{a}", &["\u{30}\u{a}"]),
+        ("\u{30}\u{308}\u{a}", &["\u{30}\u{308}\u{a}"]), ("\u{30}\u{85}", &["\u{30}\u{85}"]),
+        ("\u{30}\u{308}\u{85}", &["\u{30}\u{308}\u{85}"]), ("\u{30}\u{9}", &["\u{30}\u{9}"]),
+        ("\u{30}\u{308}\u{9}", &["\u{30}\u{308}\u{9}"]), ("\u{30}\u{61}", &["\u{30}\u{61}"]),
+        ("\u{30}\u{308}\u{61}", &["\u{30}\u{308}\u{61}"]), ("\u{30}\u{41}", &["\u{30}\u{41}"]),
+        ("\u{30}\u{308}\u{41}", &["\u{30}\u{308}\u{41}"]), ("\u{30}\u{1bb}", &["\u{30}\u{1bb}"]),
+        ("\u{30}\u{308}\u{1bb}", &["\u{30}\u{308}\u{1bb}"]), ("\u{30}\u{30}", &["\u{30}\u{30}"]),
+        ("\u{30}\u{308}\u{30}", &["\u{30}\u{308}\u{30}"]), ("\u{30}\u{2e}", &["\u{30}\u{2e}"]),
+        ("\u{30}\u{308}\u{2e}", &["\u{30}\u{308}\u{2e}"]), ("\u{30}\u{21}", &["\u{30}\u{21}"]),
+        ("\u{30}\u{308}\u{21}", &["\u{30}\u{308}\u{21}"]), ("\u{30}\u{22}", &["\u{30}\u{22}"]),
+        ("\u{30}\u{308}\u{22}", &["\u{30}\u{308}\u{22}"]), ("\u{30}\u{2c}", &["\u{30}\u{2c}"]),
+        ("\u{30}\u{308}\u{2c}", &["\u{30}\u{308}\u{2c}"]), ("\u{30}\u{ad}", &["\u{30}\u{ad}"]),
+        ("\u{30}\u{308}\u{ad}", &["\u{30}\u{308}\u{ad}"]), ("\u{30}\u{300}", &["\u{30}\u{300}"]),
+        ("\u{30}\u{308}\u{300}", &["\u{30}\u{308}\u{300}"]), ("\u{2e}\u{1}", &["\u{2e}", "\u{1}"]),
+        ("\u{2e}\u{308}\u{1}", &["\u{2e}\u{308}", "\u{1}"]), ("\u{2e}\u{d}", &["\u{2e}\u{d}"]),
+        ("\u{2e}\u{308}\u{d}", &["\u{2e}\u{308}\u{d}"]), ("\u{2e}\u{a}", &["\u{2e}\u{a}"]),
+        ("\u{2e}\u{308}\u{a}", &["\u{2e}\u{308}\u{a}"]), ("\u{2e}\u{85}", &["\u{2e}\u{85}"]),
+        ("\u{2e}\u{308}\u{85}", &["\u{2e}\u{308}\u{85}"]), ("\u{2e}\u{9}", &["\u{2e}\u{9}"]),
+        ("\u{2e}\u{308}\u{9}", &["\u{2e}\u{308}\u{9}"]), ("\u{2e}\u{61}", &["\u{2e}\u{61}"]),
+        ("\u{2e}\u{308}\u{61}", &["\u{2e}\u{308}\u{61}"]), ("\u{2e}\u{41}", &["\u{2e}", "\u{41}"]),
+        ("\u{2e}\u{308}\u{41}", &["\u{2e}\u{308}", "\u{41}"]), ("\u{2e}\u{1bb}", &["\u{2e}",
+        "\u{1bb}"]), ("\u{2e}\u{308}\u{1bb}", &["\u{2e}\u{308}", "\u{1bb}"]), ("\u{2e}\u{30}",
+        &["\u{2e}\u{30}"]), ("\u{2e}\u{308}\u{30}", &["\u{2e}\u{308}\u{30}"]), ("\u{2e}\u{2e}",
+        &["\u{2e}\u{2e}"]), ("\u{2e}\u{308}\u{2e}", &["\u{2e}\u{308}\u{2e}"]), ("\u{2e}\u{21}",
+        &["\u{2e}\u{21}"]), ("\u{2e}\u{308}\u{21}", &["\u{2e}\u{308}\u{21}"]), ("\u{2e}\u{22}",
+        &["\u{2e}\u{22}"]), ("\u{2e}\u{308}\u{22}", &["\u{2e}\u{308}\u{22}"]), ("\u{2e}\u{2c}",
+        &["\u{2e}\u{2c}"]), ("\u{2e}\u{308}\u{2c}", &["\u{2e}\u{308}\u{2c}"]), ("\u{2e}\u{ad}",
+        &["\u{2e}\u{ad}"]), ("\u{2e}\u{308}\u{ad}", &["\u{2e}\u{308}\u{ad}"]), ("\u{2e}\u{300}",
+        &["\u{2e}\u{300}"]), ("\u{2e}\u{308}\u{300}", &["\u{2e}\u{308}\u{300}"]), ("\u{21}\u{1}",
+        &["\u{21}", "\u{1}"]), ("\u{21}\u{308}\u{1}", &["\u{21}\u{308}", "\u{1}"]), ("\u{21}\u{d}",
+        &["\u{21}\u{d}"]), ("\u{21}\u{308}\u{d}", &["\u{21}\u{308}\u{d}"]), ("\u{21}\u{a}",
+        &["\u{21}\u{a}"]), ("\u{21}\u{308}\u{a}", &["\u{21}\u{308}\u{a}"]), ("\u{21}\u{85}",
+        &["\u{21}\u{85}"]), ("\u{21}\u{308}\u{85}", &["\u{21}\u{308}\u{85}"]), ("\u{21}\u{9}",
+        &["\u{21}\u{9}"]), ("\u{21}\u{308}\u{9}", &["\u{21}\u{308}\u{9}"]), ("\u{21}\u{61}",
+        &["\u{21}", "\u{61}"]), ("\u{21}\u{308}\u{61}", &["\u{21}\u{308}", "\u{61}"]),
+        ("\u{21}\u{41}", &["\u{21}", "\u{41}"]), ("\u{21}\u{308}\u{41}", &["\u{21}\u{308}",
+        "\u{41}"]), ("\u{21}\u{1bb}", &["\u{21}", "\u{1bb}"]), ("\u{21}\u{308}\u{1bb}",
+        &["\u{21}\u{308}", "\u{1bb}"]), ("\u{21}\u{30}", &["\u{21}", "\u{30}"]),
+        ("\u{21}\u{308}\u{30}", &["\u{21}\u{308}", "\u{30}"]), ("\u{21}\u{2e}", &["\u{21}\u{2e}"]),
+        ("\u{21}\u{308}\u{2e}", &["\u{21}\u{308}\u{2e}"]), ("\u{21}\u{21}", &["\u{21}\u{21}"]),
+        ("\u{21}\u{308}\u{21}", &["\u{21}\u{308}\u{21}"]), ("\u{21}\u{22}", &["\u{21}\u{22}"]),
+        ("\u{21}\u{308}\u{22}", &["\u{21}\u{308}\u{22}"]), ("\u{21}\u{2c}", &["\u{21}\u{2c}"]),
+        ("\u{21}\u{308}\u{2c}", &["\u{21}\u{308}\u{2c}"]), ("\u{21}\u{ad}", &["\u{21}\u{ad}"]),
+        ("\u{21}\u{308}\u{ad}", &["\u{21}\u{308}\u{ad}"]), ("\u{21}\u{300}", &["\u{21}\u{300}"]),
+        ("\u{21}\u{308}\u{300}", &["\u{21}\u{308}\u{300}"]), ("\u{22}\u{1}", &["\u{22}\u{1}"]),
+        ("\u{22}\u{308}\u{1}", &["\u{22}\u{308}\u{1}"]), ("\u{22}\u{d}", &["\u{22}\u{d}"]),
+        ("\u{22}\u{308}\u{d}", &["\u{22}\u{308}\u{d}"]), ("\u{22}\u{a}", &["\u{22}\u{a}"]),
+        ("\u{22}\u{308}\u{a}", &["\u{22}\u{308}\u{a}"]), ("\u{22}\u{85}", &["\u{22}\u{85}"]),
+        ("\u{22}\u{308}\u{85}", &["\u{22}\u{308}\u{85}"]), ("\u{22}\u{9}", &["\u{22}\u{9}"]),
+        ("\u{22}\u{308}\u{9}", &["\u{22}\u{308}\u{9}"]), ("\u{22}\u{61}", &["\u{22}\u{61}"]),
+        ("\u{22}\u{308}\u{61}", &["\u{22}\u{308}\u{61}"]), ("\u{22}\u{41}", &["\u{22}\u{41}"]),
+        ("\u{22}\u{308}\u{41}", &["\u{22}\u{308}\u{41}"]), ("\u{22}\u{1bb}", &["\u{22}\u{1bb}"]),
+        ("\u{22}\u{308}\u{1bb}", &["\u{22}\u{308}\u{1bb}"]), ("\u{22}\u{30}", &["\u{22}\u{30}"]),
+        ("\u{22}\u{308}\u{30}", &["\u{22}\u{308}\u{30}"]), ("\u{22}\u{2e}", &["\u{22}\u{2e}"]),
+        ("\u{22}\u{308}\u{2e}", &["\u{22}\u{308}\u{2e}"]), ("\u{22}\u{21}", &["\u{22}\u{21}"]),
+        ("\u{22}\u{308}\u{21}", &["\u{22}\u{308}\u{21}"]), ("\u{22}\u{22}", &["\u{22}\u{22}"]),
+        ("\u{22}\u{308}\u{22}", &["\u{22}\u{308}\u{22}"]), ("\u{22}\u{2c}", &["\u{22}\u{2c}"]),
+        ("\u{22}\u{308}\u{2c}", &["\u{22}\u{308}\u{2c}"]), ("\u{22}\u{ad}", &["\u{22}\u{ad}"]),
+        ("\u{22}\u{308}\u{ad}", &["\u{22}\u{308}\u{ad}"]), ("\u{22}\u{300}", &["\u{22}\u{300}"]),
+        ("\u{22}\u{308}\u{300}", &["\u{22}\u{308}\u{300}"]), ("\u{2c}\u{1}", &["\u{2c}\u{1}"]),
+        ("\u{2c}\u{308}\u{1}", &["\u{2c}\u{308}\u{1}"]), ("\u{2c}\u{d}", &["\u{2c}\u{d}"]),
+        ("\u{2c}\u{308}\u{d}", &["\u{2c}\u{308}\u{d}"]), ("\u{2c}\u{a}", &["\u{2c}\u{a}"]),
+        ("\u{2c}\u{308}\u{a}", &["\u{2c}\u{308}\u{a}"]), ("\u{2c}\u{85}", &["\u{2c}\u{85}"]),
+        ("\u{2c}\u{308}\u{85}", &["\u{2c}\u{308}\u{85}"]), ("\u{2c}\u{9}", &["\u{2c}\u{9}"]),
+        ("\u{2c}\u{308}\u{9}", &["\u{2c}\u{308}\u{9}"]), ("\u{2c}\u{61}", &["\u{2c}\u{61}"]),
+        ("\u{2c}\u{308}\u{61}", &["\u{2c}\u{308}\u{61}"]), ("\u{2c}\u{41}", &["\u{2c}\u{41}"]),
+        ("\u{2c}\u{308}\u{41}", &["\u{2c}\u{308}\u{41}"]), ("\u{2c}\u{1bb}", &["\u{2c}\u{1bb}"]),
+        ("\u{2c}\u{308}\u{1bb}", &["\u{2c}\u{308}\u{1bb}"]), ("\u{2c}\u{30}", &["\u{2c}\u{30}"]),
+        ("\u{2c}\u{308}\u{30}", &["\u{2c}\u{308}\u{30}"]), ("\u{2c}\u{2e}", &["\u{2c}\u{2e}"]),
+        ("\u{2c}\u{308}\u{2e}", &["\u{2c}\u{308}\u{2e}"]), ("\u{2c}\u{21}", &["\u{2c}\u{21}"]),
+        ("\u{2c}\u{308}\u{21}", &["\u{2c}\u{308}\u{21}"]), ("\u{2c}\u{22}", &["\u{2c}\u{22}"]),
+        ("\u{2c}\u{308}\u{22}", &["\u{2c}\u{308}\u{22}"]), ("\u{2c}\u{2c}", &["\u{2c}\u{2c}"]),
+        ("\u{2c}\u{308}\u{2c}", &["\u{2c}\u{308}\u{2c}"]), ("\u{2c}\u{ad}", &["\u{2c}\u{ad}"]),
+        ("\u{2c}\u{308}\u{ad}", &["\u{2c}\u{308}\u{ad}"]), ("\u{2c}\u{300}", &["\u{2c}\u{300}"]),
+        ("\u{2c}\u{308}\u{300}", &["\u{2c}\u{308}\u{300}"]), ("\u{ad}\u{1}", &["\u{ad}\u{1}"]),
+        ("\u{ad}\u{308}\u{1}", &["\u{ad}\u{308}\u{1}"]), ("\u{ad}\u{d}", &["\u{ad}\u{d}"]),
+        ("\u{ad}\u{308}\u{d}", &["\u{ad}\u{308}\u{d}"]), ("\u{ad}\u{a}", &["\u{ad}\u{a}"]),
+        ("\u{ad}\u{308}\u{a}", &["\u{ad}\u{308}\u{a}"]), ("\u{ad}\u{85}", &["\u{ad}\u{85}"]),
+        ("\u{ad}\u{308}\u{85}", &["\u{ad}\u{308}\u{85}"]), ("\u{ad}\u{9}", &["\u{ad}\u{9}"]),
+        ("\u{ad}\u{308}\u{9}", &["\u{ad}\u{308}\u{9}"]), ("\u{ad}\u{61}", &["\u{ad}\u{61}"]),
+        ("\u{ad}\u{308}\u{61}", &["\u{ad}\u{308}\u{61}"]), ("\u{ad}\u{41}", &["\u{ad}\u{41}"]),
+        ("\u{ad}\u{308}\u{41}", &["\u{ad}\u{308}\u{41}"]), ("\u{ad}\u{1bb}", &["\u{ad}\u{1bb}"]),
+        ("\u{ad}\u{308}\u{1bb}", &["\u{ad}\u{308}\u{1bb}"]), ("\u{ad}\u{30}", &["\u{ad}\u{30}"]),
+        ("\u{ad}\u{308}\u{30}", &["\u{ad}\u{308}\u{30}"]), ("\u{ad}\u{2e}", &["\u{ad}\u{2e}"]),
+        ("\u{ad}\u{308}\u{2e}", &["\u{ad}\u{308}\u{2e}"]), ("\u{ad}\u{21}", &["\u{ad}\u{21}"]),
+        ("\u{ad}\u{308}\u{21}", &["\u{ad}\u{308}\u{21}"]), ("\u{ad}\u{22}", &["\u{ad}\u{22}"]),
+        ("\u{ad}\u{308}\u{22}", &["\u{ad}\u{308}\u{22}"]), ("\u{ad}\u{2c}", &["\u{ad}\u{2c}"]),
+        ("\u{ad}\u{308}\u{2c}", &["\u{ad}\u{308}\u{2c}"]), ("\u{ad}\u{ad}", &["\u{ad}\u{ad}"]),
+        ("\u{ad}\u{308}\u{ad}", &["\u{ad}\u{308}\u{ad}"]), ("\u{ad}\u{300}", &["\u{ad}\u{300}"]),
+        ("\u{ad}\u{308}\u{300}", &["\u{ad}\u{308}\u{300}"]), ("\u{300}\u{1}", &["\u{300}\u{1}"]),
+        ("\u{300}\u{308}\u{1}", &["\u{300}\u{308}\u{1}"]), ("\u{300}\u{d}", &["\u{300}\u{d}"]),
+        ("\u{300}\u{308}\u{d}", &["\u{300}\u{308}\u{d}"]), ("\u{300}\u{a}", &["\u{300}\u{a}"]),
+        ("\u{300}\u{308}\u{a}", &["\u{300}\u{308}\u{a}"]), ("\u{300}\u{85}", &["\u{300}\u{85}"]),
+        ("\u{300}\u{308}\u{85}", &["\u{300}\u{308}\u{85}"]), ("\u{300}\u{9}", &["\u{300}\u{9}"]),
+        ("\u{300}\u{308}\u{9}", &["\u{300}\u{308}\u{9}"]), ("\u{300}\u{61}", &["\u{300}\u{61}"]),
+        ("\u{300}\u{308}\u{61}", &["\u{300}\u{308}\u{61}"]), ("\u{300}\u{41}", &["\u{300}\u{41}"]),
+        ("\u{300}\u{308}\u{41}", &["\u{300}\u{308}\u{41}"]), ("\u{300}\u{1bb}",
+        &["\u{300}\u{1bb}"]), ("\u{300}\u{308}\u{1bb}", &["\u{300}\u{308}\u{1bb}"]),
+        ("\u{300}\u{30}", &["\u{300}\u{30}"]), ("\u{300}\u{308}\u{30}", &["\u{300}\u{308}\u{30}"]),
+        ("\u{300}\u{2e}", &["\u{300}\u{2e}"]), ("\u{300}\u{308}\u{2e}", &["\u{300}\u{308}\u{2e}"]),
+        ("\u{300}\u{21}", &["\u{300}\u{21}"]), ("\u{300}\u{308}\u{21}", &["\u{300}\u{308}\u{21}"]),
+        ("\u{300}\u{22}", &["\u{300}\u{22}"]), ("\u{300}\u{308}\u{22}", &["\u{300}\u{308}\u{22}"]),
+        ("\u{300}\u{2c}", &["\u{300}\u{2c}"]), ("\u{300}\u{308}\u{2c}", &["\u{300}\u{308}\u{2c}"]),
+        ("\u{300}\u{ad}", &["\u{300}\u{ad}"]), ("\u{300}\u{308}\u{ad}", &["\u{300}\u{308}\u{ad}"]),
+        ("\u{300}\u{300}", &["\u{300}\u{300}"]), ("\u{300}\u{308}\u{300}",
+        &["\u{300}\u{308}\u{300}"]), ("\u{d}\u{a}\u{61}\u{a}\u{308}", &["\u{d}\u{a}", "\u{61}\u{a}",
+        "\u{308}"]), ("\u{61}\u{308}", &["\u{61}\u{308}"]), ("\u{20}\u{200d}\u{646}",
+        &["\u{20}\u{200d}\u{646}"]), ("\u{646}\u{200d}\u{20}", &["\u{646}\u{200d}\u{20}"]),
+        ("\u{28}\u{22}\u{47}\u{6f}\u{2e}\u{22}\u{29}\u{20}\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}",
+        &["\u{28}\u{22}\u{47}\u{6f}\u{2e}\u{22}\u{29}\u{20}",
+        "\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}"]),
+        ("\u{28}\u{201c}\u{47}\u{6f}\u{3f}\u{201d}\u{29}\u{20}\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}",
+        &["\u{28}\u{201c}\u{47}\u{6f}\u{3f}\u{201d}\u{29}\u{20}",
+        "\u{28}\u{48}\u{65}\u{20}\u{64}\u{69}\u{64}\u{2e}\u{29}"]),
+        ("\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}\u{20}\u{69}\u{73}",
+        &["\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}\u{20}\u{69}\u{73}"]),
+        ("\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{3f}\u{20}\u{48}\u{65}",
+        &["\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{3f}\u{20}", "\u{48}\u{65}"]),
+        ("\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}",
+        &["\u{55}\u{2e}\u{53}\u{2e}\u{41}\u{300}\u{2e}"]), ("\u{33}\u{2e}\u{34}",
+        &["\u{33}\u{2e}\u{34}"]), ("\u{63}\u{2e}\u{64}", &["\u{63}\u{2e}\u{64}"]),
+        ("\u{43}\u{2e}\u{64}", &["\u{43}\u{2e}\u{64}"]), ("\u{63}\u{2e}\u{44}",
+        &["\u{63}\u{2e}\u{44}"]), ("\u{43}\u{2e}\u{44}", &["\u{43}\u{2e}\u{44}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{74}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{74}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{54}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}", "\u{54}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{2018}\u{28}\u{74}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{2018}\u{28}\u{74}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{2018}\u{28}\u{54}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}", "\u{2018}\u{28}\u{54}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}\u{74}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}\u{74}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}\u{54}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{a0}\u{308}", "\u{54}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{308}\u{54}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{2019}\u{308}", "\u{54}\u{68}\u{65}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{29}\u{a}\u{308}\u{54}\u{68}\u{65}",
+        &["\u{65}\u{74}\u{63}\u{2e}\u{29}\u{a}", "\u{308}\u{54}\u{68}\u{65}"]),
+        ("\u{74}\u{68}\u{65}\u{20}\u{72}\u{65}\u{73}\u{70}\u{2e}\u{20}\u{6c}\u{65}\u{61}\u{64}\u{65}\u{72}\u{73}\u{20}\u{61}\u{72}\u{65}",
+        &["\u{74}\u{68}\u{65}\u{20}\u{72}\u{65}\u{73}\u{70}\u{2e}\u{20}\u{6c}\u{65}\u{61}\u{64}\u{65}\u{72}\u{73}\u{20}\u{61}\u{72}\u{65}"]),
+        ("\u{5b57}\u{2e}\u{5b57}", &["\u{5b57}\u{2e}", "\u{5b57}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{5b83}", &["\u{65}\u{74}\u{63}\u{2e}", "\u{5b83}"]),
+        ("\u{65}\u{74}\u{63}\u{2e}\u{3002}", &["\u{65}\u{74}\u{63}\u{2e}\u{3002}"]),
+        ("\u{5b57}\u{3002}\u{5b83}", &["\u{5b57}\u{3002}", "\u{5b83}"]), ("\u{21}\u{20}\u{20}",
+        &["\u{21}\u{20}\u{20}"]), ("\u{61}\u{2e}", &["\u{61}\u{2e}"]), ("\u{61}\u{2e}\u{d}\u{a}",
+        &["\u{61}\u{2e}\u{d}\u{a}"]), ("\u{61}\u{2e}\u{d}\u{a}\u{20}", &["\u{61}\u{2e}\u{d}\u{a}",
+        "\u{20}"]), ("\u{61}\u{2e}\u{d}\u{a}\u{61}", &["\u{61}\u{2e}\u{d}\u{a}", "\u{61}"]),
+        ("\u{41}\u{2e}\u{d}\u{a}\u{41}", &["\u{41}\u{2e}\u{d}\u{a}", "\u{41}"]),
+        ("\u{2060}\u{28}\u{2060}\u{22}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{2e}\u{2060}\u{22}\u{2060}\u{29}\u{2060}\u{20}\u{2060}\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}",
+        &["\u{2060}\u{28}\u{2060}\u{22}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{2e}\u{2060}\u{22}\u{2060}\u{29}\u{2060}\u{20}\u{2060}",
+        "\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{28}\u{2060}\u{201c}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{3f}\u{2060}\u{201d}\u{2060}\u{29}\u{2060}\u{20}\u{2060}\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}",
+        &["\u{2060}\u{28}\u{2060}\u{201c}\u{2060}\u{47}\u{2060}\u{6f}\u{2060}\u{3f}\u{2060}\u{201d}\u{2060}\u{29}\u{2060}\u{20}\u{2060}",
+        "\u{28}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{64}\u{2060}\u{69}\u{2060}\u{64}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{20}\u{2060}\u{69}\u{2060}\u{73}\u{2060}\u{2060}",
+        &["\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{20}\u{2060}\u{69}\u{2060}\u{73}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{3f}\u{2060}\u{20}\u{2060}\u{48}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{3f}\u{2060}\u{20}\u{2060}",
+        "\u{48}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{2060}",
+        &["\u{2060}\u{55}\u{2060}\u{2e}\u{2060}\u{53}\u{2060}\u{2e}\u{2060}\u{41}\u{2060}\u{300}\u{2e}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{33}\u{2060}\u{2e}\u{2060}\u{34}\u{2060}\u{2060}",
+        &["\u{2060}\u{33}\u{2060}\u{2e}\u{2060}\u{34}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}",
+        &["\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}",
+        &["\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{64}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}",
+        &["\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}",
+        &["\u{2060}\u{43}\u{2060}\u{2e}\u{2060}\u{44}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}",
+        "\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{2018}\u{2060}\u{28}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{2018}\u{2060}\u{28}\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{2018}\u{2060}\u{28}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}",
+        "\u{2018}\u{2060}\u{28}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{a0}\u{2060}\u{308}",
+        "\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{308}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{2019}\u{2060}\u{308}",
+        "\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{a}\u{2060}\u{308}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{29}\u{2060}\u{a}",
+        "\u{2060}\u{308}\u{2060}\u{54}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{73}\u{2060}\u{70}\u{2060}\u{2e}\u{2060}\u{20}\u{2060}\u{6c}\u{2060}\u{65}\u{2060}\u{61}\u{2060}\u{64}\u{2060}\u{65}\u{2060}\u{72}\u{2060}\u{73}\u{2060}\u{20}\u{2060}\u{61}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{2060}",
+        &["\u{2060}\u{74}\u{2060}\u{68}\u{2060}\u{65}\u{2060}\u{20}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{73}\u{2060}\u{70}\u{2060}\u{2e}\u{2060}\u{20}\u{2060}\u{6c}\u{2060}\u{65}\u{2060}\u{61}\u{2060}\u{64}\u{2060}\u{65}\u{2060}\u{72}\u{2060}\u{73}\u{2060}\u{20}\u{2060}\u{61}\u{2060}\u{72}\u{2060}\u{65}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{5b57}\u{2060}\u{2e}\u{2060}\u{5b57}\u{2060}\u{2060}",
+        &["\u{2060}\u{5b57}\u{2060}\u{2e}\u{2060}", "\u{5b57}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{5b83}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}",
+        "\u{5b83}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{3002}\u{2060}\u{2060}",
+        &["\u{2060}\u{65}\u{2060}\u{74}\u{2060}\u{63}\u{2060}\u{2e}\u{2060}\u{3002}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{5b57}\u{2060}\u{3002}\u{2060}\u{5b83}\u{2060}\u{2060}",
+        &["\u{2060}\u{5b57}\u{2060}\u{3002}\u{2060}", "\u{5b83}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{21}\u{2060}\u{20}\u{2060}\u{20}\u{2060}\u{2060}",
+        &["\u{2060}\u{21}\u{2060}\u{20}\u{2060}\u{20}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{2060}",
+        &["\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{d}\u{2060}\u{a}\u{2060}",
+        &["\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{d}", "\u{2060}\u{a}", "\u{2060}"]),
+        ("\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{d}\u{2060}\u{a}\u{20}\u{2060}\u{2060}",
+        &["\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{d}", "\u{2060}\u{a}", "\u{20}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{d}\u{2060}\u{a}\u{61}\u{2060}\u{2060}",
+        &["\u{2060}\u{61}\u{2060}\u{2e}\u{2060}\u{d}", "\u{2060}\u{a}", "\u{61}\u{2060}\u{2060}"]),
+        ("\u{2060}\u{41}\u{2060}\u{2e}\u{2060}\u{d}\u{2060}\u{a}\u{41}\u{2060}\u{2060}",
+        &["\u{2060}\u{41}\u{2060}\u{2e}\u{2060}\u{d}", "\u{2060}\u{a}", "\u{41}\u{2060}\u{2060}"])
+    ];
+
diff --git a/crates/url/.android-checksum.json b/crates/url/.android-checksum.json
index 3150d8b..4909838 100644
--- a/crates/url/.android-checksum.json
+++ b/crates/url/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"0ba51b922282eaf1d6e0b2c00c1e625f8e58e8aaa4c6f593bc5e6923a6d0fffe","Android.bp":"b7338c7ac3d9b89ba2d99cab1a8b8e243f530da2a04e59986e9536b1d9a6fd5f","Cargo.toml":"fcfc86d4e7d76008893caa267936efd266f728940729943d26213a84a79cbee4","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"deddd7dd9f80ec3543c05774ad3a5658e2f6b7cb55453e09d3131325589624f7","METADATA":"884ae537c17fceecb695be36a84d14472669adaad6809789238ca95e1ff64e0e","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"21bf566956331d981d41f9a803ed0d0b5dbf2df375f5837409ab181a98ca6082","TEST_MAPPING":"a2bb7cbc14986cf9c9fa3970683f5f9b2dbb974ad3e385162bc51df051887294","cargo_embargo.json":"18240e8ad1b44847f352e7fdf9ed13a5290db11959ed4f96ca6b549ae7d6c44c","src/host.rs":"ea2abeb95bbec7fa5eb46702f55336e4bc60df40bcce4b504a2c98515a8b342e","src/lib.rs":"fa80553a03cff80cc7c8be478f208cac5f0639a2510a161157433b5f92dab9d7","src/origin.rs":"dda7752ffdfceacf2e88dfa7d8e32723f90d8e118ce9c2ea4135b8d7e7db5caf","src/parser.rs":"3bfdaded3c0aeb877a946bd7699f66c9c93b749da12004bcc280db6b754a9efe","src/path_segments.rs":"9bb3e1763cb227da431109b2b81c7417295f3081ceb3718e81b44141f3c1b92e","src/quirks.rs":"30eab4f6c446e2ae4789a62189c4e9daaf4ba1d4f248c6da9db59a19fcbc7df6","src/slicing.rs":"3f6d4b826ab5cac00cd04920e13625705aa7927b7ee7dd62545a3db67cea0b94","tests/data.rs":"19d7ebf770b3f0253d43f2a30a326c336c8e27a1ff9e3d5470f918b683e1994a","tests/debugger_visualizer.rs":"d3e66ebfdb6934de79f6e9a94699a8bebcd0f482d2ac32a6cb15aa92d8c83d85","tests/setters_tests.json":"088f26ae1073ff42257b6d0e7d15bd321c952a51a499f2087f13c859af8057b9","tests/unit.rs":"5d0f25c7649adcf0a48274263c39562894cee6cd4f9af34ec5433197e15ac7c3","tests/urltestdata.json":"80f800ce5e7c342fec897aab8db0ec3094476b3a771ec3d187e9fb062403d03b"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"0a9e9b63a282327b18f0f5eb847c4a7da101273ca72cdcfc72fd17e7d014b873","Android.bp":"0018fa9a595b042a19ffba2afd0f7af59237e99780057b0c307f2d2aeb1d2510","Cargo.toml":"4cbdf93133a4742e5bc045b451df6d4000f7ba1d5e72a7df2dbd6e94457fe7c3","LICENSE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-APACHE":"3c7cd2396b5b772507febd2615d3d5a55b80103845037df77c87ba6e64872f2c","LICENSE-MIT":"deddd7dd9f80ec3543c05774ad3a5658e2f6b7cb55453e09d3131325589624f7","METADATA":"d023b3057b739c0f0bc11e0bf219d9669351507b05ba61c983771635080a634a","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"56778957be598e54c0deb26344d2e1436fbfcdc6f11c97dbb8026f8752e45331","TEST_MAPPING":"a2bb7cbc14986cf9c9fa3970683f5f9b2dbb974ad3e385162bc51df051887294","cargo_embargo.json":"18240e8ad1b44847f352e7fdf9ed13a5290db11959ed4f96ca6b549ae7d6c44c","src/host.rs":"64d68badf67b9b74b9d539168269ff3740b202302a9b2b6c91c392e42c7b4ca5","src/lib.rs":"82a1f70c485ce12ee0ff905f2e5060e29a7f902fce74f90e242b7bd8b463f68c","src/origin.rs":"dda7752ffdfceacf2e88dfa7d8e32723f90d8e118ce9c2ea4135b8d7e7db5caf","src/parser.rs":"921c34e9e7142c96589f0d23e3551cd4272dbb6f49ef54e47118267563cef580","src/path_segments.rs":"9354b137626fa9a0f5acfc665bc56bde6b56756ed3f5d5934e20f2bdf39ac017","src/quirks.rs":"8059aa0f782dd12dc2996aa0c6e081ddf7eb16fee8797f465802e96814b1fe67","src/slicing.rs":"f214d74f637a8bbff60f6e1be4225c5374f4254ed115d9eb34d130ca546e23a3","tests/expected_failures.txt":"3e2090342a0b1e22359e960a0e12d3777a2587bfe0870d26804e072fc7a3642a","tests/setters_tests.json":"0b29bb14bf75046a697f7ff018b57e64c39210c7c4e85a5a1874483f5519d3f4","tests/unit.rs":"cd57e15637f38016581bcc1eb606e63dd1cc4c5ab7801b2a6cba94ede7442ddd","tests/urltestdata.json":"3e2f00e307d2679fe7b85f5be0d56b7df78a2894d3514334ae53498c8b33bc52","tests/wpt.rs":"600d579e666fd265cae7ddea3a58d0aa68a48139c52df5d6139a992c146c45b5"}}
\ No newline at end of file
diff --git a/crates/url/.cargo-checksum.json b/crates/url/.cargo-checksum.json
index 8a65910..152b4ad 100644
--- a/crates/url/.cargo-checksum.json
+++ b/crates/url/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"c861c99782bfd4be160167bf659e87792f00d7e1eb1ee072a59546143fa980f4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"76e972ac0f4ddb116e86e10100132a783931a596e7b9872eaa31be15cd4d751d","README.md":"71b01ec6f2f4ce47235ee430ba0c41afac563403a9dbcda23a584c3e915395ac","src/host.rs":"60cd21e0b4cbb208c36eec5d40628a8bbe1d7ef13e481479b33f89cef96277ec","src/lib.rs":"c48655bc0455efecb7f7e36dfee8b92f6d96d9a1fbc5b24890ef255fb7843956","src/origin.rs":"19a4b451e8615bfef7239d2fc719c489398fe5044edb0df7c84b54eef4ceba1b","src/parser.rs":"5c05f233722560fd21899e982b9defc828ba13fbe70e7cf157a439968716c6ae","src/path_segments.rs":"dd6b637245b2ad77ce96221df3f80c8b4ad858cd52aecc86b97166dec386882a","src/quirks.rs":"82903ff9c95604409cded330e36ebba0ede91c469d1aa40fb646186e2bef0769","src/slicing.rs":"25425fc5c4100a3a5da49d1e0b497f6536066afcc91c4ba4dff5ace0860acd40","tests/data.rs":"dbd795b25fe7869b242aeeb822c736167d5b4be1f6a867f563e23977d07c8fc5","tests/debugger_visualizer.rs":"d3a9466c636ee80ec9181817a8d30ea3e0cee699776ee4b805175981e4775448","tests/setters_tests.json":"486f6d129960d0d0d99b533caf9bef21113b31adcdb83296dfc4a59cd8431715","tests/unit.rs":"9707676cd80d7c8131b9c805f03b387a36ca2b1dda84a4d567788814c8afe59f","tests/urltestdata.json":"9dca78fbbcb6fceb0584f2fae7b3bb4e8a868750f2426c359c6694aed25f2682"},"package":"0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"}
\ No newline at end of file
+{"files":{"Cargo.toml":"aa522f2d3c3664cccde934fcdaf56346c69398ffe7d447a92ac4b01060500034","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"76e972ac0f4ddb116e86e10100132a783931a596e7b9872eaa31be15cd4d751d","README.md":"6111161470aa4d5f2e3806936df0c874b8eca5f8c8cd2d71a60eb6c2cbb776ab","src/host.rs":"e378ca362e87f3897df2696100a8c273875d99fcd17b1044592842b9a6e8b81f","src/lib.rs":"55800335ebe7e4f4bec8701e6ef7e5a498b460d4070ba21b5e9b9b2355a780de","src/origin.rs":"19a4b451e8615bfef7239d2fc719c489398fe5044edb0df7c84b54eef4ceba1b","src/parser.rs":"106d7b3232dee97e5412fdcfcee906f989ede1bed0b7a053bbfd0ed69df500bf","src/path_segments.rs":"29db87b6902da4ab1ae925b3874afdeff42b8ddfb46356af6a83b86f34e03b14","src/quirks.rs":"79818bd168b138e8edd30011033c1f6defb847fe96f8a57381cf9251c27e866b","src/slicing.rs":"3b1aaad36ba7e89f50c90d1ceddda1f8ba52a364c153541ac5c9ce54dacb6724","tests/expected_failures.txt":"fc4f619316f1fb117b01d8089c04b925b8db0652f46b8534a87e115c5544881b","tests/setters_tests.json":"a3a4cbd7b798bc2c4d9656dc50be7397a5a5ed1f0b52daa1da1ad654d38c1dcd","tests/unit.rs":"c895675581e737ad8e1536786f80385df0426495074ee6cc011830f45f16f6f7","tests/urltestdata.json":"58d67bea710d5f46324fe6841df5fd82090fe4ec2d882bc0fc7c1784d4771884","tests/wpt.rs":"8781251116a9de8169327ed40a0237ac6ff2f84e3d579d6fb6d7353362f9a48a"},"package":"22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"}
\ No newline at end of file
diff --git a/crates/url/Android.bp b/crates/url/Android.bp
index 525f9b7..3f07824 100644
--- a/crates/url/Android.bp
+++ b/crates/url/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "url",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.3.1",
+    cargo_pkg_version: "2.5.2",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: ["default"],
@@ -37,12 +37,12 @@
 }
 
 rust_test {
-    name: "url_test_tests_data",
+    name: "url_test_src_lib",
     host_supported: true,
-    crate_name: "data",
+    crate_name: "url",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.3.1",
-    crate_root: "tests/data.rs",
+    cargo_pkg_version: "2.5.2",
+    crate_root: "src/lib.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
     test_options: {
@@ -55,8 +55,8 @@
         "libform_urlencoded",
         "libidna",
         "libpercent_encoding",
+        "libserde",
         "libserde_json",
-        "liburl",
     ],
 }
 
@@ -65,7 +65,7 @@
     host_supported: true,
     crate_name: "unit",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.3.1",
+    cargo_pkg_version: "2.5.2",
     crate_root: "tests/unit.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -79,6 +79,7 @@
         "libform_urlencoded",
         "libidna",
         "libpercent_encoding",
+        "libserde",
         "libserde_json",
         "liburl",
     ],
diff --git a/crates/url/Cargo.toml b/crates/url/Cargo.toml
index 4363ae5..9e648ac 100644
--- a/crates/url/Cargo.toml
+++ b/crates/url/Cargo.toml
@@ -11,9 +11,9 @@
 
 [package]
 edition = "2018"
-rust-version = "1.51"
+rust-version = "1.56"
 name = "url"
-version = "2.3.1"
+version = "2.5.2"
 authors = ["The rust-url developers"]
 include = [
     "src/**/*",
@@ -36,11 +36,17 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/servo/rust-url"
 
+[package.metadata.docs.rs]
+features = ["serde"]
+rustdoc-args = ["--generate-link-to-definition"]
+
+[package.metadata.playground]
+features = ["serde"]
+
 [[test]]
-name = "debugger_visualizer"
-path = "tests/debugger_visualizer.rs"
-test = false
-required-features = ["debugger_visualizer"]
+name = "url_wpt"
+path = "tests/wpt.rs"
+harness = false
 
 [[bench]]
 name = "parse_url"
@@ -48,13 +54,13 @@
 harness = false
 
 [dependencies.form_urlencoded]
-version = "1.1.0"
+version = "1.2.1"
 
 [dependencies.idna]
-version = "0.3.0"
+version = "0.5.0"
 
 [dependencies.percent-encoding]
-version = "2.2.0"
+version = "2.3.1"
 
 [dependencies.serde]
 version = "1.0"
@@ -64,11 +70,9 @@
 [dev-dependencies.bencher]
 version = "0.1"
 
-[dev-dependencies.debugger_test]
-version = "0.1"
-
-[dev-dependencies.debugger_test_parser]
-version = "0.1"
+[dev-dependencies.serde]
+version = "1.0"
+features = ["derive"]
 
 [dev-dependencies.serde_json]
 version = "1.0"
@@ -78,8 +82,5 @@
 default = []
 expose_internals = []
 
-[badges.appveyor]
-repository = "Manishearth/rust-url"
-
-[badges.travis-ci]
-repository = "servo/rust-url"
+[target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dev-dependencies.wasm-bindgen-test]
+version = "0.3"
diff --git a/crates/url/METADATA b/crates/url/METADATA
index f358ef2..529247f 100644
--- a/crates/url/METADATA
+++ b/crates/url/METADATA
@@ -1,17 +1,17 @@
 name: "url"
 description: "URL library for Rust, based on the WHATWG URL Standard"
 third_party {
-  version: "2.3.1"
+  version: "2.5.2"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2022
-    month: 12
-    day: 19
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/url"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/url/url-2.3.1.crate"
-    version: "2.3.1"
+    value: "https://static.crates.io/crates/url/url-2.5.2.crate"
+    version: "2.5.2"
   }
 }
diff --git a/crates/url/README.md b/crates/url/README.md
index ab31bff..99d5c2b 100644
--- a/crates/url/README.md
+++ b/crates/url/README.md
@@ -9,6 +9,6 @@
 
 URL library for Rust, based on the [URL Standard](https://url.spec.whatwg.org/).
 
-[Documentation](https://docs.rs/url/)
+[Documentation](https://docs.rs/url)
 
-Please see [UPGRADING.md](https://github.com/servo/rust-url/blob/master/UPGRADING.md) if you are upgrading from a previous version.
+Please see [UPGRADING.md](https://github.com/servo/rust-url/blob/main/UPGRADING.md) if you are upgrading from a previous version.
diff --git a/crates/url/src/host.rs b/crates/url/src/host.rs
index f1921c6..7ec3563 100644
--- a/crates/url/src/host.rs
+++ b/crates/url/src/host.rs
@@ -269,7 +269,7 @@
     } else {
         last
     };
-    if !last.is_empty() && last.chars().all(|c| ('0'..='9').contains(&c)) {
+    if !last.is_empty() && last.as_bytes().iter().all(|c| c.is_ascii_digit()) {
         return true;
     }
 
@@ -297,11 +297,9 @@
     }
 
     let valid_number = match r {
-        8 => input.chars().all(|c| ('0'..='7').contains(&c)),
-        10 => input.chars().all(|c| ('0'..='9').contains(&c)),
-        16 => input.chars().all(|c| {
-            ('0'..='9').contains(&c) || ('a'..='f').contains(&c) || ('A'..='F').contains(&c)
-        }),
+        8 => input.as_bytes().iter().all(|c| (b'0'..=b'7').contains(c)),
+        10 => input.as_bytes().iter().all(|c| c.is_ascii_digit()),
+        16 => input.as_bytes().iter().all(|c| c.is_ascii_hexdigit()),
         _ => false,
     };
     if !valid_number {
@@ -334,7 +332,7 @@
     }
     let mut ipv4 = numbers.pop().expect("a non-empty list of numbers");
     // Equivalent to: ipv4 >= 256 ** (4 − numbers.len())
-    if ipv4 > u32::max_value() >> (8 * numbers.len() as u32) {
+    if ipv4 > u32::MAX >> (8 * numbers.len() as u32) {
         return Err(ParseError::InvalidIpv4Address);
     }
     if numbers.iter().any(|x| *x > 255) {
diff --git a/crates/url/src/lib.rs b/crates/url/src/lib.rs
index 6dc09d1..33c6a73 100644
--- a/crates/url/src/lib.rs
+++ b/crates/url/src/lib.rs
@@ -119,12 +119,24 @@
 url = { version = "2", features = ["serde"] }
 ```
 
+# Feature: `debugger_visualizer`
+
+If you enable the `debugger_visualizer` feature, the `url` crate will include
+a [natvis file](https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects)
+for [Visual Studio](https://www.visualstudio.com/) that allows you to view
+[`Url`](struct.Url.html) objects in the debugger.
+
+This feature requires Rust 1.71 or later.
+
+```toml
+url = { version = "2", features = ["debugger_visualizer"] }
+```
+
 */
 
-#![doc(html_root_url = "https://docs.rs/url/2.3.1")]
+#![doc(html_root_url = "https://docs.rs/url/2.5.2")]
 #![cfg_attr(
     feature = "debugger_visualizer",
-    feature(debugger_visualizer),
     debugger_visualizer(natvis_file = "../../debug_metadata/url.natvis")
 )]
 
@@ -134,15 +146,20 @@
 extern crate serde;
 
 use crate::host::HostInternal;
-use crate::parser::{to_u32, Context, Parser, SchemeType, PATH_SEGMENT, USERINFO};
+use crate::parser::{
+    to_u32, Context, Parser, SchemeType, PATH_SEGMENT, SPECIAL_PATH_SEGMENT, USERINFO,
+};
 use percent_encoding::{percent_decode, percent_encode, utf8_percent_encode};
 use std::borrow::Borrow;
 use std::cmp;
 use std::fmt::{self, Write};
 use std::hash;
+#[cfg(any(unix, windows, target_os = "redox", target_os = "wasi"))]
 use std::io;
 use std::mem;
-use std::net::{IpAddr, SocketAddr, ToSocketAddrs};
+use std::net::IpAddr;
+#[cfg(any(unix, windows, target_os = "redox", target_os = "wasi"))]
+use std::net::{SocketAddr, ToSocketAddrs};
 use std::ops::{Range, RangeFrom, RangeTo};
 use std::path::{Path, PathBuf};
 use std::str;
@@ -193,6 +210,7 @@
 
 /// Full configuration for the URL parser.
 #[derive(Copy, Clone)]
+#[must_use]
 pub struct ParseOptions<'a> {
     base_url: Option<&'a Url>,
     encoding_override: EncodingOverride<'a>,
@@ -201,6 +219,9 @@
 
 impl<'a> ParseOptions<'a> {
     /// Change the base URL
+    ///
+    /// See the notes of [`Url::join`] for more details about how this base is considered
+    /// when parsing.
     pub fn base_url(mut self, new: Option<&'a Url>) -> Self {
         self.base_url = new;
         self
@@ -322,13 +343,44 @@
         url
     }
 
+    /// https://url.spec.whatwg.org/#potentially-strip-trailing-spaces-from-an-opaque-path
+    fn strip_trailing_spaces_from_opaque_path(&mut self) {
+        if !self.cannot_be_a_base() {
+            return;
+        }
+
+        if self.fragment_start.is_some() {
+            return;
+        }
+
+        if self.query_start.is_some() {
+            return;
+        }
+
+        let trailing_space_count = self
+            .serialization
+            .chars()
+            .rev()
+            .take_while(|c| *c == ' ')
+            .count();
+
+        let start = self.serialization.len() - trailing_space_count;
+
+        self.serialization.truncate(start);
+    }
+
     /// Parse a string as an URL, with this URL as the base URL.
     ///
     /// The inverse of this is [`make_relative`].
     ///
-    /// Note: a trailing slash is significant.
+    /// # Notes
+    ///
+    /// - A trailing slash is significant.
     /// Without it, the last path component is considered to be a “file” name
-    /// to be removed to get at the “directory” that is used as the base:
+    /// to be removed to get at the “directory” that is used as the base.
+    /// - A [scheme relative special URL](https://url.spec.whatwg.org/#scheme-relative-special-url-string)
+    /// as input replaces everything in the base URL after the scheme.
+    /// - An absolute URL (with a scheme) as input replaces the whole base URL (even the scheme).
     ///
     /// # Examples
     ///
@@ -336,14 +388,27 @@
     /// use url::Url;
     /// # use url::ParseError;
     ///
+    /// // Base without a trailing slash
     /// # fn run() -> Result<(), ParseError> {
     /// let base = Url::parse("https://example.net/a/b.html")?;
     /// let url = base.join("c.png")?;
     /// assert_eq!(url.as_str(), "https://example.net/a/c.png");  // Not /a/b.html/c.png
     ///
+    /// // Base with a trailing slash
     /// let base = Url::parse("https://example.net/a/b/")?;
     /// let url = base.join("c.png")?;
     /// assert_eq!(url.as_str(), "https://example.net/a/b/c.png");
+    ///
+    /// // Input as scheme relative special URL
+    /// let base = Url::parse("https://alice.com/a")?;
+    /// let url = base.join("//eve.com/b")?;
+    /// assert_eq!(url.as_str(), "https://eve.com/b");
+    ///
+    /// // Input as absolute URL
+    /// let base = Url::parse("https://alice.com/a")?;
+    /// let url = base.join("http://eve.com/b")?;
+    /// assert_eq!(url.as_str(), "http://eve.com/b");  // http instead of https
+
     /// # Ok(())
     /// # }
     /// # run().unwrap();
@@ -601,7 +666,7 @@
         }
 
         assert!(self.scheme_end >= 1);
-        assert!(matches!(self.byte_at(0), b'a'..=b'z' | b'A'..=b'Z'));
+        assert!(self.byte_at(0).is_ascii_alphabetic());
         assert!(self
             .slice(1..self.scheme_end)
             .chars()
@@ -657,7 +722,14 @@
             assert_eq!(self.host_end, self.scheme_end + 1);
             assert_eq!(self.host, HostInternal::None);
             assert_eq!(self.port, None);
-            assert_eq!(self.path_start, self.scheme_end + 1);
+            if self.path().starts_with("//") {
+                // special case when first path segment is empty
+                assert_eq!(self.byte_at(self.scheme_end + 1), b'/');
+                assert_eq!(self.byte_at(self.scheme_end + 2), b'.');
+                assert_eq!(self.path_start, self.scheme_end + 3);
+            } else {
+                assert_eq!(self.path_start, self.scheme_end + 1);
+            }
         }
         if let Some(start) = self.query_start {
             assert!(start >= self.path_start);
@@ -786,12 +858,35 @@
         self.slice(..self.scheme_end)
     }
 
+    /// Return whether the URL is special (has a special scheme)
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use url::Url;
+    /// # use url::ParseError;
+    ///
+    /// # fn run() -> Result<(), ParseError> {
+    /// assert!(Url::parse("http:///tmp/foo")?.is_special());
+    /// assert!(Url::parse("file:///tmp/foo")?.is_special());
+    /// assert!(!Url::parse("moz:///tmp/foo")?.is_special());
+    /// # Ok(())
+    /// # }
+    /// # run().unwrap();
+    /// ```
+    pub fn is_special(&self) -> bool {
+        let scheme_type = SchemeType::from(self.scheme());
+        scheme_type.is_special()
+    }
+
     /// Return whether the URL has an 'authority',
     /// which can contain a username, password, host, and port number.
     ///
     /// URLs that do *not* are either path-only like `unix:/run/foo.socket`
     /// or cannot-be-a-base like `data:text/plain,Stuff`.
     ///
+    /// See also the `authority` method.
+    ///
     /// # Examples
     ///
     /// ```
@@ -817,6 +912,47 @@
         self.slice(self.scheme_end..).starts_with("://")
     }
 
+    /// Return the authority of this URL as an ASCII string.
+    ///
+    /// Non-ASCII domains are punycode-encoded per IDNA if this is the host
+    /// of a special URL, or percent encoded for non-special URLs.
+    /// IPv6 addresses are given between `[` and `]` brackets.
+    /// Ports are omitted if they match the well known port of a special URL.
+    ///
+    /// Username and password are percent-encoded.
+    ///
+    /// See also the `has_authority` method.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use url::Url;
+    /// # use url::ParseError;
+    ///
+    /// # fn run() -> Result<(), ParseError> {
+    /// let url = Url::parse("unix:/run/foo.socket")?;
+    /// assert_eq!(url.authority(), "");
+    /// let url = Url::parse("file:///tmp/foo")?;
+    /// assert_eq!(url.authority(), "");
+    /// let url = Url::parse("https://user:[email protected]/tmp/foo")?;
+    /// assert_eq!(url.authority(), "user:[email protected]");
+    /// let url = Url::parse("irc://àlex.рф.example.com:6667/foo")?;
+    /// assert_eq!(url.authority(), "%C3%A0lex.%D1%80%D1%84.example.com:6667");
+    /// let url = Url::parse("http://àlex.рф.example.com:80/foo")?;
+    /// assert_eq!(url.authority(), "xn--lex-8ka.xn--p1ai.example.com");
+    /// # Ok(())
+    /// # }
+    /// # run().unwrap();
+    /// ```
+    pub fn authority(&self) -> &str {
+        let scheme_separator_len = "://".len() as u32;
+        if self.has_authority() && self.path_start > self.scheme_end + scheme_separator_len {
+            self.slice(self.scheme_end + scheme_separator_len..self.path_start)
+        } else {
+            ""
+        }
+    }
+
     /// Return whether this URL is a cannot-be-a-base URL,
     /// meaning that parsing a relative URL string with this URL as the base will return an error.
     ///
@@ -1140,6 +1276,7 @@
     ///     })
     /// }
     /// ```
+    #[cfg(any(unix, windows, target_os = "redox", target_os = "wasi"))]
     pub fn socket_addrs(
         &self,
         default_port_number: impl Fn() -> Option<u16>,
@@ -1389,9 +1526,10 @@
         if let Some(input) = fragment {
             self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
             self.serialization.push('#');
-            self.mutate(|parser| parser.parse_fragment(parser::Input::no_trim(input)))
+            self.mutate(|parser| parser.parse_fragment(parser::Input::new_no_trim(input)))
         } else {
-            self.fragment_start = None
+            self.fragment_start = None;
+            self.strip_trailing_spaces_from_opaque_path();
         }
     }
 
@@ -1413,7 +1551,8 @@
         }
     }
 
-    /// Change this URL’s query string.
+    /// Change this URL’s query string. If `query` is `None`, this URL's
+    /// query string will be cleared.
     ///
     /// # Examples
     ///
@@ -1451,9 +1590,14 @@
                 parser.parse_query(
                     scheme_type,
                     scheme_end,
-                    parser::Input::trim_tab_and_newlines(input, vfn),
+                    parser::Input::new_trim_tab_and_newlines(input, vfn),
                 )
             });
+        } else {
+            self.query_start = None;
+            if fragment.is_none() {
+                self.strip_trailing_spaces_from_opaque_path();
+            }
         }
 
         self.restore_already_parsed_fragment(fragment);
@@ -1569,10 +1713,14 @@
                     parser.serialization.push_str("%2F");
                     path = &path[1..];
                 }
-                parser.parse_cannot_be_a_base_path(parser::Input::new(path));
+                parser.parse_cannot_be_a_base_path(parser::Input::new_no_trim(path));
             } else {
                 let mut has_host = true; // FIXME
-                parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
+                parser.parse_path_start(
+                    scheme_type,
+                    &mut has_host,
+                    parser::Input::new_no_trim(path),
+                );
             }
         });
         self.restore_after_path(old_after_path_pos, &after_path);
@@ -1989,7 +2137,8 @@
         if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" {
             return Err(());
         }
-        if let Some(password) = password {
+        let password = password.unwrap_or_default();
+        if !password.is_empty() {
             let host_and_after = self.slice(self.host_start..).to_owned();
             self.serialization.truncate(self.username_end as usize);
             self.serialization.push(':');
@@ -2241,7 +2390,7 @@
     #[allow(clippy::result_unit_err, clippy::suspicious_operation_groupings)]
     pub fn set_scheme(&mut self, scheme: &str) -> Result<(), ()> {
         let mut parser = Parser::for_setter(String::new());
-        let remaining = parser.parse_scheme(parser::Input::new(scheme))?;
+        let remaining = parser.parse_scheme(parser::Input::new_no_trim(scheme))?;
         let new_scheme_type = SchemeType::from(&parser.serialization);
         let old_scheme_type = SchemeType::from(self.scheme());
         // If url’s scheme is a special scheme and buffer is not a special scheme, then return.
@@ -2579,7 +2728,7 @@
 impl PartialOrd for Url {
     #[inline]
     fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
-        self.serialization.partial_cmp(&other.serialization)
+        Some(self.cmp(other))
     }
 }
 
@@ -2695,7 +2844,7 @@
         serialization.push('/');
         serialization.extend(percent_encode(
             component.as_os_str().as_bytes(),
-            PATH_SEGMENT,
+            SPECIAL_PATH_SEGMENT,
         ));
     }
     if empty {
@@ -2805,7 +2954,7 @@
 
     // A windows drive letter must end with a slash.
     if bytes.len() > 2
-        && matches!(bytes[bytes.len() - 2], b'a'..=b'z' | b'A'..=b'Z')
+        && bytes[bytes.len() - 2].is_ascii_alphabetic()
         && matches!(bytes[bytes.len() - 1], b':' | b'|')
     {
         bytes.push(b'/');
diff --git a/crates/url/src/parser.rs b/crates/url/src/parser.rs
index f5438c5..8dd054d 100644
--- a/crates/url/src/parser.rs
+++ b/crates/url/src/parser.rs
@@ -94,15 +94,18 @@
 }
 
 macro_rules! syntax_violation_enum {
-    ($($name: ident => $description: expr,)+) => {
+    ($($name: ident => $description: literal,)+) => {
         /// Non-fatal syntax violations that can occur during parsing.
         ///
         /// This may be extended in the future so exhaustive matching is
-        /// discouraged with an unused variant.
+        /// forbidden.
         #[derive(PartialEq, Eq, Clone, Copy, Debug)]
         #[non_exhaustive]
         pub enum SyntaxViolation {
             $(
+                /// ```text
+                #[doc = $description]
+                /// ```
                 $name,
             )+
         }
@@ -157,9 +160,11 @@
     pub fn is_file(&self) -> bool {
         matches!(*self, SchemeType::File)
     }
+}
 
-    pub fn from(s: &str) -> Self {
-        match s {
+impl<T: AsRef<str>> From<T> for SchemeType {
+    fn from(s: T) -> Self {
+        match s.as_ref() {
             "http" | "https" | "ws" | "wss" | "ftp" => SchemeType::SpecialNotFile,
             "file" => SchemeType::File,
             _ => SchemeType::NotSpecial,
@@ -176,23 +181,19 @@
     }
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug)]
 pub struct Input<'i> {
     chars: str::Chars<'i>,
 }
 
 impl<'i> Input<'i> {
-    pub fn new(input: &'i str) -> Self {
-        Input::with_log(input, None)
-    }
-
-    pub fn no_trim(input: &'i str) -> Self {
+    pub fn new_no_trim(input: &'i str) -> Self {
         Input {
             chars: input.chars(),
         }
     }
 
-    pub fn trim_tab_and_newlines(
+    pub fn new_trim_tab_and_newlines(
         original_input: &'i str,
         vfn: Option<&dyn Fn(SyntaxViolation)>,
     ) -> Self {
@@ -210,7 +211,10 @@
         }
     }
 
-    pub fn with_log(original_input: &'i str, vfn: Option<&dyn Fn(SyntaxViolation)>) -> Self {
+    pub fn new_trim_c0_control_and_space(
+        original_input: &'i str,
+        vfn: Option<&dyn Fn(SyntaxViolation)>,
+    ) -> Self {
         let input = original_input.trim_matches(c0_control_or_space);
         if let Some(vfn) = vfn {
             if input.len() < original_input.len() {
@@ -360,7 +364,7 @@
 
     /// https://url.spec.whatwg.org/#concept-basic-url-parser
     pub fn parse_url(mut self, input: &str) -> ParseResult<Url> {
-        let input = Input::with_log(input, self.violation_fn);
+        let input = Input::new_trim_c0_control_and_space(input, self.violation_fn);
         if let Ok(remaining) = self.parse_scheme(input.clone()) {
             return self.parse_with_scheme(remaining);
         }
@@ -474,9 +478,8 @@
         let host = HostInternal::None;
         let port = None;
         let remaining = if let Some(input) = input.split_prefix('/') {
-            let path_start = self.serialization.len();
             self.serialization.push('/');
-            self.parse_path(scheme_type, &mut false, path_start, input)
+            self.parse_path(scheme_type, &mut false, path_start as usize, input)
         } else {
             self.parse_cannot_be_a_base_path(input)
         };
@@ -1106,7 +1109,7 @@
         while let (Some(c), remaining) = input.split_first() {
             if let Some(digit) = c.to_digit(10) {
                 port = port * 10 + digit;
-                if port > ::std::u16::MAX as u32 {
+                if port > u16::MAX as u32 {
                     return Err(ParseError::InvalidPort);
                 }
                 has_any_digit = true;
@@ -1156,7 +1159,7 @@
             return input;
         }
 
-        if maybe_c != None && maybe_c != Some('/') {
+        if maybe_c.is_some() && maybe_c != Some('/') {
             self.serialization.push('/');
         }
         // Otherwise, if c is not the EOF code point:
@@ -1172,7 +1175,7 @@
     ) -> Input<'i> {
         // Relative path state
         loop {
-            let segment_start = self.serialization.len();
+            let mut segment_start = self.serialization.len();
             let mut ends_with_slash = false;
             loop {
                 let input_before_c = input.clone();
@@ -1201,6 +1204,15 @@
                     }
                     _ => {
                         self.check_url_code_point(c, &input);
+                        if scheme_type.is_file()
+                            && self.serialization.len() > path_start
+                            && is_normalized_windows_drive_letter(
+                                &self.serialization[path_start + 1..],
+                            )
+                        {
+                            self.serialization.push('/');
+                            segment_start += 1;
+                        }
                         if self.context == Context::PathSegmentSetter {
                             if scheme_type.is_special() {
                                 self.serialization
@@ -1248,7 +1260,10 @@
                 }
                 _ => {
                     // If url’s scheme is "file", url’s path is empty, and buffer is a Windows drive letter, then
-                    if scheme_type.is_file() && is_windows_drive_letter(segment_before_slash) {
+                    if scheme_type.is_file()
+                        && segment_start == path_start + 1
+                        && is_windows_drive_letter(segment_before_slash)
+                    {
                         // Replace the second code point in buffer with U+003A (:).
                         if let Some(c) = segment_before_slash.chars().next() {
                             self.serialization.truncate(segment_start);
@@ -1354,9 +1369,50 @@
         host_end: u32,
         host: HostInternal,
         port: Option<u16>,
-        path_start: u32,
+        mut path_start: u32,
         remaining: Input<'_>,
     ) -> ParseResult<Url> {
+        // Special case for anarchist URL's with a leading empty path segment
+        // This prevents web+demo:/.//not-a-host/ or web+demo:/path/..//not-a-host/,
+        // when parsed and then serialized, from ending up as web+demo://not-a-host/
+        // (they end up as web+demo:/.//not-a-host/).
+        //
+        // If url’s host is null, url does not have an opaque path,
+        // url’s path’s size is greater than 1, and url’s path[0] is the empty string,
+        // then append U+002F (/) followed by U+002E (.) to output.
+        let scheme_end_as_usize = scheme_end as usize;
+        let path_start_as_usize = path_start as usize;
+        if path_start_as_usize == scheme_end_as_usize + 1 {
+            // Anarchist URL
+            if self.serialization[path_start_as_usize..].starts_with("//") {
+                // Case 1: The base URL did not have an empty path segment, but the resulting one does
+                // Insert the "/." prefix
+                self.serialization.insert_str(path_start_as_usize, "/.");
+                path_start += 2;
+            }
+            assert!(!self.serialization[scheme_end_as_usize..].starts_with("://"));
+        } else if path_start_as_usize == scheme_end_as_usize + 3
+            && &self.serialization[scheme_end_as_usize..path_start_as_usize] == ":/."
+        {
+            // Anarchist URL with leading empty path segment
+            // The base URL has a "/." between the host and the path
+            assert_eq!(self.serialization.as_bytes()[path_start_as_usize], b'/');
+            if self
+                .serialization
+                .as_bytes()
+                .get(path_start_as_usize + 1)
+                .copied()
+                != Some(b'/')
+            {
+                // Case 2: The base URL had an empty path segment, but the resulting one does not
+                // Remove the "/." prefix
+                self.serialization
+                    .replace_range(scheme_end_as_usize..path_start_as_usize, ":");
+                path_start -= 2;
+            }
+            assert!(!self.serialization[scheme_end_as_usize..].starts_with("://"));
+        }
+
         let (query_start, fragment_start) =
             self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
         Ok(Url {
@@ -1477,7 +1533,7 @@
             if c == '%' {
                 let mut input = input.clone();
                 if !matches!((input.next(), input.next()), (Some(a), Some(b))
-                             if is_ascii_hex_digit(a) && is_ascii_hex_digit(b))
+                             if a.is_ascii_hexdigit() && b.is_ascii_hexdigit())
                 {
                     vfn(SyntaxViolation::PercentDecode)
                 }
@@ -1488,11 +1544,6 @@
     }
 }
 
-#[inline]
-fn is_ascii_hex_digit(c: char) -> bool {
-    matches!(c, 'a'..='f' | 'A'..='F' | '0'..='9')
-}
-
 // Non URL code points:
 // U+0000 to U+0020 (space)
 // " # % < > [ \ ] ^ ` { | }
@@ -1534,12 +1585,12 @@
 /// https://url.spec.whatwg.org/#ascii-alpha
 #[inline]
 pub fn ascii_alpha(ch: char) -> bool {
-    matches!(ch, 'a'..='z' | 'A'..='Z')
+    ch.is_ascii_alphabetic()
 }
 
 #[inline]
 pub fn to_u32(i: usize) -> ParseResult<u32> {
-    if i <= ::std::u32::MAX as usize {
+    if i <= u32::MAX as usize {
         Ok(i as u32)
     } else {
         Err(ParseError::Overflow)
diff --git a/crates/url/src/path_segments.rs b/crates/url/src/path_segments.rs
index 29afc1e..d8a78d7 100644
--- a/crates/url/src/path_segments.rs
+++ b/crates/url/src/path_segments.rs
@@ -237,7 +237,7 @@
                     scheme_type,
                     &mut has_host,
                     path_start,
-                    parser::Input::new(segment),
+                    parser::Input::new_no_trim(segment),
                 );
             }
         });
diff --git a/crates/url/src/quirks.rs b/crates/url/src/quirks.rs
index 0674ebb..391a50d 100644
--- a/crates/url/src/quirks.rs
+++ b/crates/url/src/quirks.rs
@@ -6,7 +6,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-//! Getters and setters for URL components implemented per https://url.spec.whatwg.org/#api
+//! Getters and setters for URL components implemented per <https://url.spec.whatwg.org/#api>
 //!
 //! Unless you need to be interoperable with web browsers,
 //! you probably want to use `Url` method instead.
@@ -57,7 +57,7 @@
     }
 }
 
-/// https://url.spec.whatwg.org/#dom-url-domaintoascii
+/// <https://url.spec.whatwg.org/#dom-url-domaintoascii>
 pub fn domain_to_ascii(domain: &str) -> String {
     match Host::parse(domain) {
         Ok(Host::Domain(domain)) => domain,
@@ -65,7 +65,7 @@
     }
 }
 
-/// https://url.spec.whatwg.org/#dom-url-domaintounicode
+/// <https://url.spec.whatwg.org/#dom-url-domaintounicode>
 pub fn domain_to_unicode(domain: &str) -> String {
     match Host::parse(domain) {
         Ok(Host::Domain(ref domain)) => {
@@ -76,29 +76,29 @@
     }
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-href
+/// Getter for <https://url.spec.whatwg.org/#dom-url-href>
 pub fn href(url: &Url) -> &str {
     url.as_str()
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-href
+/// Setter for <https://url.spec.whatwg.org/#dom-url-href>
 pub fn set_href(url: &mut Url, value: &str) -> Result<(), ParseError> {
     *url = Url::parse(value)?;
     Ok(())
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-origin
+/// Getter for <https://url.spec.whatwg.org/#dom-url-origin>
 pub fn origin(url: &Url) -> String {
     url.origin().ascii_serialization()
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-protocol
+/// Getter for <https://url.spec.whatwg.org/#dom-url-protocol>
 #[inline]
 pub fn protocol(url: &Url) -> &str {
     &url.as_str()[..url.scheme().len() + ":".len()]
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-protocol
+/// Setter for <https://url.spec.whatwg.org/#dom-url-protocol>
 #[allow(clippy::result_unit_err)]
 pub fn set_protocol(url: &mut Url, mut new_protocol: &str) -> Result<(), ()> {
     // The scheme state in the spec ignores everything after the first `:`,
@@ -109,25 +109,25 @@
     url.set_scheme(new_protocol)
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-username
+/// Getter for <https://url.spec.whatwg.org/#dom-url-username>
 #[inline]
 pub fn username(url: &Url) -> &str {
     url.username()
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-username
+/// Setter for <https://url.spec.whatwg.org/#dom-url-username>
 #[allow(clippy::result_unit_err)]
 pub fn set_username(url: &mut Url, new_username: &str) -> Result<(), ()> {
     url.set_username(new_username)
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-password
+/// Getter for <https://url.spec.whatwg.org/#dom-url-password>
 #[inline]
 pub fn password(url: &Url) -> &str {
     url.password().unwrap_or("")
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-password
+/// Setter for <https://url.spec.whatwg.org/#dom-url-password>
 #[allow(clippy::result_unit_err)]
 pub fn set_password(url: &mut Url, new_password: &str) -> Result<(), ()> {
     url.set_password(if new_password.is_empty() {
@@ -137,13 +137,13 @@
     })
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-host
+/// Getter for <https://url.spec.whatwg.org/#dom-url-host>
 #[inline]
 pub fn host(url: &Url) -> &str {
     &url[Position::BeforeHost..Position::AfterPort]
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-host
+/// Setter for <https://url.spec.whatwg.org/#dom-url-host>
 #[allow(clippy::result_unit_err)]
 pub fn set_host(url: &mut Url, new_host: &str) -> Result<(), ()> {
     // If context object’s url’s cannot-be-a-base-URL flag is set, then return.
@@ -152,7 +152,7 @@
     }
     // Host parsing rules are strict,
     // We don't want to trim the input
-    let input = Input::no_trim(new_host);
+    let input = Input::new_no_trim(new_host);
     let host;
     let opt_port;
     {
@@ -190,20 +190,20 @@
     Ok(())
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-hostname
+/// Getter for <https://url.spec.whatwg.org/#dom-url-hostname>
 #[inline]
 pub fn hostname(url: &Url) -> &str {
     url.host_str().unwrap_or("")
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-hostname
+/// Setter for <https://url.spec.whatwg.org/#dom-url-hostname>
 #[allow(clippy::result_unit_err)]
 pub fn set_hostname(url: &mut Url, new_hostname: &str) -> Result<(), ()> {
     if url.cannot_be_a_base() {
         return Err(());
     }
     // Host parsing rules are strict we don't want to trim the input
-    let input = Input::no_trim(new_hostname);
+    let input = Input::new_no_trim(new_hostname);
     let scheme_type = SchemeType::from(url.scheme());
     if scheme_type == SchemeType::File && new_hostname.is_empty() {
         url.set_host_internal(Host::Domain(String::new()), None);
@@ -232,13 +232,13 @@
     }
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-port
+/// Getter for <https://url.spec.whatwg.org/#dom-url-port>
 #[inline]
 pub fn port(url: &Url) -> &str {
     &url[Position::BeforePort..Position::AfterPort]
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-port
+/// Setter for <https://url.spec.whatwg.org/#dom-url-port>
 #[allow(clippy::result_unit_err)]
 pub fn set_port(url: &mut Url, new_port: &str) -> Result<(), ()> {
     let result;
@@ -249,7 +249,7 @@
             return Err(());
         }
         result = Parser::parse_port(
-            Input::new(new_port),
+            Input::new_no_trim(new_port),
             || default_port(scheme),
             Context::Setter,
         )
@@ -262,13 +262,13 @@
     }
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-pathname
+/// Getter for <https://url.spec.whatwg.org/#dom-url-pathname>
 #[inline]
 pub fn pathname(url: &Url) -> &str {
     url.path()
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-pathname
+/// Setter for <https://url.spec.whatwg.org/#dom-url-pathname>
 pub fn set_pathname(url: &mut Url, new_pathname: &str) {
     if url.cannot_be_a_base() {
         return;
@@ -279,19 +279,24 @@
             && new_pathname.starts_with('\\'))
     {
         url.set_path(new_pathname)
-    } else {
+    } else if SchemeType::from(url.scheme()).is_special()
+        || !new_pathname.is_empty()
+        || !url.has_host()
+    {
         let mut path_to_set = String::from("/");
         path_to_set.push_str(new_pathname);
         url.set_path(&path_to_set)
+    } else {
+        url.set_path(new_pathname)
     }
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-search
+/// Getter for <https://url.spec.whatwg.org/#dom-url-search>
 pub fn search(url: &Url) -> &str {
     trim(&url[Position::AfterPath..Position::AfterQuery])
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-search
+/// Setter for <https://url.spec.whatwg.org/#dom-url-search>
 pub fn set_search(url: &mut Url, new_search: &str) {
     url.set_query(match new_search {
         "" => None,
@@ -300,12 +305,12 @@
     })
 }
 
-/// Getter for https://url.spec.whatwg.org/#dom-url-hash
+/// Getter for <https://url.spec.whatwg.org/#dom-url-hash>
 pub fn hash(url: &Url) -> &str {
     trim(&url[Position::AfterQuery..])
 }
 
-/// Setter for https://url.spec.whatwg.org/#dom-url-hash
+/// Setter for <https://url.spec.whatwg.org/#dom-url-hash>
 pub fn set_hash(url: &mut Url, new_hash: &str) {
     url.set_fragment(match new_hash {
         // If the given value is the empty string,
diff --git a/crates/url/src/slicing.rs b/crates/url/src/slicing.rs
index a90337b..1382957 100644
--- a/crates/url/src/slicing.rs
+++ b/crates/url/src/slicing.rs
@@ -37,6 +37,29 @@
     }
 }
 
+// Counts how many base-10 digits are required to represent n in the given base
+fn count_digits(n: u16) -> usize {
+    match n {
+        0..=9 => 1,
+        10..=99 => 2,
+        100..=999 => 3,
+        1000..=9999 => 4,
+        10000..=65535 => 5,
+    }
+}
+
+#[test]
+fn test_count_digits() {
+    assert_eq!(count_digits(0), 1);
+    assert_eq!(count_digits(1), 1);
+    assert_eq!(count_digits(9), 1);
+    assert_eq!(count_digits(10), 2);
+    assert_eq!(count_digits(99), 2);
+    assert_eq!(count_digits(100), 3);
+    assert_eq!(count_digits(9999), 4);
+    assert_eq!(count_digits(65535), 5);
+}
+
 /// Indicates a position within a URL based on its components.
 ///
 /// A range of positions can be used for slicing `Url`:
@@ -70,7 +93,7 @@
 ///
 /// The end of a component and the start of the next are either the same or separate
 /// by a delimiter.
-/// (Not that the initial `/` of a path is considered part of the path here, not a delimiter.)
+/// (Note that the initial `/` of a path is considered part of the path here, not a delimiter.)
 /// For example, `&url[..BeforeFragment]` would include a `#` delimiter (if present in `url`),
 /// so `&url[..AfterQuery]` might be desired instead.
 ///
@@ -149,7 +172,14 @@
                 }
             }
 
-            Position::AfterPort => self.path_start as usize,
+            Position::AfterPort => {
+                if let Some(port) = self.port {
+                    debug_assert!(self.byte_at(self.host_end) == b':');
+                    self.host_end as usize + ":".len() + count_digits(port)
+                } else {
+                    self.host_end as usize
+                }
+            }
 
             Position::BeforePath => self.path_start as usize,
 
diff --git a/crates/url/tests/data.rs b/crates/url/tests/data.rs
deleted file mode 100644
index f4001ca..0000000
--- a/crates/url/tests/data.rs
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2013-2014 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Data-driven tests
-
-use std::str::FromStr;
-
-use serde_json::Value;
-use url::{quirks, Url};
-
-#[test]
-fn urltestdata() {
-    let idna_skip_inputs = [
-        "http://www.foo。bar.com",
-        "http://Go.com",
-        "http://你好你好",
-        "https://faß.ExAmPlE/",
-        "http://0Xc0.0250.01",
-        "ftp://%e2%98%83",
-        "https://%e2%98%83",
-        "file://a\u{ad}b/p",
-        "file://a%C2%ADb/p",
-        "http://GOO\u{200b}\u{2060}\u{feff}goo.com",
-    ];
-
-    // Copied from https://github.com/web-platform-tests/wpt/blob/master/url/
-    let mut json = Value::from_str(include_str!("urltestdata.json"))
-        .expect("JSON parse error in urltestdata.json");
-
-    let mut passed = true;
-    for entry in json.as_array_mut().unwrap() {
-        if entry.is_string() {
-            continue; // ignore comments
-        }
-
-        let maybe_base = entry
-            .take_key("base")
-            .expect("missing base key")
-            .maybe_string();
-        let input = entry.take_string("input");
-        let failure = entry.take_key("failure").is_some();
-
-        {
-            if idna_skip_inputs.contains(&input.as_str()) {
-                continue;
-            }
-        }
-
-        let res = if let Some(base) = maybe_base {
-            let base = match Url::parse(&base) {
-                Ok(base) => base,
-                Err(_) if failure => continue,
-                Err(message) => {
-                    eprint_failure(
-                        format!("  failed: error parsing base {:?}: {}", base, message),
-                        &format!("parse base for {:?}", input),
-                        None,
-                    );
-                    passed = false;
-                    continue;
-                }
-            };
-            base.join(&input)
-        } else {
-            Url::parse(&input)
-        };
-
-        let url = match (res, failure) {
-            (Ok(url), false) => url,
-            (Err(_), true) => continue,
-            (Err(message), false) => {
-                eprint_failure(
-                    format!("  failed: {}", message),
-                    &format!("parse URL for {:?}", input),
-                    None,
-                );
-                passed = false;
-                continue;
-            }
-            (Ok(_), true) => {
-                eprint_failure(
-                    format!("  failed: expected parse error for URL {:?}", input),
-                    &format!("parse URL for {:?}", input),
-                    None,
-                );
-                passed = false;
-                continue;
-            }
-        };
-
-        passed &= check_invariants(&url, &format!("invariants for {:?}", input), None);
-
-        for &attr in ATTRIBS {
-            passed &= test_eq_eprint(
-                entry.take_string(attr),
-                get(&url, attr),
-                &format!("{:?} - {}", input, attr),
-                None,
-            );
-        }
-
-        if let Some(expected_origin) = entry.take_key("origin").map(|s| s.string()) {
-            passed &= test_eq_eprint(
-                expected_origin,
-                &quirks::origin(&url),
-                &format!("origin for {:?}", input),
-                None,
-            );
-        }
-    }
-
-    assert!(passed)
-}
-
-#[test]
-fn setters_tests() {
-    let mut json = Value::from_str(include_str!("setters_tests.json"))
-        .expect("JSON parse error in setters_tests.json");
-
-    let mut passed = true;
-    for &attr in ATTRIBS {
-        if attr == "href" {
-            continue;
-        }
-
-        let mut tests = json.take_key(attr).unwrap();
-        for mut test in tests.as_array_mut().unwrap().drain(..) {
-            let comment = test.take_key("comment").map(|s| s.string());
-            {
-                if let Some(comment) = comment.as_ref() {
-                    if comment.starts_with("IDNA Nontransitional_Processing") {
-                        continue;
-                    }
-                }
-            }
-            let href = test.take_string("href");
-            let new_value = test.take_string("new_value");
-            let name = format!("{:?}.{} = {:?}", href, attr, new_value);
-            let mut expected = test.take_key("expected").unwrap();
-
-            let mut url = Url::parse(&href).unwrap();
-            let comment_ref = comment.as_deref();
-            passed &= check_invariants(&url, &name, comment_ref);
-            set(&mut url, attr, &new_value);
-
-            for attr in ATTRIBS {
-                if let Some(value) = expected.take_key(attr) {
-                    passed &= test_eq_eprint(value.string(), get(&url, attr), &name, comment_ref);
-                };
-            }
-
-            passed &= check_invariants(&url, &name, comment_ref);
-        }
-    }
-
-    assert!(passed);
-}
-
-fn check_invariants(url: &Url, name: &str, comment: Option<&str>) -> bool {
-    let mut passed = true;
-    if let Err(e) = url.check_invariants() {
-        passed = false;
-        eprint_failure(
-            format!("  failed: invariants checked -> {:?}", e),
-            name,
-            comment,
-        );
-    }
-
-    #[cfg(feature = "serde")]
-    {
-        let bytes = serde_json::to_vec(url).unwrap();
-        let new_url: Url = serde_json::from_slice(&bytes).unwrap();
-        passed &= test_eq_eprint(url.to_string(), &new_url.to_string(), name, comment);
-    }
-
-    passed
-}
-
-trait JsonExt {
-    fn take_key(&mut self, key: &str) -> Option<Value>;
-    fn string(self) -> String;
-    fn maybe_string(self) -> Option<String>;
-    fn take_string(&mut self, key: &str) -> String;
-}
-
-impl JsonExt for Value {
-    fn take_key(&mut self, key: &str) -> Option<Value> {
-        self.as_object_mut().unwrap().remove(key)
-    }
-
-    fn string(self) -> String {
-        self.maybe_string().expect("")
-    }
-
-    fn maybe_string(self) -> Option<String> {
-        match self {
-            Value::String(s) => Some(s),
-            Value::Null => None,
-            _ => panic!("Not a Value::String or Value::Null"),
-        }
-    }
-
-    fn take_string(&mut self, key: &str) -> String {
-        self.take_key(key).unwrap().string()
-    }
-}
-
-fn get<'a>(url: &'a Url, attr: &str) -> &'a str {
-    match attr {
-        "href" => quirks::href(url),
-        "protocol" => quirks::protocol(url),
-        "username" => quirks::username(url),
-        "password" => quirks::password(url),
-        "hostname" => quirks::hostname(url),
-        "host" => quirks::host(url),
-        "port" => quirks::port(url),
-        "pathname" => quirks::pathname(url),
-        "search" => quirks::search(url),
-        "hash" => quirks::hash(url),
-        _ => unreachable!(),
-    }
-}
-
-#[allow(clippy::unit_arg)]
-fn set<'a>(url: &'a mut Url, attr: &str, new: &str) {
-    let _ = match attr {
-        "protocol" => quirks::set_protocol(url, new),
-        "username" => quirks::set_username(url, new),
-        "password" => quirks::set_password(url, new),
-        "hostname" => quirks::set_hostname(url, new),
-        "host" => quirks::set_host(url, new),
-        "port" => quirks::set_port(url, new),
-        "pathname" => Ok(quirks::set_pathname(url, new)),
-        "search" => Ok(quirks::set_search(url, new)),
-        "hash" => Ok(quirks::set_hash(url, new)),
-        _ => unreachable!(),
-    };
-}
-
-fn test_eq_eprint(expected: String, actual: &str, name: &str, comment: Option<&str>) -> bool {
-    if expected == actual {
-        return true;
-    }
-    eprint_failure(
-        format!("expected: {}\n  actual: {}", expected, actual),
-        name,
-        comment,
-    );
-    false
-}
-
-fn eprint_failure(err: String, name: &str, comment: Option<&str>) {
-    eprintln!("    test: {}\n{}", name, err);
-    if let Some(comment) = comment {
-        eprintln!("{}\n", comment);
-    } else {
-        eprintln!();
-    }
-}
-
-const ATTRIBS: &[&str] = &[
-    "href", "protocol", "username", "password", "host", "hostname", "port", "pathname", "search",
-    "hash",
-];
diff --git a/crates/url/tests/debugger_visualizer.rs b/crates/url/tests/debugger_visualizer.rs
deleted file mode 100644
index 4558e07..0000000
--- a/crates/url/tests/debugger_visualizer.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-use debugger_test::debugger_test;
-use url::Url;
-
-#[inline(never)]
-fn __break() {}
-
-#[debugger_test(
-    debugger = "cdb",
-    commands = "
-    .nvlist
-
-    dx base_url
-
-    dx url_with_non_special_scheme
-
-    dx url_with_user_pass_port_query_fragments
-
-    dx url_blob
-
-    dx url_with_base
-
-    dx url_with_base_replaced
-
-    dx url_with_comma",
-    expected_statements = r#"
-    pattern:debugger_visualizer-.*\.exe \(embedded NatVis ".*-[0-9]+\.natvis"\)
-
-    base_url         : "http://example.org/foo/bar" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "http"
-    [host]           : "example.org"
-    [path]           : "/foo/bar"
-
-    url_with_non_special_scheme : "non-special://test/x" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "non-special"
-    [host]           : "test"
-    [path]           : "/x"
-
-    url_with_user_pass_port_query_fragments : "http://user:pass@foo:21/bar;par?b#c" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "http"
-    [username]       : "user"
-    [host]           : "foo"
-    [port]           : 21
-    [path]           : "/bar;par"
-    [query]          : "b"
-    [fragment]       : "c"
-
-    url_blob         : "blob:https://example.com:443/" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "blob"
-    [path]           : "https://example.com:443/"
-
-    url_with_base    : "http://example.org/a%2fc" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "http"
-    [host]           : "example.org"
-    [path]           : "/a%2fc"
-
-    url_with_base_replaced : "http://[::7f00:1]/" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "http"
-    [host]           : "[::7f00:1]"
-    [path]           : "/"
-
-    url_with_comma   : "data:text/html,test#test" [Type: url::Url]
-    [<Raw View>]     [Type: url::Url]
-    [scheme]         : "data"
-    [path]           : "text/html,test"
-    [fragment]       : "test"
-    "#
-)]
-fn test_url_visualizer() {
-    // Copied from https://github.com/web-platform-tests/wpt/blob/master/url/
-    let base_url = Url::parse("http://example.org/foo/bar").unwrap();
-    assert_eq!(base_url.as_str(), "http://example.org/foo/bar");
-
-    let url_with_non_special_scheme = Url::parse("non-special://:@test/x").unwrap();
-    assert_eq!(url_with_non_special_scheme.as_str(), "non-special://test/x");
-
-    let url_with_user_pass_port_query_fragments =
-        Url::parse("http://user:pass@foo:21/bar;par?b#c").unwrap();
-    assert_eq!(
-        url_with_user_pass_port_query_fragments.as_str(),
-        "http://user:pass@foo:21/bar;par?b#c"
-    );
-
-    let url_blob = Url::parse("blob:https://example.com:443/").unwrap();
-    assert_eq!(url_blob.as_str(), "blob:https://example.com:443/");
-
-    let url_with_base = base_url.join("/a%2fc").unwrap();
-    assert_eq!(url_with_base.as_str(), "http://example.org/a%2fc");
-
-    let url_with_base_replaced = base_url.join("http://[::127.0.0.1]").unwrap();
-    assert_eq!(url_with_base_replaced.as_str(), "http://[::7f00:1]/");
-
-    let url_with_comma = base_url.join("data:text/html,test#test").unwrap();
-    assert_eq!(url_with_comma.as_str(), "data:text/html,test#test");
-
-    __break();
-}
diff --git a/crates/url/tests/expected_failures.txt b/crates/url/tests/expected_failures.txt
new file mode 100644
index 0000000..91145db
--- /dev/null
+++ b/crates/url/tests/expected_failures.txt
@@ -0,0 +1,50 @@
+</> against <file://h/C:/a/b>
+<file:\\\\//>
+<file:\\\\\\\\>
+<file:\\\\\\\\?fox>
+<file:\\\\\\\\#guppy>
+<file://spider///>
+<file:\\\\localhost//>
+<file://\\/localhost//cat>
+<file://localhost//a//../..//>
+</////mouse> against <file:///elephant>
+<\\/localhost//pig> against <file://lion/>
+<//localhost//pig> against <file://lion/>
+</..//localhost//pig> against <file://lion/>
+<C|> against <file://host/dir/file>
+<C|> against <file://host/D:/dir1/dir2/file>
+<C|#> against <file://host/dir/file>
+<C|?> against <file://host/dir/file>
+<C|/> against <file://host/dir/file>
+<C|\n/> against <file://host/dir/file>
+<C|\\> against <file://host/dir/file>
+</c:/foo/bar> against <file://host/path>
+<file://example.net/C:/>
+<file://1.2.3.4/C:/>
+<file://[1::8]/C:/>
+<C|/> against <file://host/>
+</C:/> against <file://host/>
+<file:C:/> against <file://host/>
+<file:/C:/> against <file://host/>
+<file://localhost//a//../..//foo>
+<file://localhost////foo>
+<file:////foo>
+<file:////one/two> against <file:///>
+<////one/two> against <file:///>
+<file:///.//> against <file:////>
+<file:.//p>
+<file:/.//p>
+<http://example.net/path> set hostname to <example.com:8080>
+<http://example.net:8080/path> set hostname to <example.com:>
+<non-spec:/.//p> set hostname to <h>
+<non-spec:/.//p> set hostname to <>
+<foo:///some/path> set pathname to <>
+<http://example.net:8080/path> set port to <randomstring>
+<file:///var/log/system.log> set href to <http://0300.168.0xF0>
+<file://monkey/> set pathname to <\\\\>
+<file:///unicorn> set pathname to <//\\/>
+<file:///unicorn> set pathname to <//monkey/..//>
+<non-spec:/> set pathname to </.//p>
+<non-spec:/> set pathname to </..//p>
+<non-spec:/> set pathname to <//p>
+<non-spec:/.//> set pathname to <p>
diff --git a/crates/url/tests/setters_tests.json b/crates/url/tests/setters_tests.json
index 4280032..2c6ebee 100644
--- a/crates/url/tests/setters_tests.json
+++ b/crates/url/tests/setters_tests.json
@@ -1,6 +1,6 @@
 {
     "comment": [
-        "AS OF https://github.com/jsdom/whatwg-url/commit/35f04dfd3048cf6362f4398745bb13375c5020c2",
+        "# Pulled from https://github.com/web-platform-tests/wpt/blob/befe66343e5f21dc464c8c772c6d20695936714f/url/resources/setters_tests.json",
         "## Tests for setters of https://url.spec.whatwg.org/#urlutils-members",
         "",
         "This file contains a JSON object.",
@@ -120,11 +120,11 @@
             }
         },
         {
-            "href": "gopher://example.net:1234",
+            "href": "https://example.net:1234",
             "new_value": "file",
             "expected": {
-                "href": "gopher://example.net:1234",
-                "protocol": "gopher:"
+                "href": "https://example.net:1234/",
+                "protocol": "https:"
             }
         },
         {
@@ -146,7 +146,7 @@
         },
         {
             "href": "file:///test",
-            "new_value": "gopher",
+            "new_value": "https",
             "expected": {
                 "href": "file:///test",
                 "protocol": "file:"
@@ -270,6 +270,57 @@
                 "protocol": "https:",
                 "port": ""
             }
+        },
+        {
+            "comment": "Tab and newline are stripped",
+            "href": "http://test/",
+            "new_value": "h\u000D\u000Att\u0009ps",
+            "expected": {
+              "href": "https://test/",
+              "protocol": "https:",
+              "port": ""
+            }
+        },
+        {
+            "href": "http://test/",
+            "new_value": "https\u000D",
+            "expected": {
+              "href": "https://test/",
+              "protocol": "https:"
+            }
+        },
+        {
+            "comment": "Non-tab/newline C0 controls result in no-op",
+            "href": "http://test/",
+            "new_value": "https\u0000",
+            "expected": {
+              "href": "http://test/",
+              "protocol": "http:"
+            }
+        },
+        {
+            "href": "http://test/",
+            "new_value": "https\u000C",
+            "expected": {
+              "href": "http://test/",
+              "protocol": "http:"
+            }
+        },
+        {
+            "href": "http://test/",
+            "new_value": "https\u000E",
+            "expected": {
+              "href": "http://test/",
+              "protocol": "http:"
+            }
+        },
+        {
+            "href": "http://test/",
+            "new_value": "https\u0020",
+            "expected": {
+              "href": "http://test/",
+              "protocol": "http:"
+            }
         }
     ],
     "username": [
@@ -963,6 +1014,16 @@
             }
         },
         {
+            "href": "file://hi/x",
+            "new_value": "",
+            "expected": {
+                "href": "file:///x",
+                "host": "",
+                "hostname": "",
+                "port": ""
+            }
+        },
+        {
             "href": "sc://test@test/",
             "new_value": "",
             "expected": {
@@ -981,6 +1042,62 @@
                 "hostname": "test",
                 "port": "12"
             }
+        },
+        {
+            "comment": "Leading / is not stripped",
+            "href": "http://example.com/",
+            "new_value": "///bad.com",
+            "expected": {
+                "href": "http://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
+        },
+        {
+            "comment": "Leading / is not stripped",
+            "href": "sc://example.com/",
+            "new_value": "///bad.com",
+            "expected": {
+                "href": "sc:///",
+                "host": "",
+                "hostname": ""
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "a%C2%ADb",
+            "expected": {
+                "href": "https://ab/",
+                "host": "ab",
+                "hostname": "ab"
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "\u00AD",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "%C2%AD",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "xn--",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
         }
     ],
     "hostname": [
@@ -1144,24 +1261,24 @@
             }
         },
         {
-            "comment": "Stuff after a : delimiter is ignored",
+            "comment": ": delimiter invalidates entire value",
             "href": "http://example.net/path",
             "new_value": "example.com:8080",
             "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
+                "href": "http://example.net/path",
+                "host": "example.net",
+                "hostname": "example.net",
                 "port": ""
             }
         },
         {
-            "comment": "Stuff after a : delimiter is ignored",
+            "comment": ": delimiter invalidates entire value",
             "href": "http://example.net:8080/path",
             "new_value": "example.com:",
             "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
                 "port": "8080"
             }
         },
@@ -1287,6 +1404,16 @@
             }
         },
         {
+            "href": "file://hi/x",
+            "new_value": "",
+            "expected": {
+                "href": "file:///x",
+                "host": "",
+                "hostname": "",
+                "port": ""
+            }
+        },
+        {
             "href": "sc://test@test/",
             "new_value": "",
             "expected": {
@@ -1305,6 +1432,83 @@
                 "hostname": "test",
                 "port": "12"
             }
+        },
+        {
+            "comment": "Drop /. from path",
+            "href": "non-spec:/.//p",
+            "new_value": "h",
+            "expected": {
+                "href": "non-spec://h//p",
+                "host": "h",
+                "hostname": "h",
+                "pathname": "//p"
+            }
+        },
+        {
+            "href": "non-spec:/.//p",
+            "new_value": "",
+            "expected": {
+                "href": "non-spec:////p",
+                "host": "",
+                "hostname": "",
+                "pathname": "//p"
+            }
+        },
+        {
+            "comment": "Leading / is not stripped",
+            "href": "http://example.com/",
+            "new_value": "///bad.com",
+            "expected": {
+                "href": "http://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
+        },
+        {
+            "comment": "Leading / is not stripped",
+            "href": "sc://example.com/",
+            "new_value": "///bad.com",
+            "expected": {
+                "href": "sc:///",
+                "host": "",
+                "hostname": ""
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "a%C2%ADb",
+            "expected": {
+                "href": "https://ab/",
+                "host": "ab",
+                "hostname": "ab"
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "\u00AD",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "%C2%AD",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
+        },
+        {
+            "href": "https://example.com/",
+            "new_value": "xn--",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com"
+            }
         }
     ],
     "port": [
@@ -1462,6 +1666,17 @@
             }
         },
         {
+            "comment": "Setting port to a string that doesn't parse as a number",
+            "href": "http://example.net:8080/path",
+            "new_value": "randomstring",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
             "comment": "Port numbers are 16 bit integers, overflowing is an error",
             "href": "non-special://example.net:8080/path",
             "new_value": "65536",
@@ -1519,11 +1734,35 @@
                 "href": "javascript://x:12/",
                 "port": "12"
             }
+        },
+        {
+            "comment": "Leading u0009 on special scheme",
+            "href": "https://domain.com:443",
+            "new_value": "\u00098080",
+            "expected": {
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Leading u0009 on non-special scheme",
+            "href": "wpt++://domain.com:443",
+            "new_value": "\u00098080",
+            "expected": {
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Should use all ascii prefixed characters as port",
+            "href": "https://www.google.com:4343",
+            "new_value": "4wpt",
+            "expected": {
+                "port": "4"
+            }
         }
     ],
     "pathname": [
         {
-            "comment": "Cannot-be-a-base don’t have a path",
+            "comment": "Opaque paths cannot be set",
             "href": "mailto:[email protected]",
             "new_value": "/foo",
             "expected": {
@@ -1532,6 +1771,67 @@
             }
         },
         {
+            "href": "data:original",
+            "new_value": "new value",
+            "expected": {
+                "href": "data:original",
+                "pathname": "original"
+            }
+        },
+        {
+            "href": "sc:original",
+            "new_value": "new value",
+            "expected": {
+                "href": "sc:original",
+                "pathname": "original"
+            }
+        },
+        {
+            "comment": "Special URLs cannot have their paths erased",
+            "href": "file:///some/path",
+            "new_value": "",
+            "expected": {
+                "href": "file:///",
+                "pathname": "/"
+            }
+        },
+        {
+            "comment": "Non-special URLs can have their paths erased",
+            "href": "foo://somehost/some/path",
+            "new_value": "",
+            "expected": {
+                "href": "foo://somehost",
+                "pathname": ""
+            }
+        },
+        {
+            "comment": "Non-special URLs with an empty host can have their paths erased",
+            "href": "foo:///some/path",
+            "new_value": "",
+            "expected": {
+                "href": "foo://",
+                "pathname": ""
+            }
+        },
+        {
+            "comment": "Path-only URLs cannot have their paths erased",
+            "href": "foo:/some/path",
+            "new_value": "",
+            "expected": {
+                "href": "foo:/",
+                "pathname": "/"
+            }
+        },
+        {
+            "comment": "Path-only URLs always have an initial slash",
+            "href": "foo:/some/path",
+            "new_value": "test",
+            "expected": {
+                "href": "foo:/test",
+                "pathname": "/test"
+            }
+        },
+        {
             "href": "unix:/run/foo.socket?timeout=10",
             "new_value": "/var/log/../run/bar.socket",
             "expected": {
@@ -1628,12 +1928,30 @@
             }
         },
         {
+            "comment": "? doesn't mess up encoding",
+            "href": "http://example.net",
+            "new_value": "/?é",
+            "expected": {
+                "href": "http://example.net/%3F%C3%A9",
+                "pathname": "/%3F%C3%A9"
+            }
+        },
+        {
+            "comment": "# doesn't mess up encoding",
+            "href": "http://example.net",
+            "new_value": "/#é",
+            "expected": {
+                "href": "http://example.net/%23%C3%A9",
+                "pathname": "/%23%C3%A9"
+            }
+        },
+        {
             "comment": "File URLs and (back)slashes",
             "href": "file://monkey/",
             "new_value": "\\\\",
             "expected": {
-                "href": "file://monkey/",
-                "pathname": "/"
+                "href": "file://monkey//",
+                "pathname": "//"
             }
         },
         {
@@ -1641,8 +1959,8 @@
             "href": "file:///unicorn",
             "new_value": "//\\/",
             "expected": {
-                "href": "file:///",
-                "pathname": "/"
+                "href": "file://////",
+                "pathname": "////"
             }
         },
         {
@@ -1650,8 +1968,77 @@
             "href": "file:///unicorn",
             "new_value": "//monkey/..//",
             "expected": {
-                "href": "file:///",
-                "pathname": "/"
+                "href": "file://///",
+                "pathname": "///"
+            }
+        },
+        {
+            "comment": "Serialize /. in path",
+            "href": "non-spec:/",
+            "new_value": "/.//p",
+            "expected": {
+                "href": "non-spec:/.//p",
+                "pathname": "//p"
+            }
+        },
+        {
+            "href": "non-spec:/",
+            "new_value": "/..//p",
+            "expected": {
+                "href": "non-spec:/.//p",
+                "pathname": "//p"
+            }
+        },
+        {
+            "href": "non-spec:/",
+            "new_value": "//p",
+            "expected": {
+                "href": "non-spec:/.//p",
+                "pathname": "//p"
+            }
+        },
+        {
+            "comment": "Drop /. from path",
+            "href": "non-spec:/.//",
+            "new_value": "p",
+            "expected": {
+                "href": "non-spec:/p",
+                "pathname": "/p"
+            }
+        },
+        {
+            "comment": "Non-special URLs with non-opaque paths percent-encode U+0020",
+            "href": "data:/nospace",
+            "new_value": "space ",
+            "expected": {
+                "href": "data:/space%20",
+                "pathname": "/space%20"
+            }
+        },
+        {
+            "href": "sc:/nospace",
+            "new_value": "space ",
+            "expected": {
+                "href": "sc:/space%20",
+                "pathname": "/space%20"
+            }
+        },
+        {
+            "comment": "Trailing space should be encoded",
+            "href": "http://example.net",
+            "new_value": " ",
+            "expected": {
+                "href": "http://example.net/%20",
+                "pathname": "/%20"
+            }
+        },
+        {
+            "comment": "Trailing C0 control should be encoded",
+            "href": "http://example.net",
+            "new_value": "\u0000",
+            "expected": {
+                "href": "http://example.net/%00",
+                "pathname": "/%00"
             }
         }
     ],
@@ -1737,6 +2124,60 @@
                 "href": "http://example.net/?%c3%89t%C3%A9",
                 "search": "?%c3%89t%C3%A9"
             }
+        },
+        {
+            "comment": "Drop trailing spaces from trailing opaque paths",
+            "href": "data:space ?query",
+            "new_value": "",
+            "expected": {
+                "href": "data:space",
+                "pathname": "space",
+                "search": ""
+            }
+        },
+        {
+            "href": "sc:space ?query",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space",
+                "pathname": "space",
+                "search": ""
+            }
+        },
+        {
+            "comment": "Do not drop trailing spaces from non-trailing opaque paths",
+            "href": "data:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "data:space  #fragment",
+                "search": ""
+            }
+        },
+        {
+            "href": "sc:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space  #fragment",
+                "search": ""
+            }
+        },
+        {
+            "comment": "Trailing space should be encoded",
+            "href": "http://example.net",
+            "new_value": " ",
+            "expected": {
+                "href": "http://example.net/?%20",
+                "search": "?%20"
+            }
+        },
+        {
+            "comment": "Trailing C0 control should be encoded",
+            "href": "http://example.net",
+            "new_value": "\u0000",
+            "expected": {
+                "href": "http://example.net/?%00",
+                "search": "?%00"
+            }
         }
     ],
     "hash": [
@@ -1871,6 +2312,70 @@
                 "href": "javascript:alert(1)#castle",
                 "hash": "#castle"
             }
+        },
+        {
+            "comment": "Drop trailing spaces from trailing opaque paths",
+            "href": "data:space                                                                                                                                  #fragment",
+            "new_value": "",
+            "expected": {
+                "href": "data:space",
+                "pathname": "space",
+                "hash": ""
+            }
+        },
+        {
+            "href": "sc:space    #fragment",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space",
+                "pathname": "space",
+                "hash": ""
+            }
+        },
+        {
+            "comment": "Do not drop trailing spaces from non-trailing opaque paths",
+            "href": "data:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "data:space  ?query",
+                "hash": ""
+            }
+        },
+        {
+            "href": "sc:space  ?query#fragment",
+            "new_value": "",
+            "expected": {
+                "href": "sc:space  ?query",
+                "hash": ""
+            }
+        },
+        {
+            "comment": "Trailing space should be encoded",
+            "href": "http://example.net",
+            "new_value": " ",
+            "expected": {
+                "href": "http://example.net/#%20",
+                "hash": "#%20"
+            }
+        },
+        {
+            "comment": "Trailing C0 control should be encoded",
+            "href": "http://example.net",
+            "new_value": "\u0000",
+            "expected": {
+                "href": "http://example.net/#%00",
+                "hash": "#%00"
+            }
+        }
+    ],
+    "href": [
+        {
+            "href": "file:///var/log/system.log",
+            "new_value": "http://0300.168.0xF0",
+            "expected": {
+                "href": "http://192.168.0.240/",
+                "protocol": "http:"
+            }
         }
     ]
 }
diff --git a/crates/url/tests/unit.rs b/crates/url/tests/unit.rs
index 55ff59a..afe842b 100644
--- a/crates/url/tests/unit.rs
+++ b/crates/url/tests/unit.rs
@@ -11,9 +11,16 @@
 use std::borrow::Cow;
 use std::cell::{Cell, RefCell};
 use std::net::{Ipv4Addr, Ipv6Addr};
+#[cfg(any(unix, windows, target_os = "redox", target_os = "wasi"))]
 use std::path::{Path, PathBuf};
 use url::{form_urlencoded, Host, Origin, Url};
 
+// https://rustwasm.github.io/wasm-bindgen/wasm-bindgen-test/usage.html
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure};
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+wasm_bindgen_test_configure!(run_in_browser);
+
 #[test]
 fn size() {
     use std::mem::size_of;
@@ -35,6 +42,17 @@
 }
 
 #[test]
+fn test_strip_trailing_spaces_from_opaque_path() {
+    let mut url: Url = "data:space   ?query".parse().unwrap();
+    url.set_query(None);
+    assert_eq!(url.as_str(), "data:space");
+
+    let mut url: Url = "data:space   #hash".parse().unwrap();
+    url.set_fragment(None);
+    assert_eq!(url.as_str(), "data:space");
+}
+
+#[test]
 fn test_set_empty_host() {
     let mut base: Url = "moz://foo:bar@servo/baz".parse().unwrap();
     base.set_username("").unwrap();
@@ -54,6 +72,30 @@
 }
 
 #[test]
+fn test_set_empty_username_and_password() {
+    let mut base: Url = "moz://foo:bar@servo/baz".parse().unwrap();
+    base.set_username("").unwrap();
+    assert_eq!(base.as_str(), "moz://:bar@servo/baz");
+
+    base.set_password(Some("")).unwrap();
+    assert_eq!(base.as_str(), "moz://servo/baz");
+
+    base.set_password(None).unwrap();
+    assert_eq!(base.as_str(), "moz://servo/baz");
+}
+
+#[test]
+fn test_set_empty_password() {
+    let mut base: Url = "moz://foo:bar@servo/baz".parse().unwrap();
+
+    base.set_password(Some("")).unwrap();
+    assert_eq!(base.as_str(), "moz://foo@servo/baz");
+
+    base.set_password(None).unwrap();
+    assert_eq!(base.as_str(), "moz://foo@servo/baz");
+}
+
+#[test]
 fn test_set_empty_hostname() {
     use url::quirks;
     let mut base: Url = "moz://foo@servo/baz".parse().unwrap();
@@ -71,6 +113,18 @@
     assert_eq!(base.as_str(), "moz:///baz");
 }
 
+#[test]
+fn test_set_empty_query() {
+    let mut base: Url = "moz://example.com/path?query".parse().unwrap();
+
+    base.set_query(Some(""));
+    assert_eq!(base.as_str(), "moz://example.com/path?");
+
+    base.set_query(None);
+    assert_eq!(base.as_str(), "moz://example.com/path");
+}
+
+#[cfg(any(unix, windows, target_os = "redox", target_os = "wasi"))]
 macro_rules! assert_from_file_path {
     ($path: expr) => {
         assert_from_file_path!($path, $path)
@@ -84,6 +138,7 @@
 }
 
 #[test]
+#[cfg(any(unix, windows))]
 fn new_file_paths() {
     if cfg!(unix) {
         assert_eq!(Url::from_file_path(Path::new("relative")), Err(()));
@@ -100,6 +155,7 @@
         assert_from_file_path!("/foo/bar");
         assert_from_file_path!("/foo/ba\0r", "/foo/ba%00r");
         assert_from_file_path!("/foo/ba%00r", "/foo/ba%2500r");
+        assert_from_file_path!("/foo/ba\\r", "/foo/ba%5Cr");
     }
 }
 
@@ -115,28 +171,28 @@
 }
 
 #[test]
+#[cfg(windows)]
 fn new_path_windows_fun() {
-    if cfg!(windows) {
-        assert_from_file_path!(r"C:\foo\bar", "/C:/foo/bar");
-        assert_from_file_path!("C:\\foo\\ba\0r", "/C:/foo/ba%00r");
+    assert_from_file_path!(r"C:\foo\bar", "/C:/foo/bar");
+    assert_from_file_path!("C:\\foo\\ba\0r", "/C:/foo/ba%00r");
 
-        // Invalid UTF-8
-        assert!(Url::parse("file:///C:/foo/ba%80r")
-            .unwrap()
-            .to_file_path()
-            .is_err());
+    // Invalid UTF-8
+    assert!(Url::parse("file:///C:/foo/ba%80r")
+        .unwrap()
+        .to_file_path()
+        .is_err());
 
-        // test windows canonicalized path
-        let path = PathBuf::from(r"\\?\C:\foo\bar");
-        assert!(Url::from_file_path(path).is_ok());
+    // test windows canonicalized path
+    let path = PathBuf::from(r"\\?\C:\foo\bar");
+    assert!(Url::from_file_path(path).is_ok());
 
-        // Percent-encoded drive letter
-        let url = Url::parse("file:///C%3A/foo/bar").unwrap();
-        assert_eq!(url.to_file_path(), Ok(PathBuf::from(r"C:\foo\bar")));
-    }
+    // Percent-encoded drive letter
+    let url = Url::parse("file:///C%3A/foo/bar").unwrap();
+    assert_eq!(url.to_file_path(), Ok(PathBuf::from(r"C:\foo\bar")));
 }
 
 #[test]
+#[cfg(any(unix, windows))]
 fn new_directory_paths() {
     if cfg!(unix) {
         assert_eq!(Url::from_directory_path(Path::new("relative")), Err(()));
@@ -392,6 +448,7 @@
 }
 
 #[test]
+#[cfg(any(unix, target_os = "redox", target_os = "wasi"))]
 #[cfg(not(windows))]
 /// https://github.com/servo/rust-url/issues/197
 fn issue_197() {
@@ -426,7 +483,7 @@
 fn extend_query_pairs_then_mutate() {
     let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
     url.query_pairs_mut()
-        .extend_pairs(vec![("auth", "my-token")].into_iter());
+        .extend_pairs(vec![("auth", "my-token")]);
     url.check_invariants().unwrap();
     assert_eq!(
         url.to_string(),
@@ -576,6 +633,7 @@
 }
 
 #[test]
+#[cfg(any(unix, windows, target_os = "redox", target_os = "wasi"))]
 fn test_socket_addrs() {
     use std::net::ToSocketAddrs;
 
@@ -757,11 +815,8 @@
 }
 
 #[test]
+#[cfg(windows)]
 fn test_windows_unc_path() {
-    if !cfg!(windows) {
-        return;
-    }
-
     let url = Url::from_file_path(Path::new(r"\\host\share\path\file.txt")).unwrap();
     assert_eq!(url.as_str(), "file://host/share/path/file.txt");
 
@@ -881,6 +936,7 @@
 }
 
 /// https://github.com/servo/rust-url/issues/505
+#[cfg(any(unix, target_os = "redox", target_os = "wasi"))]
 #[cfg(not(windows))]
 #[test]
 fn test_url_from_file_path() {
@@ -944,6 +1000,16 @@
 }
 
 #[test]
+fn test_null_host_with_leading_empty_path_segment() {
+    // since Note in item 3 of URL serializing in the URL Standard
+    // https://url.spec.whatwg.org/#url-serializing
+    let url = Url::parse("m:/.//\\").unwrap();
+    let encoded = url.as_str();
+    let reparsed = Url::parse(encoded).unwrap();
+    assert_eq!(reparsed, url);
+}
+
+#[test]
 fn pop_if_empty_in_bounds() {
     let mut url = Url::parse("m://").unwrap();
     let mut segments = url.path_segments_mut().unwrap();
@@ -1162,3 +1228,91 @@
         assert_eq!(make_relative, None, "base: {}, uri: {}", base, uri);
     }
 }
+
+#[test]
+fn test_has_authority() {
+    let url = Url::parse("mailto:[email protected]").unwrap();
+    assert!(!url.has_authority());
+    let url = Url::parse("unix:/run/foo.socket").unwrap();
+    assert!(!url.has_authority());
+    let url = Url::parse("file:///tmp/foo").unwrap();
+    assert!(url.has_authority());
+    let url = Url::parse("http://example.com/tmp/foo").unwrap();
+    assert!(url.has_authority());
+}
+
+#[test]
+fn test_authority() {
+    let url = Url::parse("mailto:[email protected]").unwrap();
+    assert_eq!(url.authority(), "");
+    let url = Url::parse("unix:/run/foo.socket").unwrap();
+    assert_eq!(url.authority(), "");
+    let url = Url::parse("file:///tmp/foo").unwrap();
+    assert_eq!(url.authority(), "");
+    let url = Url::parse("http://example.com/tmp/foo").unwrap();
+    assert_eq!(url.authority(), "example.com");
+    let url = Url::parse("ftp://127.0.0.1:21/").unwrap();
+    assert_eq!(url.authority(), "127.0.0.1");
+    let url = Url::parse("ftp://[email protected]:2121/").unwrap();
+    assert_eq!(url.authority(), "[email protected]:2121");
+    let url = Url::parse("https://:@example.com/").unwrap();
+    assert_eq!(url.authority(), "example.com");
+    let url = Url::parse("https://:password@[::1]:8080/").unwrap();
+    assert_eq!(url.authority(), ":password@[::1]:8080");
+    let url = Url::parse("gopher://user:@àlex.example.com:70").unwrap();
+    assert_eq!(url.authority(), "user@%C3%A0lex.example.com:70");
+    let url = Url::parse("irc://àlex:àlex@àlex.рф.example.com:6667/foo").unwrap();
+    assert_eq!(
+        url.authority(),
+        "%C3%A0lex:%C3%A0lex@%C3%A0lex.%D1%80%D1%84.example.com:6667"
+    );
+    let url = Url::parse("https://àlex:àlex@àlex.рф.example.com:443/foo").unwrap();
+    assert_eq!(
+        url.authority(),
+        "%C3%A0lex:%C3%[email protected]"
+    );
+}
+
+#[test]
+/// https://github.com/servo/rust-url/issues/838
+fn test_file_with_drive() {
+    let s1 = "fIlE:p:?../";
+    let url = url::Url::parse(s1).unwrap();
+    assert_eq!(url.to_string(), "file:///p:?../");
+    assert_eq!(url.path(), "/p:");
+
+    let testcases = [
+        ("a", "file:///p:/a"),
+        ("", "file:///p:?../"),
+        ("?x", "file:///p:?x"),
+        (".", "file:///p:/"),
+        ("..", "file:///p:/"),
+        ("../", "file:///p:/"),
+    ];
+
+    for case in &testcases {
+        let url2 = url::Url::join(&url, case.0).unwrap();
+        assert_eq!(url2.to_string(), case.1);
+    }
+}
+
+#[test]
+/// Similar to test_file_with_drive, but with a path
+/// that could be confused for a drive.
+fn test_file_with_drive_and_path() {
+    let s1 = "fIlE:p:/x|?../";
+    let url = url::Url::parse(s1).unwrap();
+    assert_eq!(url.to_string(), "file:///p:/x|?../");
+    assert_eq!(url.path(), "/p:/x|");
+    let s2 = "a";
+    let url2 = url::Url::join(&url, s2).unwrap();
+    assert_eq!(url2.to_string(), "file:///p:/a");
+}
+
+#[test]
+fn issue_864() {
+    let mut url = url::Url::parse("file://").unwrap();
+    dbg!(&url);
+    url.set_path("x");
+    dbg!(&url);
+}
diff --git a/crates/url/tests/urltestdata.json b/crates/url/tests/urltestdata.json
index 4265f59..1e61729 100644
--- a/crates/url/tests/urltestdata.json
+++ b/crates/url/tests/urltestdata.json
@@ -1,6 +1,5 @@
 [
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js",
-  "# AS OF https://github.com/web-platform-tests/wpt/commit/2a64dae4641fbd61bd4257df460e188f425b492e",
+  "# Pulled from https://github.com/web-platform-tests/wpt/blob/befe66343e5f21dc464c8c772c6d20695936714f/url/resources/urltestdata.json",
   {
     "input": "http://example\t.\norg",
     "base": "http://example.org/foo/bar",
@@ -33,7 +32,7 @@
   },
   {
     "input": "https://test:@test",
-    "base": "about:blank",
+    "base": null,
     "href": "https://test@test/",
     "origin": "https://test",
     "protocol": "https:",
@@ -48,7 +47,7 @@
   },
   {
     "input": "https://:@test",
-    "base": "about:blank",
+    "base": null,
     "href": "https://test/",
     "origin": "https://test",
     "protocol": "https:",
@@ -63,7 +62,7 @@
   },
   {
     "input": "non-special://test:@test/x",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://test@test/x",
     "origin": "null",
     "protocol": "non-special:",
@@ -78,7 +77,7 @@
   },
   {
     "input": "non-special://:@test/x",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://test/x",
     "origin": "null",
     "protocol": "non-special:",
@@ -168,7 +167,7 @@
   },
   {
     "input": "lolscheme:x x#x x",
-    "base": "about:blank",
+    "base": null,
     "href": "lolscheme:x x#x%20x",
     "protocol": "lolscheme:",
     "username": "",
@@ -966,6 +965,11 @@
     "hash": ""
   },
   {
+    "input": "http://[::127.0.0.1.]",
+    "base": "http://example.org/foo/bar",
+    "failure": true
+  },
+  {
     "input": "http://[0:0:0:0:0:0:13.1.68.3]",
     "base": "http://example.org/foo/bar",
     "href": "http://[::d01:4403]/",
@@ -1071,22 +1075,22 @@
   },
   {
     "input": "file://example:1/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://example:test/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://example%/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://[example]/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
@@ -1750,7 +1754,7 @@
   "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js",
   {
     "input": "http://example.com/././foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1765,7 +1769,7 @@
   },
   {
     "input": "http://example.com/./.foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/.foo",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1780,7 +1784,7 @@
   },
   {
     "input": "http://example.com/foo/.",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1795,7 +1799,7 @@
   },
   {
     "input": "http://example.com/foo/./",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1810,7 +1814,7 @@
   },
   {
     "input": "http://example.com/foo/bar/..",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1825,7 +1829,7 @@
   },
   {
     "input": "http://example.com/foo/bar/../",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1840,7 +1844,7 @@
   },
   {
     "input": "http://example.com/foo/..bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/..bar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1855,7 +1859,7 @@
   },
   {
     "input": "http://example.com/foo/bar/../ton",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/ton",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1870,7 +1874,7 @@
   },
   {
     "input": "http://example.com/foo/bar/../ton/../../a",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/a",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1885,7 +1889,7 @@
   },
   {
     "input": "http://example.com/foo/../../..",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1900,7 +1904,7 @@
   },
   {
     "input": "http://example.com/foo/../../../ton",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/ton",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1915,7 +1919,7 @@
   },
   {
     "input": "http://example.com/foo/%2e",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1930,7 +1934,7 @@
   },
   {
     "input": "http://example.com/foo/%2e%2",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/%2e%2",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1945,7 +1949,7 @@
   },
   {
     "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%2e.bar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1960,7 +1964,7 @@
   },
   {
     "input": "http://example.com////../..",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com//",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1975,7 +1979,7 @@
   },
   {
     "input": "http://example.com/foo/bar//../..",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -1990,7 +1994,7 @@
   },
   {
     "input": "http://example.com/foo/bar//..",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo/bar/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2005,7 +2009,7 @@
   },
   {
     "input": "http://example.com/foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2020,7 +2024,7 @@
   },
   {
     "input": "http://example.com/%20foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%20foo",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2035,7 +2039,7 @@
   },
   {
     "input": "http://example.com/foo%",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2050,7 +2054,7 @@
   },
   {
     "input": "http://example.com/foo%2",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%2",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2065,7 +2069,7 @@
   },
   {
     "input": "http://example.com/foo%2zbar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%2zbar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2080,7 +2084,7 @@
   },
   {
     "input": "http://example.com/foo%2©zbar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%2%C3%82%C2%A9zbar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2095,7 +2099,7 @@
   },
   {
     "input": "http://example.com/foo%41%7a",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%41%7a",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2110,7 +2114,7 @@
   },
   {
     "input": "http://example.com/foo\t\u0091%91",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%C2%91%91",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2125,7 +2129,7 @@
   },
   {
     "input": "http://example.com/foo%00%51",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foo%00%51",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2140,7 +2144,7 @@
   },
   {
     "input": "http://example.com/(%28:%3A%29)",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/(%28:%3A%29)",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2155,7 +2159,7 @@
   },
   {
     "input": "http://example.com/%3A%3a%3C%3c",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%3A%3a%3C%3c",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2170,7 +2174,7 @@
   },
   {
     "input": "http://example.com/foo\tbar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/foobar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2185,7 +2189,7 @@
   },
   {
     "input": "http://example.com\\\\foo\\\\bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com//foo//bar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2200,7 +2204,7 @@
   },
   {
     "input": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2215,7 +2219,7 @@
   },
   {
     "input": "http://example.com/@asdf%40",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/@asdf%40",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2230,7 +2234,7 @@
   },
   {
     "input": "http://example.com/你好你好",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2245,7 +2249,7 @@
   },
   {
     "input": "http://example.com/‥/foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%E2%80%A5/foo",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2260,7 +2264,7 @@
   },
   {
     "input": "http://example.com//foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%EF%BB%BF/foo",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2275,7 +2279,7 @@
   },
   {
     "input": "http://example.com/‮/foo/‭/bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/%E2%80%AE/foo/%E2%80%AD/bar",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2291,7 +2295,7 @@
   "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js",
   {
     "input": "http://www.google.com/foo?bar=baz#",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.google.com/foo?bar=baz#",
     "origin": "http://www.google.com",
     "protocol": "http:",
@@ -2306,7 +2310,7 @@
   },
   {
     "input": "http://www.google.com/foo?bar=baz# »",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.google.com/foo?bar=baz#%20%C2%BB",
     "origin": "http://www.google.com",
     "protocol": "http:",
@@ -2321,7 +2325,7 @@
   },
   {
     "input": "data:test# »",
-    "base": "about:blank",
+    "base": null,
     "href": "data:test#%20%C2%BB",
     "origin": "null",
     "protocol": "data:",
@@ -2336,7 +2340,7 @@
   },
   {
     "input": "http://www.google.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.google.com/",
     "origin": "http://www.google.com",
     "protocol": "http:",
@@ -2351,7 +2355,7 @@
   },
   {
     "input": "http://192.0x00A80001",
-    "base": "about:blank",
+    "base": null,
     "href": "http://192.168.0.1/",
     "origin": "http://192.168.0.1",
     "protocol": "http:",
@@ -2366,7 +2370,7 @@
   },
   {
     "input": "http://www/foo%2Ehtml",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www/foo%2Ehtml",
     "origin": "http://www",
     "protocol": "http:",
@@ -2381,7 +2385,7 @@
   },
   {
     "input": "http://www/foo/%2E/html",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www/foo/html",
     "origin": "http://www",
     "protocol": "http:",
@@ -2396,12 +2400,12 @@
   },
   {
     "input": "http://user:pass@/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://%25DOMAIN:[email protected]/",
-    "base": "about:blank",
+    "base": null,
     "href": "http://%25DOMAIN:[email protected]/",
     "origin": "http://foodomain.com",
     "protocol": "http:",
@@ -2416,7 +2420,7 @@
   },
   {
     "input": "http:\\\\www.google.com\\foo",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.google.com/foo",
     "origin": "http://www.google.com",
     "protocol": "http:",
@@ -2431,7 +2435,7 @@
   },
   {
     "input": "http://foo:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo/",
     "origin": "http://foo",
     "protocol": "http:",
@@ -2446,7 +2450,7 @@
   },
   {
     "input": "http://foo:81/",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo:81/",
     "origin": "http://foo:81",
     "protocol": "http:",
@@ -2461,7 +2465,7 @@
   },
   {
     "input": "httpa://foo:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "httpa://foo:80/",
     "origin": "null",
     "protocol": "httpa:",
@@ -2476,12 +2480,12 @@
   },
   {
     "input": "http://foo:-80/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://foo:443/",
-    "base": "about:blank",
+    "base": null,
     "href": "https://foo/",
     "origin": "https://foo",
     "protocol": "https:",
@@ -2496,7 +2500,7 @@
   },
   {
     "input": "https://foo:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "https://foo:80/",
     "origin": "https://foo:80",
     "protocol": "https:",
@@ -2511,7 +2515,7 @@
   },
   {
     "input": "ftp://foo:21/",
-    "base": "about:blank",
+    "base": null,
     "href": "ftp://foo/",
     "origin": "ftp://foo",
     "protocol": "ftp:",
@@ -2526,7 +2530,7 @@
   },
   {
     "input": "ftp://foo:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "ftp://foo:80/",
     "origin": "ftp://foo:80",
     "protocol": "ftp:",
@@ -2541,7 +2545,7 @@
   },
   {
     "input": "gopher://foo:70/",
-    "base": "about:blank",
+    "base": null,
     "href": "gopher://foo:70/",
     "origin": "null",
     "protocol": "gopher:",
@@ -2556,7 +2560,7 @@
   },
   {
     "input": "gopher://foo:443/",
-    "base": "about:blank",
+    "base": null,
     "href": "gopher://foo:443/",
     "origin": "null",
     "protocol": "gopher:",
@@ -2571,7 +2575,7 @@
   },
   {
     "input": "ws://foo:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "ws://foo/",
     "origin": "ws://foo",
     "protocol": "ws:",
@@ -2586,7 +2590,7 @@
   },
   {
     "input": "ws://foo:81/",
-    "base": "about:blank",
+    "base": null,
     "href": "ws://foo:81/",
     "origin": "ws://foo:81",
     "protocol": "ws:",
@@ -2601,7 +2605,7 @@
   },
   {
     "input": "ws://foo:443/",
-    "base": "about:blank",
+    "base": null,
     "href": "ws://foo:443/",
     "origin": "ws://foo:443",
     "protocol": "ws:",
@@ -2616,7 +2620,7 @@
   },
   {
     "input": "ws://foo:815/",
-    "base": "about:blank",
+    "base": null,
     "href": "ws://foo:815/",
     "origin": "ws://foo:815",
     "protocol": "ws:",
@@ -2631,7 +2635,7 @@
   },
   {
     "input": "wss://foo:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "wss://foo:80/",
     "origin": "wss://foo:80",
     "protocol": "wss:",
@@ -2646,7 +2650,7 @@
   },
   {
     "input": "wss://foo:81/",
-    "base": "about:blank",
+    "base": null,
     "href": "wss://foo:81/",
     "origin": "wss://foo:81",
     "protocol": "wss:",
@@ -2661,7 +2665,7 @@
   },
   {
     "input": "wss://foo:443/",
-    "base": "about:blank",
+    "base": null,
     "href": "wss://foo/",
     "origin": "wss://foo",
     "protocol": "wss:",
@@ -2676,7 +2680,7 @@
   },
   {
     "input": "wss://foo:815/",
-    "base": "about:blank",
+    "base": null,
     "href": "wss://foo:815/",
     "origin": "wss://foo:815",
     "protocol": "wss:",
@@ -2691,7 +2695,7 @@
   },
   {
     "input": "http:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2706,7 +2710,7 @@
   },
   {
     "input": "ftp:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "ftp://example.com/",
     "origin": "ftp://example.com",
     "protocol": "ftp:",
@@ -2721,7 +2725,7 @@
   },
   {
     "input": "https:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "https://example.com/",
     "origin": "https://example.com",
     "protocol": "https:",
@@ -2736,7 +2740,7 @@
   },
   {
     "input": "madeupscheme:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "madeupscheme:/example.com/",
     "origin": "null",
     "protocol": "madeupscheme:",
@@ -2751,7 +2755,7 @@
   },
   {
     "input": "file:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///example.com/",
     "protocol": "file:",
     "username": "",
@@ -2765,7 +2769,7 @@
   },
   {
     "input": "ftps:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "ftps:/example.com/",
     "origin": "null",
     "protocol": "ftps:",
@@ -2780,7 +2784,7 @@
   },
   {
     "input": "gopher:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "gopher:/example.com/",
     "origin": "null",
     "protocol": "gopher:",
@@ -2795,7 +2799,7 @@
   },
   {
     "input": "ws:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "ws://example.com/",
     "origin": "ws://example.com",
     "protocol": "ws:",
@@ -2810,7 +2814,7 @@
   },
   {
     "input": "wss:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "wss://example.com/",
     "origin": "wss://example.com",
     "protocol": "wss:",
@@ -2825,7 +2829,7 @@
   },
   {
     "input": "data:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "data:/example.com/",
     "origin": "null",
     "protocol": "data:",
@@ -2840,7 +2844,7 @@
   },
   {
     "input": "javascript:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "javascript:/example.com/",
     "origin": "null",
     "protocol": "javascript:",
@@ -2855,7 +2859,7 @@
   },
   {
     "input": "mailto:/example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "mailto:/example.com/",
     "origin": "null",
     "protocol": "mailto:",
@@ -2870,7 +2874,7 @@
   },
   {
     "input": "http:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -2885,7 +2889,7 @@
   },
   {
     "input": "ftp:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "ftp://example.com/",
     "origin": "ftp://example.com",
     "protocol": "ftp:",
@@ -2900,7 +2904,7 @@
   },
   {
     "input": "https:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "https://example.com/",
     "origin": "https://example.com",
     "protocol": "https:",
@@ -2915,7 +2919,7 @@
   },
   {
     "input": "madeupscheme:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "madeupscheme:example.com/",
     "origin": "null",
     "protocol": "madeupscheme:",
@@ -2930,7 +2934,7 @@
   },
   {
     "input": "ftps:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "ftps:example.com/",
     "origin": "null",
     "protocol": "ftps:",
@@ -2945,7 +2949,7 @@
   },
   {
     "input": "gopher:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "gopher:example.com/",
     "origin": "null",
     "protocol": "gopher:",
@@ -2960,7 +2964,7 @@
   },
   {
     "input": "ws:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "ws://example.com/",
     "origin": "ws://example.com",
     "protocol": "ws:",
@@ -2975,7 +2979,7 @@
   },
   {
     "input": "wss:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "wss://example.com/",
     "origin": "wss://example.com",
     "protocol": "wss:",
@@ -2990,7 +2994,7 @@
   },
   {
     "input": "data:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "data:example.com/",
     "origin": "null",
     "protocol": "data:",
@@ -3005,7 +3009,7 @@
   },
   {
     "input": "javascript:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "javascript:example.com/",
     "origin": "null",
     "protocol": "javascript:",
@@ -3020,7 +3024,7 @@
   },
   {
     "input": "mailto:example.com/",
-    "base": "about:blank",
+    "base": null,
     "href": "mailto:example.com/",
     "origin": "null",
     "protocol": "mailto:",
@@ -3036,7 +3040,7 @@
   "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html",
   {
     "input": "http:@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.example.com/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3051,7 +3055,7 @@
   },
   {
     "input": "http:/@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.example.com/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3066,7 +3070,7 @@
   },
   {
     "input": "http://@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.example.com/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3081,7 +3085,7 @@
   },
   {
     "input": "http:a:[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://a:[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3096,7 +3100,7 @@
   },
   {
     "input": "http:/a:[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://a:[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3111,7 +3115,7 @@
   },
   {
     "input": "http://a:[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://a:[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3126,7 +3130,7 @@
   },
   {
     "input": "http://@pple.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://pple.com/",
     "origin": "http://pple.com",
     "protocol": "http:",
@@ -3141,7 +3145,7 @@
   },
   {
     "input": "http::[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://:[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3156,7 +3160,7 @@
   },
   {
     "input": "http:/:[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://:[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3171,7 +3175,7 @@
   },
   {
     "input": "http://:[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://:[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3186,64 +3190,64 @@
   },
   {
     "input": "http:/:@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http://user@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http:@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http:/@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http://@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https:@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http:a:b@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http:/a:b@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http://a:b@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http::@/www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http:a:@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3258,7 +3262,7 @@
   },
   {
     "input": "http:/a:@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3273,7 +3277,7 @@
   },
   {
     "input": "http://a:@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://[email protected]/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3288,7 +3292,7 @@
   },
   {
     "input": "http://[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://[email protected]/",
     "origin": "http://pple.com",
     "protocol": "http:",
@@ -3303,24 +3307,24 @@
   },
   {
     "input": "http:@:www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http:/@:www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "http://@:www.example.com",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://:@www.example.com",
-    "base": "about:blank",
+    "base": null,
     "href": "http://www.example.com/",
     "origin": "http://www.example.com",
     "protocol": "http:",
@@ -3618,7 +3622,7 @@
   "Leading and trailing C0 control or space",
   {
     "input": "\u0000\u001b\u0004\u0012 http://example.com/\u001f \u000d ",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.com/",
     "origin": "http://example.com",
     "protocol": "http:",
@@ -3662,17 +3666,17 @@
   "U+FFFD",
   {
     "input": "https://\ufffd",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://%EF%BF%BD",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://x/\ufffd?\ufffd#\ufffd",
-    "base": "about:blank",
+    "base": null,
     "href": "https://x/%EF%BF%BD?%EF%BF%BD#%EF%BF%BD",
     "origin": "https://x",
     "protocol": "https:",
@@ -3688,33 +3692,33 @@
   "Domain is ASCII, but a label is invalid IDNA",
   {
     "input": "http://a.b.c.xn--pokxncvks",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://10.0.0.xn--pokxncvks",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "IDNA labels should be matched case-insensitively",
   {
     "input": "http://a.b.c.XN--pokxncvks",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a.b.c.Xn--pokxncvks",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://10.0.0.XN--pokxncvks",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://10.0.0.xN--pokxncvks",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.",
@@ -3773,7 +3777,7 @@
   },
   {
     "input": "https://faß.ExAmPlE/",
-    "base": "about:blank",
+    "base": null,
     "href": "https://xn--fa-hia.example/",
     "origin": "https://xn--fa-hia.example",
     "protocol": "https:",
@@ -3788,7 +3792,7 @@
   },
   {
     "input": "sc://faß.ExAmPlE/",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://fa%C3%9F.ExAmPlE/",
     "origin": "null",
     "protocol": "sc:",
@@ -3868,7 +3872,7 @@
   },
   {
     "input": "https://x x:12",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP",
@@ -3890,7 +3894,7 @@
   "Domains with empty labels",
   {
     "input": "http://./",
-    "base": "about:blank",
+    "base": null,
     "href": "http://./",
     "origin": "http://.",
     "protocol": "http:",
@@ -3905,7 +3909,7 @@
   },
   {
     "input": "http://../",
-    "base": "about:blank",
+    "base": null,
     "href": "http://../",
     "origin": "http://..",
     "protocol": "http:",
@@ -3918,10 +3922,26 @@
     "search": "",
     "hash": ""
   },
+  "Non-special domains with empty labels",
+  {
+    "input": "h://.",
+    "base": null,
+    "href": "h://.",
+    "origin": "null",
+    "protocol": "h:",
+    "username": "",
+    "password": "",
+    "host": ".",
+    "hostname": ".",
+    "port": "",
+    "pathname": "",
+    "search": "",
+    "hash": ""
+  },
   "Broken IPv6",
   {
     "input": "http://[www.google.com]/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
@@ -3945,10 +3965,30 @@
     "failure": true
   },
   {
+    "input": "http://[::.1.2]",
+    "base": "http://other.com/",
+    "failure": true
+  },
+  {
     "input": "http://[::1.]",
     "base": "http://other.com/",
     "failure": true
   },
+  {
+    "input": "http://[::.1]",
+    "base": "http://other.com/",
+    "failure": true
+  },
+  {
+    "input": "http://[::%31]",
+    "base": "http://other.com/",
+    "failure": true
+  },
+  {
+    "input": "http://%5B::1]",
+    "base": "http://other.com/",
+    "failure": true
+  },
   "Misc Unicode",
   {
     "input": "http://foo:💩@example.com/bar",
@@ -4027,6 +4067,21 @@
     "hash": "#x"
   },
   {
+    "input": "#x:y",
+    "base": "about:blank",
+    "href": "about:blank#x:y",
+    "origin": "null",
+    "protocol": "about:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "blank",
+    "search": "",
+    "hash": "#x:y"
+  },
+  {
     "input": "#",
     "base": "test:test?test",
     "href": "test:test?test#",
@@ -4091,7 +4146,7 @@
   "byte is ' and url is special",
   {
     "input": "http://host/?'",
-    "base": "about:blank",
+    "base": null,
     "href": "http://host/?%27",
     "origin": "http://host",
     "protocol": "http:",
@@ -4106,7 +4161,7 @@
   },
   {
     "input": "notspecial://host/?'",
-    "base": "about:blank",
+    "base": null,
     "href": "notspecial://host/?'",
     "origin": "null",
     "protocol": "notspecial:",
@@ -4464,7 +4519,7 @@
   "# make sure that relative URL logic works on known typically non-relative schemes too",
   {
     "input": "about:/../",
-    "base": "about:blank",
+    "base": null,
     "href": "about:/",
     "origin": "null",
     "protocol": "about:",
@@ -4479,7 +4534,7 @@
   },
   {
     "input": "data:/../",
-    "base": "about:blank",
+    "base": null,
     "href": "data:/",
     "origin": "null",
     "protocol": "data:",
@@ -4494,7 +4549,7 @@
   },
   {
     "input": "javascript:/../",
-    "base": "about:blank",
+    "base": null,
     "href": "javascript:/",
     "origin": "null",
     "protocol": "javascript:",
@@ -4509,7 +4564,7 @@
   },
   {
     "input": "mailto:/../",
-    "base": "about:blank",
+    "base": null,
     "href": "mailto:/",
     "origin": "null",
     "protocol": "mailto:",
@@ -4525,7 +4580,7 @@
   "# unknown schemes and their hosts",
   {
     "input": "sc://ñ.test/",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://%C3%B1.test/",
     "origin": "null",
     "protocol": "sc:",
@@ -4540,7 +4595,7 @@
   },
   {
     "input": "sc://%/",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://%/",
     "protocol": "sc:",
     "username": "",
@@ -4554,22 +4609,22 @@
   },
   {
     "input": "sc://@/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://te@s:t@/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://:/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://:12/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
@@ -4590,7 +4645,7 @@
   "# unknown schemes and backslashes",
   {
     "input": "sc:\\../",
-    "base": "about:blank",
+    "base": null,
     "href": "sc:\\../",
     "origin": "null",
     "protocol": "sc:",
@@ -4606,7 +4661,7 @@
   "# unknown scheme with path looking like a password",
   {
     "input": "sc::[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "sc::[email protected]",
     "origin": "null",
     "protocol": "sc:",
@@ -4622,7 +4677,7 @@
   "# unknown scheme with bogus percent-encoding",
   {
     "input": "wow:%NBD",
-    "base": "about:blank",
+    "base": null,
     "href": "wow:%NBD",
     "origin": "null",
     "protocol": "wow:",
@@ -4637,7 +4692,7 @@
   },
   {
     "input": "wow:%1G",
-    "base": "about:blank",
+    "base": null,
     "href": "wow:%1G",
     "origin": "null",
     "protocol": "wow:",
@@ -4653,7 +4708,7 @@
   "# unknown scheme with non-URL characters",
   {
     "input": "wow:\uFFFF",
-    "base": "about:blank",
+    "base": null,
     "href": "wow:%EF%BF%BF",
     "origin": "null",
     "protocol": "wow:",
@@ -4669,53 +4724,53 @@
   "Forbidden host code points",
   {
     "input": "sc://a\u0000b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a<b",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a>b",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a[b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a\\b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a]b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a^b",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "sc://a|b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Forbidden host codepoints: tabs and newlines are removed during preprocessing",
   {
     "input": "foo://ho\u0009st/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -4729,7 +4784,7 @@
   },
   {
     "input": "foo://ho\u000Ast/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -4743,7 +4798,7 @@
   },
   {
     "input": "foo://ho\u000Dst/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -4758,198 +4813,198 @@
   "Forbidden domain code-points",
   {
     "input": "http://a\u0000b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0001b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0002b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0003b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0004b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0005b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0006b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0007b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0008b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u000Bb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u000Cb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u000Eb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u000Fb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0010b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0011b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0012b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0013b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0014b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0015b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0016b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0017b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0018b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u0019b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u001Ab/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u001Bb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u001Cb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u001Db/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u001Eb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u001Fb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a%b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a<b",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a>b",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a[b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a]b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a^b",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a|b/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://a\u007Fb/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Forbidden domain codepoints: tabs and newlines are removed during preprocessing",
   {
     "input": "http://ho\u0009st/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -4963,7 +5018,7 @@
   },
   {
     "input": "http://ho\u000Ast/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -4977,7 +5032,7 @@
   },
   {
     "input": "http://ho\u000Dst/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -4992,238 +5047,238 @@
   "Encoded forbidden domain codepoints in special URLs",
   {
     "input": "http://ho%00st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%01st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%02st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%03st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%04st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%05st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%06st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%07st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%08st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%09st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%0Ast/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%0Bst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%0Cst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%0Dst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%0Est/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%0Fst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%10st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%11st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%12st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%13st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%14st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%15st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%16st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%17st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%18st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%19st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%1Ast/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%1Bst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%1Cst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%1Dst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%1Est/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%1Fst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%20st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%23st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%25st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%2Fst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%3Ast/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%3Cst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%3Est/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%3Fst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%40st/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%5Bst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%5Cst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%5Dst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%7Cst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://ho%7Fst/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Allowed host/domain code points",
   {
     "input": "http://!\"$&'()*+,-.;=_`{}~/",
-    "base": "about:blank",
+    "base": null,
     "href": "http://!\"$&'()*+,-.;=_`{}~/",
     "origin": "http://!\"$&'()*+,-.;=_`{}~",
     "protocol": "http:",
@@ -5238,7 +5293,7 @@
   },
   {
     "input": "sc://\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F!\"$%&'()*+,-.;=_`{}~/",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://%01%02%03%04%05%06%07%08%0B%0C%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%7F!\"$%&'()*+,-.;=_`{}~/",
     "origin": "null",
     "protocol": "sc:",
@@ -5254,27 +5309,27 @@
   "# Hosts and percent-encoding",
   {
     "input": "ftp://example.com%80/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "ftp://example.com%A0/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://example.com%80/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://example.com%A0/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "ftp://%e2%98%83",
-    "base": "about:blank",
+    "base": null,
     "href": "ftp://xn--n3h/",
     "origin": "ftp://xn--n3h",
     "protocol": "ftp:",
@@ -5289,7 +5344,7 @@
   },
   {
     "input": "https://%e2%98%83",
-    "base": "about:blank",
+    "base": null,
     "href": "https://xn--n3h/",
     "origin": "https://xn--n3h",
     "protocol": "https:",
@@ -5305,7 +5360,7 @@
   "# tests from jsdom/whatwg-url designed for code coverage",
   {
     "input": "http://127.0.0.1:10100/relative_import.html",
-    "base": "about:blank",
+    "base": null,
     "href": "http://127.0.0.1:10100/relative_import.html",
     "origin": "http://127.0.0.1:10100",
     "protocol": "http:",
@@ -5320,7 +5375,7 @@
   },
   {
     "input": "http://facebook.com/?foo=%7B%22abc%22",
-    "base": "about:blank",
+    "base": null,
     "href": "http://facebook.com/?foo=%7B%22abc%22",
     "origin": "http://facebook.com",
     "protocol": "http:",
@@ -5335,7 +5390,7 @@
   },
   {
     "input": "https://localhost:3000/[email protected]",
-    "base": "about:blank",
+    "base": null,
     "href": "https://localhost:3000/[email protected]",
     "origin": "https://localhost:3000",
     "protocol": "https:",
@@ -5351,7 +5406,7 @@
   "# tab/LF/CR",
   {
     "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg",
-    "base": "about:blank",
+    "base": null,
     "href": "http://host:9000/path?query#frag",
     "origin": "http://host:9000",
     "protocol": "http:",
@@ -5438,7 +5493,7 @@
   "# Percent encoding of fragments",
   {
     "input": "http://foo.bar/baz?qux#foo\bbar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo.bar/baz?qux#foo%08bar",
     "origin": "http://foo.bar",
     "protocol": "http:",
@@ -5454,7 +5509,7 @@
   },
   {
     "input": "http://foo.bar/baz?qux#foo\"bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo.bar/baz?qux#foo%22bar",
     "origin": "http://foo.bar",
     "protocol": "http:",
@@ -5470,7 +5525,7 @@
   },
   {
     "input": "http://foo.bar/baz?qux#foo<bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo.bar/baz?qux#foo%3Cbar",
     "origin": "http://foo.bar",
     "protocol": "http:",
@@ -5486,7 +5541,7 @@
   },
   {
     "input": "http://foo.bar/baz?qux#foo>bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo.bar/baz?qux#foo%3Ebar",
     "origin": "http://foo.bar",
     "protocol": "http:",
@@ -5502,7 +5557,7 @@
   },
   {
     "input": "http://foo.bar/baz?qux#foo`bar",
-    "base": "about:blank",
+    "base": null,
     "href": "http://foo.bar/baz?qux#foo%60bar",
     "origin": "http://foo.bar",
     "protocol": "http:",
@@ -5734,7 +5789,7 @@
   },
   {
     "input": "https://0x.0x.0",
-    "base": "about:blank",
+    "base": null,
     "href": "https://0.0.0.0/",
     "origin": "https://0.0.0.0",
     "protocol": "https:",
@@ -5750,18 +5805,18 @@
   "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)",
   {
     "input": "https://0x100000000/test",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://256.0.0.1/test",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "# file URLs containing percent-encoded Windows drive letters (shouldn't work)",
   {
     "input": "file:///C%3A/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///C%3A/",
     "protocol": "file:",
     "username": "",
@@ -5775,7 +5830,7 @@
   },
   {
     "input": "file:///C%7C/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///C%7C/",
     "protocol": "file:",
     "username": "",
@@ -5789,42 +5844,42 @@
   },
   {
     "input": "file://%43%3A",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://%43%7C",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://%43|",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://C%7C",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://%43%7C/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://%43%7C/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "asdf://%43|/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "asdf://%43%7C/",
-    "base": "about:blank",
+    "base": null,
     "href": "asdf://%43%7C/",
     "origin": "null",
     "protocol": "asdf:",
@@ -5897,6 +5952,20 @@
   },
   {
     "input": "/",
+    "base": "file://h/C:/a/b",
+    "href": "file://h/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "h",
+    "hostname": "h",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "/",
     "base": "file://h/a/b",
     "href": "file://h/",
     "protocol": "file:",
@@ -6051,8 +6120,92 @@
   },
   "# File URLs and many (back)slashes",
   {
+    "input": "file:\\\\//",
+    "base": null,
+    "href": "file:////",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:\\\\\\\\",
+    "base": null,
+    "href": "file:////",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:\\\\\\\\?fox",
+    "base": null,
+    "href": "file:////?fox",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "?fox",
+    "hash": ""
+  },
+  {
+    "input": "file:\\\\\\\\#guppy",
+    "base": null,
+    "href": "file:////#guppy",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": "#guppy"
+  },
+  {
+    "input": "file://spider///",
+    "base": null,
+    "href": "file://spider///",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "spider",
+    "hostname": "spider",
+    "port": "",
+    "pathname": "///",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:\\\\localhost//",
+    "base": null,
+    "href": "file:////",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "file:///localhost//cat",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///localhost//cat",
     "protocol": "file:",
     "username": "",
@@ -6065,6 +6218,48 @@
     "hash": ""
   },
   {
+    "input": "file://\\/localhost//cat",
+    "base": null,
+    "href": "file:////localhost//cat",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//localhost//cat",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file://localhost//a//../..//",
+    "base": null,
+    "href": "file://///",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "///",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "/////mouse",
+    "base": "file:///elephant",
+    "href": "file://///mouse",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "///mouse",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "\\//pig",
     "base": "file://lion/",
     "href": "file:///pig",
@@ -6079,6 +6274,48 @@
     "hash": ""
   },
   {
+    "input": "\\/localhost//pig",
+    "base": "file://lion/",
+    "href": "file:////pig",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//pig",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "//localhost//pig",
+    "base": "file://lion/",
+    "href": "file:////pig",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//pig",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "/..//localhost//pig",
+    "base": "file://lion/",
+    "href": "file://lion//localhost//pig",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "lion",
+    "hostname": "lion",
+    "port": "",
+    "pathname": "//localhost//pig",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "file://",
     "base": "file://ape/",
     "href": "file:///",
@@ -6123,6 +6360,104 @@
   },
   "# Windows drive letter handling with the 'file:' base URL",
   {
+    "input": "C|",
+    "base": "file://host/dir/file",
+    "href": "file://host/C:",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "C|",
+    "base": "file://host/D:/dir1/dir2/file",
+    "href": "file://host/C:",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "C|#",
+    "base": "file://host/dir/file",
+    "href": "file://host/C:#",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "C|?",
+    "base": "file://host/dir/file",
+    "href": "file://host/C:?",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "C|/",
+    "base": "file://host/dir/file",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "C|\n/",
+    "base": "file://host/dir/file",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "C|\\",
+    "base": "file://host/dir/file",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "C",
     "base": "file://host/dir/file",
     "href": "file://host/dir/C",
@@ -6193,6 +6528,120 @@
     "search": "",
     "hash": ""
   },
+  {
+    "input": "/c:/foo/bar",
+    "base": "file://host/path",
+    "href": "file://host/c:/foo/bar",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/c:/foo/bar",
+    "search": "",
+    "hash": ""
+  },
+  "# Do not drop the host in the presence of a drive letter",
+  {
+    "input": "file://example.net/C:/",
+    "base": null,
+    "href": "file://example.net/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "example.net",
+    "hostname": "example.net",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file://1.2.3.4/C:/",
+    "base": null,
+    "href": "file://1.2.3.4/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "1.2.3.4",
+    "hostname": "1.2.3.4",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file://[1::8]/C:/",
+    "base": null,
+    "href": "file://[1::8]/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "[1::8]",
+    "hostname": "[1::8]",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  "# Copy the host from the base URL in the following cases",
+  {
+    "input": "C|/",
+    "base": "file://host/",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "/C:/",
+    "base": "file://host/",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:C:/",
+    "base": "file://host/",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:/C:/",
+    "base": "file://host/",
+    "href": "file://host/C:/",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "host",
+    "hostname": "host",
+    "port": "",
+    "pathname": "/C:/",
+    "search": "",
+    "hash": ""
+  },
   "# Copy the empty host from the input in the following cases",
   {
     "input": "//C:/",
@@ -6253,7 +6702,7 @@
   "# Windows drive letter quirk (no host)",
   {
     "input": "file:/C|/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///C:/",
     "protocol": "file:",
     "username": "",
@@ -6267,7 +6716,7 @@
   },
   {
     "input": "file://C|/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///C:/",
     "protocol": "file:",
     "username": "",
@@ -6282,7 +6731,7 @@
   "# file URLs without base URL by Rimas Misevičius",
   {
     "input": "file:",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///",
     "protocol": "file:",
     "username": "",
@@ -6296,7 +6745,7 @@
   },
   {
     "input": "file:?q=v",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///?q=v",
     "protocol": "file:",
     "username": "",
@@ -6310,7 +6759,7 @@
   },
   {
     "input": "file:#frag",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///#frag",
     "protocol": "file:",
     "username": "",
@@ -6325,7 +6774,7 @@
   "# file: drive letter cases from https://crbug.com/1078698",
   {
     "input": "file:///Y:",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///Y:",
     "protocol": "file:",
     "username": "",
@@ -6339,7 +6788,7 @@
   },
   {
     "input": "file:///Y:/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///Y:/",
     "protocol": "file:",
     "username": "",
@@ -6353,7 +6802,7 @@
   },
   {
     "input": "file:///./Y",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///Y",
     "protocol": "file:",
     "username": "",
@@ -6367,7 +6816,7 @@
   },
   {
     "input": "file:///./Y:",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///Y:",
     "protocol": "file:",
     "username": "",
@@ -6381,14 +6830,14 @@
   },
   {
     "input": "\\\\\\.\\Y:",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   "# file: drive letter cases from https://crbug.com/1078698 but lowercased",
   {
     "input": "file:///y:",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///y:",
     "protocol": "file:",
     "username": "",
@@ -6402,7 +6851,7 @@
   },
   {
     "input": "file:///y:/",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///y:/",
     "protocol": "file:",
     "username": "",
@@ -6416,7 +6865,7 @@
   },
   {
     "input": "file:///./y",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///y",
     "protocol": "file:",
     "username": "",
@@ -6430,7 +6879,7 @@
   },
   {
     "input": "file:///./y:",
-    "base": "about:blank",
+    "base": null,
     "href": "file:///y:",
     "protocol": "file:",
     "username": "",
@@ -6444,12 +6893,54 @@
   },
   {
     "input": "\\\\\\.\\y:",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   "# Additional file URL tests for (https://github.com/whatwg/url/issues/405)",
   {
+    "input": "file://localhost//a//../..//foo",
+    "base": null,
+    "href": "file://///foo",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "///foo",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file://localhost////foo",
+    "base": null,
+    "href": "file://////foo",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "////foo",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:////foo",
+    "base": null,
+    "href": "file:////foo",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//foo",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "file:///one/two",
     "base": "file:///",
     "href": "file:///one/two",
@@ -6464,6 +6955,20 @@
     "hash": ""
   },
   {
+    "input": "file:////one/two",
+    "base": "file:///",
+    "href": "file:////one/two",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//one/two",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "//one/two",
     "base": "file:///",
     "href": "file://one/two",
@@ -6491,6 +6996,63 @@
     "search": "",
     "hash": ""
   },
+  {
+    "input": "////one/two",
+    "base": "file:///",
+    "href": "file:////one/two",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//one/two",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:///.//",
+    "base": "file:////",
+    "href": "file:////",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  "File URL tests for https://github.com/whatwg/url/issues/549",
+  {
+    "input": "file:.//p",
+    "base": null,
+    "href": "file:////p",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//p",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "file:/.//p",
+    "base": null,
+    "href": "file:////p",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//p",
+    "search": "",
+    "hash": ""
+  },
   "# IPv6 tests",
   {
     "input": "http://[1:0::]",
@@ -6514,48 +7076,48 @@
   },
   {
     "input": "https://[0::0::0]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://[0:.0]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://[0:0:]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://[0:1:2:3:4:5:6:7.0.0.0.1]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://[0:1.00.0.0.0]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://[0:1.290.0.0.0]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "https://[0:1.23.23]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "# Empty host",
   {
     "input": "http://?",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://#",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Port overflow (2^32 + 81)",
@@ -6579,7 +7141,7 @@
   "# Non-special-URL path tests",
   {
     "input": "sc://ñ",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://%C3%B1",
     "origin": "null",
     "protocol": "sc:",
@@ -6594,7 +7156,7 @@
   },
   {
     "input": "sc://ñ?x",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://%C3%B1?x",
     "origin": "null",
     "protocol": "sc:",
@@ -6609,7 +7171,7 @@
   },
   {
     "input": "sc://ñ#x",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://%C3%B1#x",
     "origin": "null",
     "protocol": "sc:",
@@ -6654,7 +7216,7 @@
   },
   {
     "input": "sc://?",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://?",
     "protocol": "sc:",
     "username": "",
@@ -6668,7 +7230,7 @@
   },
   {
     "input": "sc://#",
-    "base": "about:blank",
+    "base": null,
     "href": "sc://#",
     "protocol": "sc:",
     "username": "",
@@ -6724,7 +7286,7 @@
   },
   {
     "input": "tftp://foobar.com/someconfig;mode=netascii",
-    "base": "about:blank",
+    "base": null,
     "href": "tftp://foobar.com/someconfig;mode=netascii",
     "origin": "null",
     "protocol": "tftp:",
@@ -6739,7 +7301,7 @@
   },
   {
     "input": "telnet://user:[email protected]:23/",
-    "base": "about:blank",
+    "base": null,
     "href": "telnet://user:[email protected]:23/",
     "origin": "null",
     "protocol": "telnet:",
@@ -6754,7 +7316,7 @@
   },
   {
     "input": "ut2004://10.10.10.10:7777/Index.ut2",
-    "base": "about:blank",
+    "base": null,
     "href": "ut2004://10.10.10.10:7777/Index.ut2",
     "origin": "null",
     "protocol": "ut2004:",
@@ -6769,7 +7331,7 @@
   },
   {
     "input": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz",
-    "base": "about:blank",
+    "base": null,
     "href": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz",
     "origin": "null",
     "protocol": "redis:",
@@ -6784,7 +7346,7 @@
   },
   {
     "input": "rsync://foo@host:911/sup",
-    "base": "about:blank",
+    "base": null,
     "href": "rsync://foo@host:911/sup",
     "origin": "null",
     "protocol": "rsync:",
@@ -6799,7 +7361,7 @@
   },
   {
     "input": "git://github.com/foo/bar.git",
-    "base": "about:blank",
+    "base": null,
     "href": "git://github.com/foo/bar.git",
     "origin": "null",
     "protocol": "git:",
@@ -6814,7 +7376,7 @@
   },
   {
     "input": "irc://myserver.com:6999/channel?passwd",
-    "base": "about:blank",
+    "base": null,
     "href": "irc://myserver.com:6999/channel?passwd",
     "origin": "null",
     "protocol": "irc:",
@@ -6829,7 +7391,7 @@
   },
   {
     "input": "dns://fw.example.org:9999/foo.bar.org?type=TXT",
-    "base": "about:blank",
+    "base": null,
     "href": "dns://fw.example.org:9999/foo.bar.org?type=TXT",
     "origin": "null",
     "protocol": "dns:",
@@ -6844,7 +7406,7 @@
   },
   {
     "input": "ldap://localhost:389/ou=People,o=JNDITutorial",
-    "base": "about:blank",
+    "base": null,
     "href": "ldap://localhost:389/ou=People,o=JNDITutorial",
     "origin": "null",
     "protocol": "ldap:",
@@ -6859,7 +7421,7 @@
   },
   {
     "input": "git+https://github.com/foo/bar",
-    "base": "about:blank",
+    "base": null,
     "href": "git+https://github.com/foo/bar",
     "origin": "null",
     "protocol": "git+https:",
@@ -6874,7 +7436,7 @@
   },
   {
     "input": "urn:ietf:rfc:2648",
-    "base": "about:blank",
+    "base": null,
     "href": "urn:ietf:rfc:2648",
     "origin": "null",
     "protocol": "urn:",
@@ -6889,7 +7451,7 @@
   },
   {
     "input": "tag:[email protected],2001:foo/bar",
-    "base": "about:blank",
+    "base": null,
     "href": "tag:[email protected],2001:foo/bar",
     "origin": "null",
     "protocol": "tag:",
@@ -6902,10 +7464,194 @@
     "search": "",
     "hash": ""
   },
+  "Serialize /. in path",
+  {
+    "input": "non-spec:/.//",
+    "base": null,
+    "href": "non-spec:/.//",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "non-spec:/..//",
+    "base": null,
+    "href": "non-spec:/.//",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "non-spec:/a/..//",
+    "base": null,
+    "href": "non-spec:/.//",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "non-spec:/.//path",
+    "base": null,
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "non-spec:/..//path",
+    "base": null,
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "non-spec:/a/..//path",
+    "base": null,
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "/.//path",
+    "base": "non-spec:/p",
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "/..//path",
+    "base": "non-spec:/p",
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "..//path",
+    "base": "non-spec:/p",
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "a/..//path",
+    "base": "non-spec:/p",
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "",
+    "base": "non-spec:/..//p",
+    "href": "non-spec:/.//p",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//p",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "path",
+    "base": "non-spec:/..//p",
+    "href": "non-spec:/.//path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "//path",
+    "search": "",
+    "hash": ""
+  },
+  "Do not serialize /. in path",
+  {
+    "input": "../path",
+    "base": "non-spec:/.//p",
+    "href": "non-spec:/path",
+    "protocol": "non-spec:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/path",
+    "search": "",
+    "hash": ""
+  },
   "# percent encoded hosts in non-special-URLs",
   {
     "input": "non-special://%E2%80%A0/",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://%E2%80%A0/",
     "protocol": "non-special:",
     "username": "",
@@ -6919,7 +7665,7 @@
   },
   {
     "input": "non-special://H%4fSt/path",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://H%4fSt/path",
     "protocol": "non-special:",
     "username": "",
@@ -6934,7 +7680,7 @@
   "# IPv6 in non-special-URLs",
   {
     "input": "non-special://[1:2:0:0:5:0:0:0]/",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://[1:2:0:0:5::]/",
     "protocol": "non-special:",
     "username": "",
@@ -6948,7 +7694,7 @@
   },
   {
     "input": "non-special://[1:2:0:0:0:0:0:3]/",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://[1:2::3]/",
     "protocol": "non-special:",
     "username": "",
@@ -6962,7 +7708,7 @@
   },
   {
     "input": "non-special://[1:2::3]:80/",
-    "base": "about:blank",
+    "base": null,
     "href": "non-special://[1:2::3]:80/",
     "protocol": "non-special:",
     "username": "",
@@ -6976,12 +7722,12 @@
   },
   {
     "input": "non-special://[:80/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "blob:https://example.com:443/",
-    "base": "about:blank",
+    "base": null,
     "href": "blob:https://example.com:443/",
     "origin": "https://example.com",
     "protocol": "blob:",
@@ -6995,8 +7741,23 @@
     "hash": ""
   },
   {
+    "input": "blob:http://example.org:88/",
+    "base": null,
+    "href": "blob:http://example.org:88/",
+    "origin": "http://example.org:88",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "http://example.org:88/",
+    "search": "",
+    "hash": ""
+  },
+  {
     "input": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf",
-    "base": "about:blank",
+    "base": null,
     "href": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf",
     "origin": "null",
     "protocol": "blob:",
@@ -7011,7 +7772,7 @@
   },
   {
     "input": "blob:",
-    "base": "about:blank",
+    "base": null,
     "href": "blob:",
     "origin": "null",
     "protocol": "blob:",
@@ -7024,10 +7785,133 @@
     "search": "",
     "hash": ""
   },
+  "blob: in blob:",
+  {
+    "input": "blob:blob:",
+    "base": null,
+    "href": "blob:blob:",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "blob:",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "blob:blob:https://example.org/",
+    "base": null,
+    "href": "blob:blob:https://example.org/",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "blob:https://example.org/",
+    "search": "",
+    "hash": ""
+  },
+  "Non-http(s): in blob:",
+  {
+    "input": "blob:about:blank",
+    "base": null,
+    "href": "blob:about:blank",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "about:blank",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "blob:file://host/path",
+    "base": null,
+    "href": "blob:file://host/path",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "file://host/path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "blob:ftp://host/path",
+    "base": null,
+    "href": "blob:ftp://host/path",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "ftp://host/path",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "blob:ws://example.org/",
+    "base": null,
+    "href": "blob:ws://example.org/",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "ws://example.org/",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "blob:wss://example.org/",
+    "base": null,
+    "href": "blob:wss://example.org/",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "wss://example.org/",
+    "search": "",
+    "hash": ""
+  },
+  "Percent-encoded http: in blob:",
+  {
+    "input": "blob:http%3a//example.org/",
+    "base": null,
+    "href": "blob:http%3a//example.org/",
+    "origin": "null",
+    "protocol": "blob:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "http%3a//example.org/",
+    "search": "",
+    "hash": ""
+  },
   "Invalid IPv4 radix digits",
   {
     "input": "http://0x7f.0.0.0x7g",
-    "base": "about:blank",
+    "base": null,
     "href": "http://0x7f.0.0.0x7g/",
     "protocol": "http:",
     "username": "",
@@ -7041,7 +7925,7 @@
   },
   {
     "input": "http://0X7F.0.0.0X7G",
-    "base": "about:blank",
+    "base": null,
     "href": "http://0x7f.0.0.0x7g/",
     "protocol": "http:",
     "username": "",
@@ -7056,13 +7940,13 @@
   "Invalid IPv4 portion of IPv6 address",
   {
     "input": "http://[::127.0.0.0.1]",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "Uncompressed IPv6 addresses with 0",
   {
     "input": "http://[0:1:0:1:0:1:0:1]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://[0:1:0:1:0:1:0:1]/",
     "protocol": "http:",
     "username": "",
@@ -7076,7 +7960,7 @@
   },
   {
     "input": "http://[1:0:1:0:1:0:1:0]",
-    "base": "about:blank",
+    "base": null,
     "href": "http://[1:0:1:0:1:0:1:0]/",
     "protocol": "http:",
     "username": "",
@@ -7091,7 +7975,7 @@
   "Percent-encoded query and fragment",
   {
     "input": "http://example.org/test?\u0022",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?%22",
     "protocol": "http:",
     "username": "",
@@ -7105,7 +7989,7 @@
   },
   {
     "input": "http://example.org/test?\u0023",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?#",
     "protocol": "http:",
     "username": "",
@@ -7119,7 +8003,7 @@
   },
   {
     "input": "http://example.org/test?\u003C",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?%3C",
     "protocol": "http:",
     "username": "",
@@ -7133,7 +8017,7 @@
   },
   {
     "input": "http://example.org/test?\u003E",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?%3E",
     "protocol": "http:",
     "username": "",
@@ -7147,7 +8031,7 @@
   },
   {
     "input": "http://example.org/test?\u2323",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?%E2%8C%A3",
     "protocol": "http:",
     "username": "",
@@ -7161,7 +8045,7 @@
   },
   {
     "input": "http://example.org/test?%23%23",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?%23%23",
     "protocol": "http:",
     "username": "",
@@ -7175,7 +8059,7 @@
   },
   {
     "input": "http://example.org/test?%GH",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?%GH",
     "protocol": "http:",
     "username": "",
@@ -7189,7 +8073,7 @@
   },
   {
     "input": "http://example.org/test?a#%EF",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?a#%EF",
     "protocol": "http:",
     "username": "",
@@ -7203,7 +8087,7 @@
   },
   {
     "input": "http://example.org/test?a#%GH",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?a#%GH",
     "protocol": "http:",
     "username": "",
@@ -7218,21 +8102,21 @@
   "URLs that require a non-about:blank base. (Also serve as invalid base tests.)",
   {
     "input": "a",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "a/",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   {
     "input": "a//",
-    "base": "about:blank",
+    "base": null,
     "failure": true,
-    "inputCanBeRelative": true
+    "relativeTo": "non-opaque-path-base"
   },
   "Bases that don't fail to parse but fail to be bases",
   {
@@ -7305,7 +8189,7 @@
   "Null code point in fragment",
   {
     "input": "http://example.org/test?a#b\u0000c",
-    "base": "about:blank",
+    "base": null,
     "href": "http://example.org/test?a#b%00c",
     "protocol": "http:",
     "username": "",
@@ -7319,7 +8203,7 @@
   },
   {
     "input": "non-spec://example.org/test?a#b\u0000c",
-    "base": "about:blank",
+    "base": null,
     "href": "non-spec://example.org/test?a#b%00c",
     "protocol": "non-spec:",
     "username": "",
@@ -7333,7 +8217,7 @@
   },
   {
     "input": "non-spec:/test?a#b\u0000c",
-    "base": "about:blank",
+    "base": null,
     "href": "non-spec:/test?a#b%00c",
     "protocol": "non-spec:",
     "username": "",
@@ -7393,7 +8277,7 @@
   "IDNA ignored code points in file URLs hosts",
   {
     "input": "file://a\u00ADb/p",
-    "base": "about:blank",
+    "base": null,
     "href": "file://ab/p",
     "protocol": "file:",
     "username": "",
@@ -7407,7 +8291,7 @@
   },
   {
     "input": "file://a%C2%ADb/p",
-    "base": "about:blank",
+    "base": null,
     "href": "file://ab/p",
     "protocol": "file:",
     "username": "",
@@ -7419,20 +8303,35 @@
     "search": "",
     "hash": ""
   },
+  "IDNA hostnames which get mapped to 'localhost'",
+  {
+    "input": "file://loC𝐀𝐋𝐇𝐨𝐬𝐭/usr/bin",
+    "base": null,
+    "href": "file:///usr/bin",
+    "protocol": "file:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/usr/bin",
+    "search": "",
+    "hash": ""
+  },
   "Empty host after the domain to ASCII",
   {
     "input": "file://\u00ad/p",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://%C2%AD/p",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "file://xn--/p",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   "https://bugzilla.mozilla.org/show_bug.cgi?id=1647058",
@@ -7453,7 +8352,7 @@
   "UTF-8 percent-encode of C0 control percent-encode set and supersets",
   {
     "input": "non-special:cannot-be-a-base-url-\u0000\u0001\u001F\u001E\u007E\u007F\u0080",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "",
     "hostname": "",
@@ -7468,7 +8367,7 @@
   },
   {
     "input": "https://www.example.com/path{\u007Fpath.html?query'\u007F=query#fragment<\u007Ffragment",
-    "base": "about:blank",
+    "base": null,
     "hash": "#fragment%3C%7Ffragment",
     "host": "www.example.com",
     "hostname": "www.example.com",
@@ -7499,7 +8398,7 @@
   "Tests for the distinct percent-encode sets",
   {
     "input": "foo:// !\"$%&'()*+,-.;<=>@[\\]^_`{|}~@host/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7514,7 +8413,7 @@
   },
   {
     "input": "wss:// !\"$%&'()*+,-.;<=>@[]^_`{|}~@host/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7529,7 +8428,7 @@
   },
   {
     "input": "foo://joe: !\"$%&'()*+,-.:;<=>@[\\]^_`{|}~@host/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7544,7 +8443,7 @@
   },
   {
     "input": "wss://joe: !\"$%&'()*+,-.:;<=>@[]^_`{|}~@host/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7559,7 +8458,7 @@
   },
   {
     "input": "foo://!\"$%&'()*+,-.;=_`{}~/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "!\"$%&'()*+,-.;=_`{}~",
     "hostname": "!\"$%&'()*+,-.;=_`{}~",
@@ -7574,7 +8473,7 @@
   },
   {
     "input": "wss://!\"$&'()*+,-.;=_`{}~/",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "!\"$&'()*+,-.;=_`{}~",
     "hostname": "!\"$&'()*+,-.;=_`{}~",
@@ -7589,7 +8488,7 @@
   },
   {
     "input": "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7604,7 +8503,7 @@
   },
   {
     "input": "wss://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7619,7 +8518,7 @@
   },
   {
     "input": "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7634,7 +8533,7 @@
   },
   {
     "input": "wss://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "host",
     "hostname": "host",
@@ -7649,7 +8548,7 @@
   },
   {
     "input": "foo://host/dir/# !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
-    "base": "about:blank",
+    "base": null,
     "hash": "#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~",
     "host": "host",
     "hostname": "host",
@@ -7664,7 +8563,7 @@
   },
   {
     "input": "wss://host/dir/# !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
-    "base": "about:blank",
+    "base": null,
     "hash": "#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~",
     "host": "host",
     "hostname": "host",
@@ -7738,12 +8637,14 @@
   {
     "input": "#",
     "base": null,
-    "failure": true
+    "failure": true,
+    "relativeTo": "any-base"
   },
   {
     "input": "?",
     "base": null,
-    "failure": true
+    "failure": true,
+    "relativeTo": "non-opaque-path-base"
   },
   "Last component looks like a number, but not valid IPv4",
   {
@@ -7758,12 +8659,12 @@
   },
   {
     "input": "http://0..0x300/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://0..0x300./",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
@@ -7778,102 +8679,102 @@
   },
   {
     "input": "http://1.2.3.08",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://1.2.3.08.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://1.2.3.09",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://09.2.3.4",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://09.2.3.4.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://01.2.3.4.5",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://01.2.3.4.5.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://0x100.2.3.4",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://0x100.2.3.4.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://0x1.2.3.4.5",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://0x1.2.3.4.5.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.1.2.3.4",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.1.2.3.4.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.2.3.4",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.2.3.4.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.09",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.09.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.0x4",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.0x4.",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.09..",
-    "base": "about:blank",
+    "base": null,
     "hash": "",
     "host": "foo.09..",
     "hostname": "foo.09..",
@@ -7887,22 +8788,732 @@
   },
   {
     "input": "http://0999999999999999999/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.0x",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://foo.0XFfFfFfFfFfFfFfFfFfAcE123",
-    "base": "about:blank",
+    "base": null,
     "failure": true
   },
   {
     "input": "http://💩.123/",
-    "base": "about:blank",
+    "base": null,
     "failure": true
+  },
+  "U+0000 and U+FFFF in various places",
+  {
+    "input": "https://\u0000y",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "https://x/\u0000y",
+    "base": null,
+    "hash": "",
+    "host": "x",
+    "hostname": "x",
+    "href": "https://x/%00y",
+    "password": "",
+    "pathname": "/%00y",
+    "port": "",
+    "protocol": "https:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "https://x/?\u0000y",
+    "base": null,
+    "hash": "",
+    "host": "x",
+    "hostname": "x",
+    "href": "https://x/?%00y",
+    "password": "",
+    "pathname": "/",
+    "port": "",
+    "protocol": "https:",
+    "search": "?%00y",
+    "username": ""
+  },
+  {
+    "input": "https://x/?#\u0000y",
+    "base": null,
+    "hash": "#%00y",
+    "host": "x",
+    "hostname": "x",
+    "href": "https://x/?#%00y",
+    "password": "",
+    "pathname": "/",
+    "port": "",
+    "protocol": "https:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "https://\uFFFFy",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "https://x/\uFFFFy",
+    "base": null,
+    "hash": "",
+    "host": "x",
+    "hostname": "x",
+    "href": "https://x/%EF%BF%BFy",
+    "password": "",
+    "pathname": "/%EF%BF%BFy",
+    "port": "",
+    "protocol": "https:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "https://x/?\uFFFFy",
+    "base": null,
+    "hash": "",
+    "host": "x",
+    "hostname": "x",
+    "href": "https://x/?%EF%BF%BFy",
+    "password": "",
+    "pathname": "/",
+    "port": "",
+    "protocol": "https:",
+    "search": "?%EF%BF%BFy",
+    "username": ""
+  },
+  {
+    "input": "https://x/?#\uFFFFy",
+    "base": null,
+    "hash": "#%EF%BF%BFy",
+    "host": "x",
+    "hostname": "x",
+    "href": "https://x/?#%EF%BF%BFy",
+    "password": "",
+    "pathname": "/",
+    "port": "",
+    "protocol": "https:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "non-special:\u0000y",
+    "base": null,
+    "hash": "",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:%00y",
+    "password": "",
+    "pathname": "%00y",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "non-special:x/\u0000y",
+    "base": null,
+    "hash": "",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:x/%00y",
+    "password": "",
+    "pathname": "x/%00y",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "non-special:x/?\u0000y",
+    "base": null,
+    "hash": "",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:x/?%00y",
+    "password": "",
+    "pathname": "x/",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "?%00y",
+    "username": ""
+  },
+  {
+    "input": "non-special:x/?#\u0000y",
+    "base": null,
+    "hash": "#%00y",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:x/?#%00y",
+    "password": "",
+    "pathname": "x/",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "non-special:\uFFFFy",
+    "base": null,
+    "hash": "",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:%EF%BF%BFy",
+    "password": "",
+    "pathname": "%EF%BF%BFy",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "non-special:x/\uFFFFy",
+    "base": null,
+    "hash": "",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:x/%EF%BF%BFy",
+    "password": "",
+    "pathname": "x/%EF%BF%BFy",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "non-special:x/?\uFFFFy",
+    "base": null,
+    "hash": "",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:x/?%EF%BF%BFy",
+    "password": "",
+    "pathname": "x/",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "?%EF%BF%BFy",
+    "username": ""
+  },
+  {
+    "input": "non-special:x/?#\uFFFFy",
+    "base": null,
+    "hash": "#%EF%BF%BFy",
+    "host": "",
+    "hostname": "",
+    "href": "non-special:x/?#%EF%BF%BFy",
+    "password": "",
+    "pathname": "x/",
+    "port": "",
+    "protocol": "non-special:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "",
+    "base": null,
+    "failure": true,
+    "relativeTo": "non-opaque-path-base"
+  },
+  {
+    "input": "https://example.com/\"quoted\"",
+    "base": null,
+    "hash": "",
+    "host": "example.com",
+    "hostname": "example.com",
+    "href": "https://example.com/%22quoted%22",
+    "origin": "https://example.com",
+    "password": "",
+    "pathname": "/%22quoted%22",
+    "port": "",
+    "protocol": "https:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "input": "https://a%C2%ADb/",
+    "base": null,
+    "hash": "",
+    "host": "ab",
+    "hostname": "ab",
+    "href": "https://ab/",
+    "origin": "https://ab",
+    "password": "",
+    "pathname": "/",
+    "port": "",
+    "protocol": "https:",
+    "search": "",
+    "username": ""
+  },
+  {
+    "comment": "Empty host after domain to ASCII",
+    "input": "https://\u00AD/",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "https://%C2%AD/",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "https://xn--/",
+    "base": null,
+    "failure": true
+  },
+  "Non-special schemes that some implementations might incorrectly treat as special",
+  {
+    "input": "data://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "data://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "data:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "data:///test",
+    "base": null,
+    "href": "data:///test",
+    "origin": "null",
+    "protocol": "data:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "data://test/a/../b",
+    "base": null,
+    "href": "data://test/b",
+    "origin": "null",
+    "protocol": "data:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "data://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "data://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "data://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "javascript://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "javascript://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "javascript:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "javascript:///test",
+    "base": null,
+    "href": "javascript:///test",
+    "origin": "null",
+    "protocol": "javascript:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "javascript://test/a/../b",
+    "base": null,
+    "href": "javascript://test/b",
+    "origin": "null",
+    "protocol": "javascript:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "javascript://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "javascript://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "javascript://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "mailto://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "mailto://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "mailto:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "mailto:///test",
+    "base": null,
+    "href": "mailto:///test",
+    "origin": "null",
+    "protocol": "mailto:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "mailto://test/a/../b",
+    "base": null,
+    "href": "mailto://test/b",
+    "origin": "null",
+    "protocol": "mailto:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "mailto://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "mailto://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "mailto://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "intent://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "intent://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "intent:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "intent:///test",
+    "base": null,
+    "href": "intent:///test",
+    "origin": "null",
+    "protocol": "intent:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "intent://test/a/../b",
+    "base": null,
+    "href": "intent://test/b",
+    "origin": "null",
+    "protocol": "intent:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "intent://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "intent://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "intent://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "urn://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "urn://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "urn:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "urn:///test",
+    "base": null,
+    "href": "urn:///test",
+    "origin": "null",
+    "protocol": "urn:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "urn://test/a/../b",
+    "base": null,
+    "href": "urn://test/b",
+    "origin": "null",
+    "protocol": "urn:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "urn://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "urn://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "urn://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "turn://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "turn://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "turn:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "turn:///test",
+    "base": null,
+    "href": "turn:///test",
+    "origin": "null",
+    "protocol": "turn:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "turn://test/a/../b",
+    "base": null,
+    "href": "turn://test/b",
+    "origin": "null",
+    "protocol": "turn:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "turn://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "turn://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "turn://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "stun://example.com:8080/pathname?search#hash",
+    "base": null,
+    "href": "stun://example.com:8080/pathname?search#hash",
+    "origin": "null",
+    "protocol": "stun:",
+    "username": "",
+    "password": "",
+    "host": "example.com:8080",
+    "hostname": "example.com",
+    "port": "8080",
+    "pathname": "/pathname",
+    "search": "?search",
+    "hash": "#hash"
+  },
+  {
+    "input": "stun:///test",
+    "base": null,
+    "href": "stun:///test",
+    "origin": "null",
+    "protocol": "stun:",
+    "username": "",
+    "password": "",
+    "host": "",
+    "hostname": "",
+    "port": "",
+    "pathname": "/test",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "stun://test/a/../b",
+    "base": null,
+    "href": "stun://test/b",
+    "origin": "null",
+    "protocol": "stun:",
+    "username": "",
+    "password": "",
+    "host": "test",
+    "hostname": "test",
+    "port": "",
+    "pathname": "/b",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "stun://:443",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "stun://test:test",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "stun://[:1]",
+    "base": null,
+    "failure": true
+  },
+  {
+    "input": "w://x:0",
+    "base": null,
+    "href": "w://x:0",
+    "origin": "null",
+    "protocol": "w:",
+    "username": "",
+    "password": "",
+    "host": "x:0",
+    "hostname": "x",
+    "port": "0",
+    "pathname": "",
+    "search": "",
+    "hash": ""
+  },
+  {
+    "input": "west://x:0",
+    "base": null,
+    "href": "west://x:0",
+    "origin": "null",
+    "protocol": "west:",
+    "username": "",
+    "password": "",
+    "host": "x:0",
+    "hostname": "x",
+    "port": "0",
+    "pathname": "",
+    "search": "",
+    "hash": ""
   }
 ]
diff --git a/crates/url/tests/wpt.rs b/crates/url/tests/wpt.rs
new file mode 100644
index 0000000..e0199a8
--- /dev/null
+++ b/crates/url/tests/wpt.rs
@@ -0,0 +1,523 @@
+// Copyright 2013-2014 The rust-url developers.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Data-driven tests imported from web-platform-tests
+
+use serde_json::Value;
+use std::collections::HashMap;
+use std::fmt::Write;
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+use std::sync::Mutex;
+use url::Url;
+
+// https://rustwasm.github.io/wasm-bindgen/wasm-bindgen-test/usage.html
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+use wasm_bindgen_test::{console_log, wasm_bindgen_test, wasm_bindgen_test_configure};
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+wasm_bindgen_test_configure!(run_in_browser);
+
+// wpt has its own test driver, but we shoe-horn this into wasm_bindgen_test
+// which will discard stdout and stderr. So, we make println! go to
+// console.log(), so we see failures that do not result in panics.
+
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+static PRINT_BUF: Mutex<Option<String>> = Mutex::new(None);
+
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+macro_rules! print {
+    ($($arg:tt)*) => {
+        let v = format!($($arg)*);
+        {
+            let mut buf = PRINT_BUF.lock().unwrap();
+            if let Some(buf) = buf.as_mut() {
+                buf.push_str(&v);
+            } else {
+                *buf = Some(v);
+            }
+        }
+    };
+}
+
+#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
+macro_rules! println {
+    () => {
+        let buf = PRINT_BUF.lock().unwrap().take();
+        match buf {
+            Some(buf) => console_log!("{buf}"),
+            None => console_log!(""),
+        }
+    };
+    ($($arg:tt)*) => {
+        let buf = PRINT_BUF.lock().unwrap().take();
+        match buf {
+            Some(buf) => {
+                let v = format!($($arg)*);
+                console_log!("{buf}{v}");
+            },
+            None => console_log!($($arg)*),
+        }
+    }
+}
+
+#[derive(Debug, serde::Deserialize)]
+struct UrlTest {
+    input: String,
+    base: Option<String>,
+    #[serde(flatten)]
+    result: UrlTestResult,
+}
+
+#[derive(Debug, serde::Deserialize)]
+#[serde(untagged)]
+#[allow(clippy::large_enum_variant)]
+enum UrlTestResult {
+    Ok(UrlTestOk),
+    Fail(UrlTestFail),
+}
+
+#[derive(Debug, serde::Deserialize)]
+struct UrlTestOk {
+    href: String,
+    protocol: String,
+    username: String,
+    password: String,
+    host: String,
+    hostname: String,
+    port: String,
+    pathname: String,
+    search: String,
+    hash: String,
+}
+
+#[derive(Debug, serde::Deserialize)]
+struct UrlTestFail {
+    failure: bool,
+}
+
+#[derive(Debug, serde::Deserialize)]
+struct SetterTest {
+    href: String,
+    new_value: String,
+    expected: SetterTestExpected,
+}
+
+#[derive(Debug, serde::Deserialize)]
+struct SetterTestExpected {
+    href: Option<String>,
+    protocol: Option<String>,
+    username: Option<String>,
+    password: Option<String>,
+    host: Option<String>,
+    hostname: Option<String>,
+    port: Option<String>,
+    pathname: Option<String>,
+    search: Option<String>,
+    hash: Option<String>,
+}
+
+#[cfg_attr(all(target_arch = "wasm32", target_os = "unknown"), wasm_bindgen_test)]
+fn main() {
+    let mut filter = None;
+    let mut args = std::env::args().skip(1);
+    while filter.is_none() {
+        if let Some(arg) = args.next() {
+            if arg == "--test-threads" {
+                args.next();
+                continue;
+            }
+            filter = Some(arg);
+        } else {
+            break;
+        }
+    }
+
+    let mut expected_failures = include_str!("expected_failures.txt")
+        .lines()
+        .collect::<Vec<_>>();
+
+    let mut errors = vec![];
+
+    // Copied from https://github.com/web-platform-tests/wpt/blob/master/url/
+    let url_json: Vec<Value> = serde_json::from_str(include_str!("urltestdata.json"))
+        .expect("JSON parse error in urltestdata.json");
+    let url_tests = url_json
+        .into_iter()
+        .filter(|val| val.is_object())
+        .map(|val| serde_json::from_value::<UrlTest>(val).expect("parsing failed"))
+        .collect::<Vec<_>>();
+
+    let setter_json: HashMap<String, Value> =
+        serde_json::from_str(include_str!("setters_tests.json"))
+            .expect("JSON parse error in setters_tests.json");
+    let setter_tests = setter_json
+        .into_iter()
+        .filter(|(k, _)| k != "comment")
+        .map(|(k, v)| {
+            let test = serde_json::from_value::<Vec<SetterTest>>(v).expect("parsing failed");
+            (k, test)
+        })
+        .collect::<HashMap<_, _>>();
+
+    for url_test in url_tests {
+        let mut name = format!("<{}>", url_test.input.escape_default());
+        if let Some(base) = &url_test.base {
+            write!(&mut name, " against <{}>", base.escape_default()).unwrap();
+        }
+        if should_skip(&name, filter.as_deref()) {
+            continue;
+        }
+        print!("{} ... ", name);
+
+        let res = run_url_test(url_test);
+        report(name, res, &mut errors, &mut expected_failures);
+    }
+
+    for (kind, tests) in setter_tests {
+        for test in tests {
+            let name = format!(
+                "<{}> set {} to <{}>",
+                test.href.escape_default(),
+                kind,
+                test.new_value.escape_default()
+            );
+            if should_skip(&name, filter.as_deref()) {
+                continue;
+            }
+
+            print!("{} ... ", name);
+
+            let res = run_setter_test(&kind, test);
+            report(name, res, &mut errors, &mut expected_failures);
+        }
+    }
+
+    println!();
+    println!("====================");
+    println!();
+
+    if !errors.is_empty() {
+        println!("errors:");
+        println!();
+
+        for (name, err) in errors {
+            println!("  name: {}", name);
+            println!("  err:  {}", err);
+            println!();
+        }
+
+        std::process::exit(1);
+    } else {
+        println!("all tests passed");
+    }
+
+    if !expected_failures.is_empty() && filter.is_none() {
+        println!();
+        println!("====================");
+        println!();
+        println!("tests were expected to fail but did not run:");
+        println!();
+
+        for name in expected_failures {
+            println!("  {}", name);
+        }
+
+        println!();
+        println!("if these tests were removed, update expected_failures.txt");
+        println!();
+
+        std::process::exit(1);
+    }
+}
+
+fn should_skip(name: &str, filter: Option<&str>) -> bool {
+    match filter {
+        Some(filter) => !name.contains(filter),
+        None => false,
+    }
+}
+
+fn report(
+    name: String,
+    res: Result<(), String>,
+    errors: &mut Vec<(String, String)>,
+    expected_failures: &mut Vec<&str>,
+) {
+    let expected_failure = expected_failures.contains(&&*name);
+    expected_failures.retain(|&s| s != &*name);
+    match res {
+        Ok(()) => {
+            if expected_failure {
+                println!("🟠 (unexpected success)");
+                errors.push((name, "unexpected success".to_string()));
+            } else {
+                println!("✅");
+            }
+        }
+        Err(err) => {
+            if expected_failure {
+                println!("✅ (expected fail)");
+            } else {
+                println!("❌");
+                errors.push((name, err));
+            }
+        }
+    }
+}
+
+fn run_url_test(
+    UrlTest {
+        base,
+        input,
+        result,
+    }: UrlTest,
+) -> Result<(), String> {
+    let base = match base {
+        Some(base) => {
+            let base =
+                Url::parse(&base).map_err(|e| format!("errored while parsing base: {}", e))?;
+            Some(base)
+        }
+        None => None,
+    };
+
+    let res = Url::options()
+        .base_url(base.as_ref())
+        .parse(&input)
+        .map_err(|e| format!("errored while parsing input: {}", e));
+
+    match result {
+        UrlTestResult::Ok(ok) => check_url_ok(res, ok),
+        UrlTestResult::Fail(fail) => {
+            assert!(fail.failure);
+            if res.is_ok() {
+                return Err("expected failure, but parsed successfully".to_string());
+            }
+
+            Ok(())
+        }
+    }
+}
+
+fn check_url_ok(res: Result<Url, String>, ok: UrlTestOk) -> Result<(), String> {
+    let url = match res {
+        Ok(url) => url,
+        Err(err) => {
+            return Err(format!("expected success, but errored: {:?}", err));
+        }
+    };
+
+    let href = url::quirks::href(&url);
+    if href != ok.href {
+        return Err(format!("expected href {:?}, but got {:?}", ok.href, href));
+    }
+
+    let protocol = url::quirks::protocol(&url);
+    if protocol != ok.protocol {
+        return Err(format!(
+            "expected protocol {:?}, but got {:?}",
+            ok.protocol, protocol
+        ));
+    }
+
+    let username = url::quirks::username(&url);
+    if username != ok.username {
+        return Err(format!(
+            "expected username {:?}, but got {:?}",
+            ok.username, username
+        ));
+    }
+
+    let password = url::quirks::password(&url);
+    if password != ok.password {
+        return Err(format!(
+            "expected password {:?}, but got {:?}",
+            ok.password, password
+        ));
+    }
+
+    let host = url::quirks::host(&url);
+    if host != ok.host {
+        return Err(format!("expected host {:?}, but got {:?}", ok.host, host));
+    }
+
+    let hostname = url::quirks::hostname(&url);
+    if hostname != ok.hostname {
+        return Err(format!(
+            "expected hostname {:?}, but got {:?}",
+            ok.hostname, hostname
+        ));
+    }
+
+    let port = url::quirks::port(&url);
+    if port != ok.port {
+        return Err(format!("expected port {:?}, but got {:?}", ok.port, port));
+    }
+
+    let pathname = url::quirks::pathname(&url);
+    if pathname != ok.pathname {
+        return Err(format!(
+            "expected pathname {:?}, but got {:?}",
+            ok.pathname, pathname
+        ));
+    }
+
+    let search = url::quirks::search(&url);
+    if search != ok.search {
+        return Err(format!(
+            "expected search {:?}, but got {:?}",
+            ok.search, search
+        ));
+    }
+
+    let hash = url::quirks::hash(&url);
+    if hash != ok.hash {
+        return Err(format!("expected hash {:?}, but got {:?}", ok.hash, hash));
+    }
+
+    Ok(())
+}
+
+fn run_setter_test(
+    kind: &str,
+    SetterTest {
+        href,
+        new_value,
+        expected,
+    }: SetterTest,
+) -> Result<(), String> {
+    let mut url = Url::parse(&href).map_err(|e| format!("errored while parsing href: {}", e))?;
+
+    match kind {
+        "protocol" => {
+            url::quirks::set_protocol(&mut url, &new_value).ok();
+        }
+        "username" => {
+            url::quirks::set_username(&mut url, &new_value).ok();
+        }
+        "password" => {
+            url::quirks::set_password(&mut url, &new_value).ok();
+        }
+        "host" => {
+            url::quirks::set_host(&mut url, &new_value).ok();
+        }
+        "hostname" => {
+            url::quirks::set_hostname(&mut url, &new_value).ok();
+        }
+        "port" => {
+            url::quirks::set_port(&mut url, &new_value).ok();
+        }
+        "pathname" => url::quirks::set_pathname(&mut url, &new_value),
+        "search" => url::quirks::set_search(&mut url, &new_value),
+        "hash" => url::quirks::set_hash(&mut url, &new_value),
+        _ => {
+            return Err(format!("unknown setter kind: {:?}", kind));
+        }
+    }
+
+    if let Some(expected_href) = expected.href {
+        let href = url::quirks::href(&url);
+        if href != expected_href {
+            return Err(format!(
+                "expected href {:?}, but got {:?}",
+                expected_href, href
+            ));
+        }
+    }
+
+    if let Some(expected_protocol) = expected.protocol {
+        let protocol = url::quirks::protocol(&url);
+        if protocol != expected_protocol {
+            return Err(format!(
+                "expected protocol {:?}, but got {:?}",
+                expected_protocol, protocol
+            ));
+        }
+    }
+
+    if let Some(expected_username) = expected.username {
+        let username = url::quirks::username(&url);
+        if username != expected_username {
+            return Err(format!(
+                "expected username {:?}, but got {:?}",
+                expected_username, username
+            ));
+        }
+    }
+
+    if let Some(expected_password) = expected.password {
+        let password = url::quirks::password(&url);
+        if password != expected_password {
+            return Err(format!(
+                "expected password {:?}, but got {:?}",
+                expected_password, password
+            ));
+        }
+    }
+
+    if let Some(expected_host) = expected.host {
+        let host = url::quirks::host(&url);
+        if host != expected_host {
+            return Err(format!(
+                "expected host {:?}, but got {:?}",
+                expected_host, host
+            ));
+        }
+    }
+
+    if let Some(expected_hostname) = expected.hostname {
+        let hostname = url::quirks::hostname(&url);
+        if hostname != expected_hostname {
+            return Err(format!(
+                "expected hostname {:?}, but got {:?}",
+                expected_hostname, hostname
+            ));
+        }
+    }
+
+    if let Some(expected_port) = expected.port {
+        let port = url::quirks::port(&url);
+        if port != expected_port {
+            return Err(format!(
+                "expected port {:?}, but got {:?}",
+                expected_port, port
+            ));
+        }
+    }
+
+    if let Some(expected_pathname) = expected.pathname {
+        let pathname = url::quirks::pathname(&url);
+        if pathname != expected_pathname {
+            return Err(format!(
+                "expected pathname {:?}, but got {:?}",
+                expected_pathname, pathname
+            ));
+        }
+    }
+
+    if let Some(expected_search) = expected.search {
+        let search = url::quirks::search(&url);
+        if search != expected_search {
+            return Err(format!(
+                "expected search {:?}, but got {:?}",
+                expected_search, search
+            ));
+        }
+    }
+
+    if let Some(expected_hash) = expected.hash {
+        let hash = url::quirks::hash(&url);
+        if hash != expected_hash {
+            return Err(format!(
+                "expected hash {:?}, but got {:?}",
+                expected_hash, hash
+            ));
+        }
+    }
+
+    Ok(())
+}
diff --git a/crates/virtio-vsock/.android-checksum.json b/crates/virtio-vsock/.android-checksum.json
index 2f45b78..c76174c 100644
--- a/crates/virtio-vsock/.android-checksum.json
+++ b/crates/virtio-vsock/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"280d96de3a0c8d954247c7d2ccec237231adc20f603a4474233c6ee90c3bc3d8","Android.bp":"128ce306f9a312f30424b65d5755c999fdf7ba215a9a7855852b7f3ba2c84995","CHANGELOG.md":"17081a2d20098f3fcc9801504d3aa69acbb594b3c1c3d3b915151376e7b03a7b","Cargo.toml":"5be304a2981079b3ac4235964dc5942c7f2aa6b881d3e73b60620d3216887da1","LICENSE":"d6e9a3aa5ff391bcbc73cbe06c3917ca0e317a4ef341f36c4522090cefb372dc","METADATA":"0038561be10d33622c298a9ec157b874aeae7af572013037827329bbc14f138c","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f667b231d5bb42d9aecf888d791385b1233f9a089426394c7034e6f6bed310af","cargo_embargo.json":"e200f93bdabf74e5724308b841b89c1b9a5ed638a4b6ada532d0694088dd9a9d","patches/LICENSE.patch":"409a83952ca6f4de11bc37cbee9bdf434235757598058a32c337986e126ebfdb","src/lib.rs":"463bca4afe4c0fea6ce7830f488bbd0f27de2f562142f97b28b817e45b6e3948","src/packet.rs":"eab4d6b3a0a78c49957e21e0dc91967373c0d5255e5234ce1a7b52dc96ed303a"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"c748789460616b91b39baad540bd90e3c686637d626410f7d22bee11b95ae0c5","Android.bp":"485bd6b1b5bb1a6073259dc8027b1adbb445ca120fb91ff95028bf8c035de87e","CHANGELOG.md":"6fead36c4f5c51f8b06ced5761221138b0771b2706313857d3951f78559d3cd9","Cargo.toml":"61a466819f736fab1ab35a3f824e280f6047effd599339d124aafc0d1a4f94b1","LICENSE":"d6e9a3aa5ff391bcbc73cbe06c3917ca0e317a4ef341f36c4522090cefb372dc","METADATA":"3a3445d3897c250e4474069e8a0723e3bea9cd41e4315211733e24266518cd44","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f667b231d5bb42d9aecf888d791385b1233f9a089426394c7034e6f6bed310af","cargo_embargo.json":"e200f93bdabf74e5724308b841b89c1b9a5ed638a4b6ada532d0694088dd9a9d","patches/LICENSE.patch":"409a83952ca6f4de11bc37cbee9bdf434235757598058a32c337986e126ebfdb","src/lib.rs":"463bca4afe4c0fea6ce7830f488bbd0f27de2f562142f97b28b817e45b6e3948","src/packet.rs":"eab4d6b3a0a78c49957e21e0dc91967373c0d5255e5234ce1a7b52dc96ed303a"}}
\ No newline at end of file
diff --git a/crates/virtio-vsock/.cargo-checksum.json b/crates/virtio-vsock/.cargo-checksum.json
index 8d823a3..9631022 100644
--- a/crates/virtio-vsock/.cargo-checksum.json
+++ b/crates/virtio-vsock/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"f341fb328e4af00a836d21c2995561326d420007fa10a2e7ed47ed1d82de1391","Cargo.toml":"0a04003f245edf959ac9857b49c9204f2f4ecda7f298c9c40fc64092504a4b87","README.md":"1726601da11c8cbab1079fba899a8b8d5750dab4d30bc4f62b79d2c15a11e343","src/lib.rs":"3d6bdbdf409a9a391f1a00cc4431c584b42b97fa6d8fb4ddaf558d5f0bf2afb7","src/packet.rs":"cc87e0c7aed52dc63d34c6eaf90b1b754e4b93cedf119c4d2fc644584753b6fd"},"package":"cac6563c0154c034d102324fc43cea7815140947217a418dce92c6797371c325"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"3c94654be1016de0394e468b967580bbfbd54ba60c8daff4ef82800e810a9865","Cargo.toml":"67226448e05b51207254bf68c0bef86ef8aa27f088047730471f439aa4a5722b","README.md":"1726601da11c8cbab1079fba899a8b8d5750dab4d30bc4f62b79d2c15a11e343","src/lib.rs":"3d6bdbdf409a9a391f1a00cc4431c584b42b97fa6d8fb4ddaf558d5f0bf2afb7","src/packet.rs":"cc87e0c7aed52dc63d34c6eaf90b1b754e4b93cedf119c4d2fc644584753b6fd"},"package":"f32bf3cad748b3004afe3afd860f060c4ec57f5ac329dd46f0b5bf8520244332"}
\ No newline at end of file
diff --git a/crates/virtio-vsock/Android.bp b/crates/virtio-vsock/Android.bp
index a64df92..0e77112 100644
--- a/crates/virtio-vsock/Android.bp
+++ b/crates/virtio-vsock/Android.bp
@@ -17,7 +17,7 @@
     name: "libvirtio_vsock",
     crate_name: "virtio_vsock",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.5.0",
+    cargo_pkg_version: "0.6.0",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
diff --git a/crates/virtio-vsock/CHANGELOG.md b/crates/virtio-vsock/CHANGELOG.md
index 0d94420..3e4220f 100644
--- a/crates/virtio-vsock/CHANGELOG.md
+++ b/crates/virtio-vsock/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Upcoming
 
+# v0.6.0
+
+## Changes
+
+- Update virtio-queue from 0.11.0 to 0.12.0.
+
 # v0.5.0
 
 ## Changes
diff --git a/crates/virtio-vsock/Cargo.toml b/crates/virtio-vsock/Cargo.toml
index 74210ab..a3c4eab 100644
--- a/crates/virtio-vsock/Cargo.toml
+++ b/crates/virtio-vsock/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2021"
 name = "virtio-vsock"
-version = "0.5.0"
+version = "0.6.0"
 authors = [
     "rust-vmm community",
     "rust-vmm AWS maintainers <[email protected]>",
@@ -31,13 +31,13 @@
 version = "0.2.2"
 
 [dependencies.virtio-queue]
-version = "0.11.0"
+version = "0.12.0"
 
 [dependencies.vm-memory]
 version = "0.14.0"
 
 [dev-dependencies.virtio-queue]
-version = "0.11.0"
+version = "0.12.0"
 features = ["test-utils"]
 
 [dev-dependencies.vm-memory]
diff --git a/crates/virtio-vsock/METADATA b/crates/virtio-vsock/METADATA
index c4365f5..71c17f9 100644
--- a/crates/virtio-vsock/METADATA
+++ b/crates/virtio-vsock/METADATA
@@ -1,17 +1,17 @@
 name: "virtio-vsock"
 description: "virtio vsock device implementation"
 third_party {
-  version: "0.5.0"
+  version: "0.6.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 2
-    day: 6
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/virtio-vsock"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/virtio-vsock/virtio-vsock-0.5.0.crate"
-    version: "0.5.0"
+    value: "https://static.crates.io/crates/virtio-vsock/virtio-vsock-0.6.0.crate"
+    version: "0.6.0"
   }
 }
diff --git a/crates/x509-cert/.android-checksum.json b/crates/x509-cert/.android-checksum.json
index 9d4547d..e67664d 100644
--- a/crates/x509-cert/.android-checksum.json
+++ b/crates/x509-cert/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"08efe45b1c528b0861eb82b40b18b7fcb92e94f6e46942531edd6d794f302b6d","Android.bp":"53cf5119ef15f62c35d011df9d045cb2296970378b307e093ade2ffec47df137","CHANGELOG.md":"1909bec3e617e195116b1499a92e7d82f900bcb5ecca68c69b38a656d94b6dd1","Cargo.toml":"ec99e4fa1cdfcd0068fc34c6d3cb3de2fb60e12fd24b488ceb1d2bdf79fc8455","LICENSE":"a70b9d6cc87b5937a78beace08f2370fd91d1d12b38f09c5d7e004ece883f9b6","LICENSE-APACHE":"a70b9d6cc87b5937a78beace08f2370fd91d1d12b38f09c5d7e004ece883f9b6","LICENSE-MIT":"6f853bf2cbee873e386d54aead5f9ac24173f5dd0666bbc6533962495935bd9f","METADATA":"8b5571e45893e5fba7ee414972b8f75518b09a47f249dea344d2cb875b68622a","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"cfbb7a4795d32dc807fed749c41a13f745e5936dc698235452cf9ea982ec04e5","cargo_embargo.json":"5a95c7f70a6263393974d388575a632347aeb706672c45664a3228ab78fe81c2","rules.mk":"b8adb139cddc201d52ef6d24c4222d6d2a30810dad2ca49de539bd04ae095e48","src/anchor.rs":"6bc92d3e68f6ba9bd9d3688d651e455f359ec7f2f62ac1b4f1f1f1f5c9c83337","src/attr.rs":"1d27c559517156672fc12ca0e7a38cd075db4e55341b08976bce554bd9c4db7c","src/builder.rs":"6bb11b8f95a013bdcf21c8ee9ec624da8126f402dc021ebe5ec0caa78c3449ec","src/certificate.rs":"847c2cc229e02fab606d4496d5449fce06aad99f69cb8b224c61331ced4a6587","src/crl.rs":"62aefab95d5943d54a3155f8ac73563f0fbe1947520958f4ee411b8973ea4e89","src/ext.rs":"98d1cd52285a79b16f0d68de778ac74165d084ce2e174f73798445f4270c9feb","src/ext/pkix.rs":"8b3c602a5d87dc93cde19cdae0972356cd4b2a6c4d3f21c8cbf25cb4a09220bc","src/ext/pkix/access.rs":"5dbc7d2d155d3cf200a2a0c57c7f0279c988018172f284d9240d85d8ba2322ca","src/ext/pkix/authkeyid.rs":"61f8053cb614cc1231f764b872652652daeec5ae1407d5b93e047add9535da50","src/ext/pkix/certpolicy.rs":"50ff6430b3450219f36df3438d80bc8ce7be467b06e8c9f39300563a8a8bf7ca","src/ext/pkix/constraints.rs":"8993d558880f382a876c365e2c2cbf632bc3a7abb3e3ac3a46fbe95d9a7beee2","src/ext/pkix/constraints/basic.rs":"b9c1de0725b2bb265187860aa99cbcd48595fd9390cca76ce1839b25c40f449e","src/ext/pkix/constraints/name.rs":"8348eca14eb954584b3bc19ad46cfef29acfe1d2827f81735e6cb4517aa956b5","src/ext/pkix/constraints/policy.rs":"85646bf33d969a6d3b8823ea770419bc9ef94eea93c8bc8203affb90e5fa4e00","src/ext/pkix/crl.rs":"cd703adf57ca4e9744420afa7f1e3947a4e3704a016f77398a33f5b4d6828c6b","src/ext/pkix/crl/dp.rs":"1d88e871eb9b76131dc6c85188fa07db68a5d4848f2f9c7420467bacfcfc827f","src/ext/pkix/keyusage.rs":"45023e818739b40d000fed3a241aedab52ec3a7d707d96b2892e406a3d9cfc1a","src/ext/pkix/name.rs":"65bcfa0e9858bee26af4d2f7cd19a404235af07456142daab2bd59dd4a5863ef","src/ext/pkix/name/dirstr.rs":"33fbbda1bdc27a468d091694e354c9e935911fd8c715cf0cce5af56219166044","src/ext/pkix/name/dp.rs":"4e6d17b6e1ad25f91cc9b3e96ad306b1f5fb029051c95540171e08d1801ee12a","src/ext/pkix/name/ediparty.rs":"ebe08d05b367b48d606b7f2cad14dde996dedf305ad8da683e690b7e75a2333d","src/ext/pkix/name/general.rs":"df774c141e3a5609fadbb7ad4080c34cc2077093c306c035202d9816469a216e","src/ext/pkix/name/other.rs":"68f42e4b290fd8cb42c81481dca16b04f07a985a86b4d469b87d920da2c59ed0","src/ext/pkix/policymap.rs":"9b5e6b6a4664b5fcafcc4669d98e3422993aa6a2601abb9e6d0ecd8762d1e800","src/lib.rs":"fcaad0a0655ffbafe6d542b119d3c66709aa12f883c8ac71ade51f6cf7431650","src/macros.rs":"510656a58db95b7568966285da2f59ffcf7dd907d4ff32c34b13af046172e28d","src/name.rs":"dab18acbf1e143c154301ada9f50dfc6b4cd10d3ceabcb03ff182198bcec2cc8","src/request.rs":"b5fe1a2660b1fab89e52e94a762fba696502ff760a0d355f757cf49cc987f4ab","src/serial_number.rs":"3a9b2ee179c329257089ca9a36380c82c593cfe115cfaab6c5c1037db68f7e18","src/time.rs":"af9ce954537d08197514e9f26de762cce745b17ef93d27cff33eacaadd8d2cbb","tests/builder.rs":"0b150cd9f419f7db1b54f2e43e6ea7bbf8c790ae80265e7ffb9f929325bf325d","tests/certificate.rs":"a1c895d0455ab3bcd019bf0ab6be6ac57ac9cd31f950157dea4146f75cc4f540","tests/certreq.rs":"fe11eb658f2b7ba8471046f8172077390f95d1ba0c20b56a1c87d232e1378463","tests/crl.rs":"a5dc9d90f3c29801350c26b0593eb121ce5457943ce542611dc2d720e9beb0ac","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.der":"75786e10feef22caf7b781b16153ca380c791bc90ba8eb121f5a3e815f43199d","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.pem":"ae81d0bbbd9165ee42710194d495c9353b001a7e7aada03a19c89b8fd6762e55","tests/examples/085B1E2F40254F9C7A2387BE9FF4EC116C326E10.fake.der":"d21f492c91bcc035bbc985f6e49ce87a3c325478bd2f1d87443614c0a7a8b57d","tests/examples/0954e2343dd5efe0a7f0967d69caf33e5f893720.der":"ffc05668f1ce0de35d8dfb37ba0644b188b496f01d24dd913f98eb32853c3e8b","tests/examples/0fcc78fbbca9f32b08b19b032b84f2c86a128f35.der":"52243877830bd0977abaca6de191eda543428e1313d3eb2b2834c7c1f04981bb","tests/examples/15b05c4865410c6b3ff76a4e8f3d87276756bd0c.der":"06fd0bbbbe0ec2911161e44ce32ffd479d37c90718bd0c0613a18171bc55b1c8","tests/examples/16ee54e48c76eaa1052e09010d8faefee95e5ebb.der":"5de01a2f495fe3462633adfc9ac8bb48b3bef561e313ba59c7c20997307140d2","tests/examples/2049a5b28f104b2c6e1a08546f9cfc0353d6fd30.der":"1d3f9c44697b504d9f0e67500f9fbeaab0d15f5524e64f89cca731d9eea77809","tests/examples/21723e7a0fb61a0bd4a29879b82a02b2fb4ad096.der":"735043a0604b36febf8a355972418b75d2c0ea2ce034ae5dd04adea79c0b20af","tests/examples/284A0A3A9B56DD752DAA2E09E2FADEDB858D9338.fake.der":"58285002e787c4745e78090cb2e436a26567887cf53187d4743f276ad704f2d1","tests/examples/28879DABB0FD11618FB74E47BE049D2933866D53.fake.der":"b01dc4763a311fdd96792d37f299c579f3562c672d9657159b206b52616fb623","tests/examples/288C8BCFEE6B89D110DAE2C9873897BF7FF53382.fake.der":"cfc9e7c1dcecd1d6451ab66f9838cc42087f98145f5c4e861cef8e9d198cf9e2","tests/examples/28903a635b5280fae6774c0b6da7d6baa64af2e8.der":"12919c7d67791a0e098e1ee587dc9770231eda6d0da2d512770a0a06b5ef639a","tests/examples/33D8388EDA1E92475EF19075D2EF4093D1CB6F7F.fake.der":"40a08b6bfc6808c1c84a3d6983949dbc5645d111c6aa4f2204ff5542edd39c0b","tests/examples/342cd9d3062da48c346965297f081ebc2ef68fdc.der":"405b4073c9555ff756128f108ddd82d91d9064c0ca9779ed879868a8a133cd6c","tests/examples/554D5FF11DA613A155584D8D4AA07F67724D8077.fake.der":"03324299002e5e1cc88b7ff0062f11554dc396fc18c14b0cca7559a69169f752","tests/examples/GoodCACRL.crl":"0545facc2cb39c8d8fc7ce70f4273b358e522a47fd7a1cdf64f7de2edb34d3aa","tests/examples/GoodCACert.crt":"fac99bf58934b7123b28cbb7996e412cbee7e52c496b54342cd7340309fe3e1d","tests/examples/amazon.der":"2f29cc3f99fd2174688baaece457ac193198c63e0840ad0c79f86240dd3af98e","tests/examples/amazon.pem":"794290f965510d52a2ae4592607cb1c7755f273448249cb6da53ebfb484bde38","tests/examples/crates.io-chain.pem":"04a2052fbe76e2078d0703c26d84f104080263d4ec9653629bf7e48373e64c1a","tests/examples/eca.der":"802c8187d5ddccd8338992f64c7b06f93ac8fd40b0baa94109d59ff69f5aec91","tests/examples/eca_policies.ta":"c1f09b4967382945d9903d9cf7f4a7805523f39d02f0d06448361c893e2cd389","tests/examples/entrust.der":"ba2b9abeb461886a7694cc69900588873390a196ee990a04c924303c9286ca70","tests/examples/entrust_dnConstraint.ta":"b024896247b39b35907d8b6d8d13b44cd7677368989f021b82d3030e9373197d","tests/examples/exostar.der":"54a832e3884cffb2d0a8a7b2f0229b055056605b799d18b91259001cd6b4f7c5","tests/examples/exostar_policyFlags.ta":"ae4628b0855d1ebd56e50d59f03df97d8ee866aa0c7144134531acdcc6783256","tests/examples/p256-priv.der":"d59088d2ee7ae348a2004e1b68310cbb578bdb55d6dfcc818d3d2db5a6fac41c","tests/examples/p256-pub.der":"ab6440b4b3b9de11add8399ed3ace375998b699e98a6a866e64cb153e6e4ed02","tests/examples/qualcomm.pem":"65a9088c4005f63ea7bc2be4974c55fd9b0362915d806f00eb728f2b30dd01da","tests/examples/raytheon.der":"100b1620083fd0132b8a84f9f388556e8b2db071bdcff6e8fc2635c34bdeb8aa","tests/examples/raytheon_pathLenConstraint.ta":"cd7aac4eca47245f84d3716d39d5f22e0fe1e7f5d867289ce19e34394743d3c9","tests/examples/rsa2048-crt.der":"71ec02da3c975c35a3bffaf8207563930af6a2a4cce77893739a6a194b537560","tests/examples/rsa2048-crt.pem":"3296eab83df1a45b39d5f31247ae13378b0304db1b43592406ef801fe138aab6","tests/examples/rsa2048-csr.der":"9f8bd4b70808b133c510294647dd79bcdf9a1ca473bb9040a5d54a80fa764d42","tests/examples/rsa2048-csr.pem":"70007309164b32603e7f6803ed95a5ae90b780bec64eb8c94c38b1188b5e4525","tests/examples/rsa2048-priv.der":"2e3d02886556a2dc878dd7a77ada1da31ccfccf2bf7e9a7bd95a8af2e69a6a90","tests/examples/rsa2048-prv.der":"b2990cf58ec751a094b322a1d83da5ca872a4da703e843210c38867d6ac8962f","tests/examples/rsa2048-prv.pem":"8a7b693904789775feba3d1f359777e0d260a61a3ebb6ce5d9fa03d7aab2c0c5","tests/examples/rsa2048-pub.der":"ae8610c59ff00fa33560b51c864fe2cc9fa894448cc23a9829cd9b0e97477f02","tests/examples/tscpbcasha256.crl":"d65fda5694a4f1ef96634e132745bf027ddb6a7389d5f859081675a66dfb7dcb","tests/general_name.rs":"365c44f393415793f227a91742416ee4a7aa4e28642f2a7dba1132fee226c8b6","tests/name.rs":"e751de20cddfd5d85ffdd44ba4b7d6124007ef6ba6ea3c24352973170f846cf6","tests/pkix_extensions.rs":"14b9641ed252ea141a325c91072de936a763174ac95649185a9a782363ff25a8","tests/trust_anchor_format.rs":"c897b75bc08e23871fc8fb1d411a3534346edf7e2b705369fff7e9098f71e910","tests/validity.rs":"9a5b74e2d0e6846434356d7091100c337ced43575430dc15e975e6858e957c62"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"4450696ae6ab5f1a7acbf231d29ff4499b76ec5aeafaaada91d9b37017aa7585","Android.bp":"c00f891a3965f596d462e64da0f30780d8e3252f44a7166cd394de8506c20a61","CHANGELOG.md":"69350a877f33e45fd0ee86ac5436f70c9fcb8f69259029307f110ab0b1c73253","Cargo.toml":"30fe6e7745b6594a36e53d3ecbb107e4748b137ad3e4f952443c1a3a84806645","LICENSE":"a70b9d6cc87b5937a78beace08f2370fd91d1d12b38f09c5d7e004ece883f9b6","LICENSE-APACHE":"a70b9d6cc87b5937a78beace08f2370fd91d1d12b38f09c5d7e004ece883f9b6","LICENSE-MIT":"6f853bf2cbee873e386d54aead5f9ac24173f5dd0666bbc6533962495935bd9f","METADATA":"658d190d7a0ea0ec4cb2542ea502da49423cf1aeea1d5f136f2b00b6ddd77d42","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"cfbb7a4795d32dc807fed749c41a13f745e5936dc698235452cf9ea982ec04e5","cargo_embargo.json":"5a95c7f70a6263393974d388575a632347aeb706672c45664a3228ab78fe81c2","rules.mk":"b8adb139cddc201d52ef6d24c4222d6d2a30810dad2ca49de539bd04ae095e48","src/anchor.rs":"6bc92d3e68f6ba9bd9d3688d651e455f359ec7f2f62ac1b4f1f1f1f5c9c83337","src/attr.rs":"1d27c559517156672fc12ca0e7a38cd075db4e55341b08976bce554bd9c4db7c","src/builder.rs":"8638f72af1bc3eca4ae4560ce7276b4df62c30324e80d4c6675adab7533e2bf0","src/certificate.rs":"847c2cc229e02fab606d4496d5449fce06aad99f69cb8b224c61331ced4a6587","src/crl.rs":"62aefab95d5943d54a3155f8ac73563f0fbe1947520958f4ee411b8973ea4e89","src/ext.rs":"98d1cd52285a79b16f0d68de778ac74165d084ce2e174f73798445f4270c9feb","src/ext/pkix.rs":"59e7d6c86147dfaac6aa88ae97fd74f7cd5a7c3139b41e15481496a2e2e4dca2","src/ext/pkix/access.rs":"5dbc7d2d155d3cf200a2a0c57c7f0279c988018172f284d9240d85d8ba2322ca","src/ext/pkix/authkeyid.rs":"61f8053cb614cc1231f764b872652652daeec5ae1407d5b93e047add9535da50","src/ext/pkix/certpolicy.rs":"50ff6430b3450219f36df3438d80bc8ce7be467b06e8c9f39300563a8a8bf7ca","src/ext/pkix/constraints.rs":"8993d558880f382a876c365e2c2cbf632bc3a7abb3e3ac3a46fbe95d9a7beee2","src/ext/pkix/constraints/basic.rs":"b9c1de0725b2bb265187860aa99cbcd48595fd9390cca76ce1839b25c40f449e","src/ext/pkix/constraints/name.rs":"8348eca14eb954584b3bc19ad46cfef29acfe1d2827f81735e6cb4517aa956b5","src/ext/pkix/constraints/policy.rs":"85646bf33d969a6d3b8823ea770419bc9ef94eea93c8bc8203affb90e5fa4e00","src/ext/pkix/crl.rs":"cd703adf57ca4e9744420afa7f1e3947a4e3704a016f77398a33f5b4d6828c6b","src/ext/pkix/crl/dp.rs":"1d88e871eb9b76131dc6c85188fa07db68a5d4848f2f9c7420467bacfcfc827f","src/ext/pkix/keyusage.rs":"45023e818739b40d000fed3a241aedab52ec3a7d707d96b2892e406a3d9cfc1a","src/ext/pkix/name.rs":"65bcfa0e9858bee26af4d2f7cd19a404235af07456142daab2bd59dd4a5863ef","src/ext/pkix/name/dirstr.rs":"33fbbda1bdc27a468d091694e354c9e935911fd8c715cf0cce5af56219166044","src/ext/pkix/name/dp.rs":"4e6d17b6e1ad25f91cc9b3e96ad306b1f5fb029051c95540171e08d1801ee12a","src/ext/pkix/name/ediparty.rs":"ebe08d05b367b48d606b7f2cad14dde996dedf305ad8da683e690b7e75a2333d","src/ext/pkix/name/general.rs":"d4b691503fedf3efac4af09a374eb5e48cef5d1f70a5d4e5549129f43ed24e8e","src/ext/pkix/name/other.rs":"bece63704232359568424cfea04c9b8b57151adcc031d77b777a5ede9cb82540","src/ext/pkix/policymap.rs":"9b5e6b6a4664b5fcafcc4669d98e3422993aa6a2601abb9e6d0ecd8762d1e800","src/ext/pkix/sct.rs":"34710fc07e463f4193e2d8697574d3a6649888f7ddc50c84d9d48ba25d322f1b","src/lib.rs":"fcaad0a0655ffbafe6d542b119d3c66709aa12f883c8ac71ade51f6cf7431650","src/macros.rs":"510656a58db95b7568966285da2f59ffcf7dd907d4ff32c34b13af046172e28d","src/name.rs":"a0a861483a68ac189575a4a0874474ceaf50e89d924b1eadcd3c6e2f1ed527e3","src/request.rs":"b5fe1a2660b1fab89e52e94a762fba696502ff760a0d355f757cf49cc987f4ab","src/serial_number.rs":"e4f2d5248771d488204caa23c81b2e275cbf485546f381513c5e13f58f37147b","src/time.rs":"af9ce954537d08197514e9f26de762cce745b17ef93d27cff33eacaadd8d2cbb","tests/builder.rs":"5342a6864281376f67ae4a390b32c76c97d361a622e9495108a47f53e9524005","tests/certificate.rs":"eefc0a2967f9664380c9020c20e5812e997dd48d3d0c82b308f9cda48c54fcd9","tests/certreq.rs":"fe11eb658f2b7ba8471046f8172077390f95d1ba0c20b56a1c87d232e1378463","tests/crl.rs":"a5dc9d90f3c29801350c26b0593eb121ce5457943ce542611dc2d720e9beb0ac","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.der":"75786e10feef22caf7b781b16153ca380c791bc90ba8eb121f5a3e815f43199d","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.pem":"ae81d0bbbd9165ee42710194d495c9353b001a7e7aada03a19c89b8fd6762e55","tests/examples/085B1E2F40254F9C7A2387BE9FF4EC116C326E10.fake.der":"d21f492c91bcc035bbc985f6e49ce87a3c325478bd2f1d87443614c0a7a8b57d","tests/examples/0954e2343dd5efe0a7f0967d69caf33e5f893720.der":"ffc05668f1ce0de35d8dfb37ba0644b188b496f01d24dd913f98eb32853c3e8b","tests/examples/0fcc78fbbca9f32b08b19b032b84f2c86a128f35.der":"52243877830bd0977abaca6de191eda543428e1313d3eb2b2834c7c1f04981bb","tests/examples/15b05c4865410c6b3ff76a4e8f3d87276756bd0c.der":"06fd0bbbbe0ec2911161e44ce32ffd479d37c90718bd0c0613a18171bc55b1c8","tests/examples/16ee54e48c76eaa1052e09010d8faefee95e5ebb.der":"5de01a2f495fe3462633adfc9ac8bb48b3bef561e313ba59c7c20997307140d2","tests/examples/2049a5b28f104b2c6e1a08546f9cfc0353d6fd30.der":"1d3f9c44697b504d9f0e67500f9fbeaab0d15f5524e64f89cca731d9eea77809","tests/examples/21723e7a0fb61a0bd4a29879b82a02b2fb4ad096.der":"735043a0604b36febf8a355972418b75d2c0ea2ce034ae5dd04adea79c0b20af","tests/examples/284A0A3A9B56DD752DAA2E09E2FADEDB858D9338.fake.der":"58285002e787c4745e78090cb2e436a26567887cf53187d4743f276ad704f2d1","tests/examples/28879DABB0FD11618FB74E47BE049D2933866D53.fake.der":"b01dc4763a311fdd96792d37f299c579f3562c672d9657159b206b52616fb623","tests/examples/288C8BCFEE6B89D110DAE2C9873897BF7FF53382.fake.der":"cfc9e7c1dcecd1d6451ab66f9838cc42087f98145f5c4e861cef8e9d198cf9e2","tests/examples/28903a635b5280fae6774c0b6da7d6baa64af2e8.der":"12919c7d67791a0e098e1ee587dc9770231eda6d0da2d512770a0a06b5ef639a","tests/examples/33D8388EDA1E92475EF19075D2EF4093D1CB6F7F.fake.der":"40a08b6bfc6808c1c84a3d6983949dbc5645d111c6aa4f2204ff5542edd39c0b","tests/examples/342cd9d3062da48c346965297f081ebc2ef68fdc.der":"405b4073c9555ff756128f108ddd82d91d9064c0ca9779ed879868a8a133cd6c","tests/examples/554D5FF11DA613A155584D8D4AA07F67724D8077.fake.der":"03324299002e5e1cc88b7ff0062f11554dc396fc18c14b0cca7559a69169f752","tests/examples/GoodCACRL.crl":"0545facc2cb39c8d8fc7ce70f4273b358e522a47fd7a1cdf64f7de2edb34d3aa","tests/examples/GoodCACert.crt":"fac99bf58934b7123b28cbb7996e412cbee7e52c496b54342cd7340309fe3e1d","tests/examples/amazon.der":"2f29cc3f99fd2174688baaece457ac193198c63e0840ad0c79f86240dd3af98e","tests/examples/amazon.pem":"794290f965510d52a2ae4592607cb1c7755f273448249cb6da53ebfb484bde38","tests/examples/crates.io-chain.pem":"04a2052fbe76e2078d0703c26d84f104080263d4ec9653629bf7e48373e64c1a","tests/examples/eca.der":"802c8187d5ddccd8338992f64c7b06f93ac8fd40b0baa94109d59ff69f5aec91","tests/examples/eca_policies.ta":"c1f09b4967382945d9903d9cf7f4a7805523f39d02f0d06448361c893e2cd389","tests/examples/entrust.der":"ba2b9abeb461886a7694cc69900588873390a196ee990a04c924303c9286ca70","tests/examples/entrust_dnConstraint.ta":"b024896247b39b35907d8b6d8d13b44cd7677368989f021b82d3030e9373197d","tests/examples/exostar.der":"54a832e3884cffb2d0a8a7b2f0229b055056605b799d18b91259001cd6b4f7c5","tests/examples/exostar_policyFlags.ta":"ae4628b0855d1ebd56e50d59f03df97d8ee866aa0c7144134531acdcc6783256","tests/examples/p256-priv.der":"d59088d2ee7ae348a2004e1b68310cbb578bdb55d6dfcc818d3d2db5a6fac41c","tests/examples/p256-pub.der":"ab6440b4b3b9de11add8399ed3ace375998b699e98a6a866e64cb153e6e4ed02","tests/examples/qualcomm.pem":"65a9088c4005f63ea7bc2be4974c55fd9b0362915d806f00eb728f2b30dd01da","tests/examples/raytheon.der":"100b1620083fd0132b8a84f9f388556e8b2db071bdcff6e8fc2635c34bdeb8aa","tests/examples/raytheon_pathLenConstraint.ta":"cd7aac4eca47245f84d3716d39d5f22e0fe1e7f5d867289ce19e34394743d3c9","tests/examples/rsa2048-crt.der":"71ec02da3c975c35a3bffaf8207563930af6a2a4cce77893739a6a194b537560","tests/examples/rsa2048-crt.pem":"3296eab83df1a45b39d5f31247ae13378b0304db1b43592406ef801fe138aab6","tests/examples/rsa2048-csr.der":"9f8bd4b70808b133c510294647dd79bcdf9a1ca473bb9040a5d54a80fa764d42","tests/examples/rsa2048-csr.pem":"70007309164b32603e7f6803ed95a5ae90b780bec64eb8c94c38b1188b5e4525","tests/examples/rsa2048-priv.der":"2e3d02886556a2dc878dd7a77ada1da31ccfccf2bf7e9a7bd95a8af2e69a6a90","tests/examples/rsa2048-prv.der":"b2990cf58ec751a094b322a1d83da5ca872a4da703e843210c38867d6ac8962f","tests/examples/rsa2048-prv.pem":"8a7b693904789775feba3d1f359777e0d260a61a3ebb6ce5d9fa03d7aab2c0c5","tests/examples/rsa2048-pub.der":"ae8610c59ff00fa33560b51c864fe2cc9fa894448cc23a9829cd9b0e97477f02","tests/examples/tscpbcasha256.crl":"d65fda5694a4f1ef96634e132745bf027ddb6a7389d5f859081675a66dfb7dcb","tests/general_name.rs":"365c44f393415793f227a91742416ee4a7aa4e28642f2a7dba1132fee226c8b6","tests/name.rs":"e751de20cddfd5d85ffdd44ba4b7d6124007ef6ba6ea3c24352973170f846cf6","tests/pkix_extensions.rs":"b62c295181af15be496b1951547dad88821037f09cdd5d85f73ac9d192745627","tests/trust_anchor_format.rs":"c897b75bc08e23871fc8fb1d411a3534346edf7e2b705369fff7e9098f71e910","tests/validity.rs":"9a5b74e2d0e6846434356d7091100c337ced43575430dc15e975e6858e957c62"}}
\ No newline at end of file
diff --git a/crates/x509-cert/.cargo-checksum.json b/crates/x509-cert/.cargo-checksum.json
index 4caf555..c0260d5 100644
--- a/crates/x509-cert/.cargo-checksum.json
+++ b/crates/x509-cert/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"043e0aa12a2234d83a6275b3c441ad4a20e35b69573f1ab0bc9807328386c0c6","Cargo.toml":"8eac04d64bf333868cda728353223b88b99a3a0c2c13a2bcccee688d8acc6002","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"90c503b61dee04e1449c323ec34c229dfb68d7adcb96c7e140ee55f70fce2d8e","README.md":"134e595199609f93ce701855a28deb5f8efd499cce90d14f8d7eacf07df5dd81","src/anchor.rs":"6ecb9d5fd0dbf4d11259ca84b4b0401176dbe6f48015fe3cf5f2e298cad030f3","src/attr.rs":"4e4a3f0c6fb9e6f0b18f2bd2b9823292058348d5232ee9c0252cb9a7666795a6","src/builder.rs":"6983c82f49fd66ea7fe88b02d1568f22dfa977c4e727b238f05be16cfef781d8","src/certificate.rs":"68808361a48741be9e1c16aff98581b35761f81debb5aa97679d124485e3ca51","src/crl.rs":"77edbb79548f8eaecb088752f7ecb3a28cb81345d64c25eaee5f4255a37a6784","src/ext.rs":"b867b7c0fbff7499749cc272e332cbb7407888aaf36407e0e68800d1ce59d037","src/ext/pkix.rs":"5c97e5fdaf578278fd001e41ed27be557dc31f1ea0aa909a0d655919c09b974f","src/ext/pkix/access.rs":"ff64cb248ff3932b74ebf7eab2b69fa51b7ca238e68f85a15c59155ccb983e7e","src/ext/pkix/authkeyid.rs":"cd12ce35614d27768856a3899ee905ea4141d335606f5d7ab42e22853751a4bc","src/ext/pkix/certpolicy.rs":"2be7db88e52a448a33818d9383b6d7ef07eb5d52c98316fcb0ac9fb1b9773948","src/ext/pkix/constraints.rs":"68fe4071e21306b6c74c6ee28c61dec946bbc681766b2d33be22891a49c95e44","src/ext/pkix/constraints/basic.rs":"9dd80d33f24f4d9ca6d2bc6077a2b90b15edc639a76abada509d0e098a8b3493","src/ext/pkix/constraints/name.rs":"6f6852652507c8a742c6e0d4289ed32e67c795b9e183a27a85b90b0d51825a98","src/ext/pkix/constraints/policy.rs":"2d9fcebc0cac3d26404e9a675e015dc926938eda81bd87e8c34163a245109541","src/ext/pkix/crl.rs":"7d02db6ddda693722270ead960029a0a7ad4156bf905a01d50104114413cbf59","src/ext/pkix/crl/dp.rs":"239f8de74b6ce65595ff2c547e80112b534d3dc20d66d1de72fc9a620cf40d3b","src/ext/pkix/keyusage.rs":"8f717b7f1520d554acf75674b69575bf7665b193cb6253090af941f0a953684d","src/ext/pkix/name.rs":"945dc3a845b8eeae8f2340c786344c780d80493b7b263a1a78592f61493e5d47","src/ext/pkix/name/dirstr.rs":"9d3a9d2f771e3c2d96653a0976471f029b17c936415ce1057f937a79b2e3e4eb","src/ext/pkix/name/dp.rs":"c3e84d12459b490a8a6ea27716909cbe5429de0902b24f63f69cc93e45d40939","src/ext/pkix/name/ediparty.rs":"8d7dff42927ac368b859c70a4755e9661da620dbe5374540073955dc9f00164c","src/ext/pkix/name/general.rs":"16dafa78b1cbb2aef5988aea86441243b58775a75e6f371b5d41eaf0f7218eb5","src/ext/pkix/name/other.rs":"194184079c7f7829b578736fdcdf3c6329286fb0ba261fc366b814c05d8bd0aa","src/ext/pkix/policymap.rs":"c3b2298900fce5228c8ab06cca06577caa676686839ddea9a9bc0ab223a6aa4f","src/lib.rs":"2ad71e3cdc9460898d16a824227e19d83cf60d69e563bc7f9f58fb47aecacadf","src/macros.rs":"3104401b4acb01238ee2bd6c3575b49504d1b03e89f12b4c8e7b577af6cff60b","src/name.rs":"c0428f5e6086cae97dae5a89e701cde44846292f756fe9d272c1313177700100","src/request.rs":"133ee2462510669b7d0610a80d76f688d55cc49a1e7d9bc798e0ec7d35c569b8","src/serial_number.rs":"dc1e94157364394ca97549fbff0cc35d11892c99ccc681383f77492cb6b6c840","src/time.rs":"655ccced65bd97279f2a8b5bece32f282c3189f808770fe75a76e9ece1bfaeb0","tests/builder.rs":"367ffa3c941a4c8e2b830a40978dc796463e503dea62d05708d0bf6873fc33df","tests/certificate.rs":"c752993d956cfebd74a7b5d8ba5e04626cd6983b7bf10c1688abd32af9fb63eb","tests/certreq.rs":"ef3dcaef71ed0cd0f391e820627c5c622df2bc75f3a636a6ff1a9a5d71478962","tests/crl.rs":"9620abb796c47c6931146b66d7840803375afb9ef2969b3007c1c3054c39d1c2","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.der":"d6c5bdce158bad5f5107441cb2bbe42adfa7bee7c6ccf369b68c993315be04b8","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.pem":"b152f44a300694af28b3dd7416d3bc1ffce028dab5e5633b3623548b10f63a76","tests/examples/085B1E2F40254F9C7A2387BE9FF4EC116C326E10.fake.der":"321f8f032322e8933279bcff4a5e86780eb58286edd68d99d1f91394450dd760","tests/examples/0954e2343dd5efe0a7f0967d69caf33e5f893720.der":"0b57e9180fc8f1b466a2421069d232cf45596106f83e6fd19621caea183f1cf6","tests/examples/0fcc78fbbca9f32b08b19b032b84f2c86a128f35.der":"6061f773354cd2ed5613a094ab0e8270d5c2479932b42dfda727db83febd18b8","tests/examples/15b05c4865410c6b3ff76a4e8f3d87276756bd0c.der":"f74da4d9a687c5046499aefc9fa867de91a1a3941a09f24cf94603b7ab78108a","tests/examples/16ee54e48c76eaa1052e09010d8faefee95e5ebb.der":"7e32368e24a2cc48d3d29e883b260e40ceda22af97189c78fc5b928484e9a010","tests/examples/2049a5b28f104b2c6e1a08546f9cfc0353d6fd30.der":"ec0cbf1b122d440981788e57ef55fc7e0ca556126b476f865a1418e1273f5993","tests/examples/21723e7a0fb61a0bd4a29879b82a02b2fb4ad096.der":"6c03a6b5b01df504e5af7886e6bceb77e14d09f07f42e397952783b9cea38c6a","tests/examples/284A0A3A9B56DD752DAA2E09E2FADEDB858D9338.fake.der":"a7358a8665442cfc8d96d1525954b3376d8222c0c0c34189f73f8b2b097ecb4f","tests/examples/28879DABB0FD11618FB74E47BE049D2933866D53.fake.der":"d60ff530d5cf57b8338ef30c8396414f0736e74ead47a0d49c8b28eafa05158f","tests/examples/288C8BCFEE6B89D110DAE2C9873897BF7FF53382.fake.der":"40317ddec0b0c91f14043a8263a74c8548de13d30b4afd6730228a1cb0ae1572","tests/examples/28903a635b5280fae6774c0b6da7d6baa64af2e8.der":"88497f01602f3154246ae28c4d5aef10f1d87ebb76626f4ae0b7f95ba7968799","tests/examples/33D8388EDA1E92475EF19075D2EF4093D1CB6F7F.fake.der":"6fac22b428f1b8d4cf83f203e2e6d1a0c98bb5741cae9982267f75f589158c0a","tests/examples/342cd9d3062da48c346965297f081ebc2ef68fdc.der":"5e3571f33f45a7df1537a68b5ffb9e036af9d2f5bc4c9717130dc43d7175aac7","tests/examples/554D5FF11DA613A155584D8D4AA07F67724D8077.fake.der":"4ec4474a86383ab4a0979ad9bb453a8608c1eb3379aba82ca856f527dfcd25b1","tests/examples/GoodCACRL.crl":"d78e5eca421f082f55bf1c25ddf697111be3eeee0d395e339f1b97711ee2b496","tests/examples/GoodCACert.crt":"86d218374763fce77d5b2b45398db48f10e553da1875be7d6103085baca0343f","tests/examples/amazon.der":"5bf3d7e0e6927f773d5106c822c53f6f52c199f7eb1b3b8154b41f2924391c75","tests/examples/amazon.pem":"3b2d6d64e99ec971a1d4455cd6743c8f43e1829ef1f7764199242414960697fd","tests/examples/crates.io-chain.pem":"7bb36476e05b7f5431893bd27373cd17d616a5925aab75e116bd92849238912b","tests/examples/eca.der":"343ff530f246b00c71616a5d42541d551114baf74b7f786c7b42527586c6b22a","tests/examples/eca_policies.ta":"18f040c9e6cffbc36f6e3ff398b6f8797dfbd82717f2c88020be260c0d398ce0","tests/examples/entrust.der":"32e407c73121bf961287e9ccc7110a54f5c90e1e3ccf9f10478b36813fb54ae9","tests/examples/entrust_dnConstraint.ta":"c8bce2bf5424794450ce6a6137590beb1409bd732eaec29370986bc22e82e59b","tests/examples/exostar.der":"b63d71c64784857fc0677f634e7bc9bd0b2b1963f3272317a0406f8746cb9477","tests/examples/exostar_policyFlags.ta":"8927c86016bf1db45421bc497333f2306417b82b852f122582a3820a47084a1d","tests/examples/p256-priv.der":"8125ab208d2181ed3ef05ff0ab1906e5898c36a858277e5b987e78e505288769","tests/examples/p256-pub.der":"b9968d56ed8d6aa3fb43b15fa01e355d7a3a0203b1408b3fd2733637c4d1642c","tests/examples/qualcomm.pem":"4ec6058239c3589ab450c6cae9a4415cff429dfdc9490c35d9f022d03d1a6a82","tests/examples/raytheon.der":"d85ae3f67b0acf316829a02cec624b50f76732ca5c503fce4f53b64a168aa94c","tests/examples/raytheon_pathLenConstraint.ta":"08c8480329fb3fb9e73540c0d7e288b12025ddc7a4bd17ffe8085c33006034ea","tests/examples/rsa2048-crt.der":"283b2e3824ea47fb1556cccb1898eadcecf1adadfcf0782ba41ad7122a213568","tests/examples/rsa2048-crt.pem":"e443351100f1b9acd798f878d5e6266f40265179e7b47933f0e250b75069fdd8","tests/examples/rsa2048-csr.der":"f22da04d95947d3c42a4d1619af70097cd38d0156af5ad31f53c044776c4e909","tests/examples/rsa2048-csr.pem":"c58ca6cd37b4f2f7beb6eb184a26e6819ae650f03abeaf6efa50fa55e54e0b43","tests/examples/rsa2048-priv.der":"f94b60300e4877e863b2bea8d5c366a90432794454c05e0ec098ddbf96263614","tests/examples/rsa2048-prv.der":"2ce481dc184e82f43ff3b5fe2b8cdd2a9113c76f35e2c34e070c6706f73ad09d","tests/examples/rsa2048-prv.pem":"22a248487fb9602d223844cba1993ebf53e701287675e9446c95d38867604b17","tests/examples/rsa2048-pub.der":"efeda9bfead9fd0594f6a5cf6fdf6c163116a3b1fad6d73cea05295b68fd1794","tests/examples/tscpbcasha256.crl":"f7759eefacb39ae86931780a6aafad162b5cd57209d1cf283876296dfb5f06e7","tests/general_name.rs":"fee62078996ccb4440133de1909dfc35519f9d9e4aca3c2262c120bbc44d7bce","tests/name.rs":"ced4a3a0991f3523ffbb67b1c495378b19254a547160ed3b80111ac2f700dd94","tests/pkix_extensions.rs":"d0bd2d522bd9a71647f6d3469882a9e1a7bd95da6f826eb880adfaafb43c2b86","tests/trust_anchor_format.rs":"cd6d88262debb8690efd7e2b213442de5ac02cd408ca1125fcd7607577b90647","tests/validity.rs":"687e1c549a250ab6384578e0d31637c932aaf1d6f990c1d5ff3e2163d50ef97e"},"package":"25eefca1d99701da3a57feb07e5079fc62abba059fc139e98c13bbb250f3ef29"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"b181c64efd3e0df95b5b93b6c089aa92bdc81810fde02b752e9cea247d4c7c59","Cargo.toml":"fdcf27b202c4f2008053a6bfa487bbadfd293b00cd9734c818dad3092010aeda","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"90c503b61dee04e1449c323ec34c229dfb68d7adcb96c7e140ee55f70fce2d8e","README.md":"134e595199609f93ce701855a28deb5f8efd499cce90d14f8d7eacf07df5dd81","src/anchor.rs":"6ecb9d5fd0dbf4d11259ca84b4b0401176dbe6f48015fe3cf5f2e298cad030f3","src/attr.rs":"4e4a3f0c6fb9e6f0b18f2bd2b9823292058348d5232ee9c0252cb9a7666795a6","src/builder.rs":"efe4effadef8ac0d05f2015d7cc1ceb1ec61ce3cc17b3ddf42cfe10c7fd526a6","src/certificate.rs":"68808361a48741be9e1c16aff98581b35761f81debb5aa97679d124485e3ca51","src/crl.rs":"77edbb79548f8eaecb088752f7ecb3a28cb81345d64c25eaee5f4255a37a6784","src/ext.rs":"b867b7c0fbff7499749cc272e332cbb7407888aaf36407e0e68800d1ce59d037","src/ext/pkix.rs":"fb1f05395b751802774fcaaa2bbe73ab1ec8a39a4456823d424834f26e270fb7","src/ext/pkix/access.rs":"ff64cb248ff3932b74ebf7eab2b69fa51b7ca238e68f85a15c59155ccb983e7e","src/ext/pkix/authkeyid.rs":"cd12ce35614d27768856a3899ee905ea4141d335606f5d7ab42e22853751a4bc","src/ext/pkix/certpolicy.rs":"2be7db88e52a448a33818d9383b6d7ef07eb5d52c98316fcb0ac9fb1b9773948","src/ext/pkix/constraints.rs":"68fe4071e21306b6c74c6ee28c61dec946bbc681766b2d33be22891a49c95e44","src/ext/pkix/constraints/basic.rs":"9dd80d33f24f4d9ca6d2bc6077a2b90b15edc639a76abada509d0e098a8b3493","src/ext/pkix/constraints/name.rs":"6f6852652507c8a742c6e0d4289ed32e67c795b9e183a27a85b90b0d51825a98","src/ext/pkix/constraints/policy.rs":"2d9fcebc0cac3d26404e9a675e015dc926938eda81bd87e8c34163a245109541","src/ext/pkix/crl.rs":"7d02db6ddda693722270ead960029a0a7ad4156bf905a01d50104114413cbf59","src/ext/pkix/crl/dp.rs":"239f8de74b6ce65595ff2c547e80112b534d3dc20d66d1de72fc9a620cf40d3b","src/ext/pkix/keyusage.rs":"8f717b7f1520d554acf75674b69575bf7665b193cb6253090af941f0a953684d","src/ext/pkix/name.rs":"945dc3a845b8eeae8f2340c786344c780d80493b7b263a1a78592f61493e5d47","src/ext/pkix/name/dirstr.rs":"9d3a9d2f771e3c2d96653a0976471f029b17c936415ce1057f937a79b2e3e4eb","src/ext/pkix/name/dp.rs":"c3e84d12459b490a8a6ea27716909cbe5429de0902b24f63f69cc93e45d40939","src/ext/pkix/name/ediparty.rs":"8d7dff42927ac368b859c70a4755e9661da620dbe5374540073955dc9f00164c","src/ext/pkix/name/general.rs":"36dc7f461ddea25278d68b6ddb46b2d89456debc2dfdb75be52261ded2f8f8bb","src/ext/pkix/name/other.rs":"efa2c11e0c7619e5b11beda823730bcf3c9deeeac16ab3d9b5a62951d9f0fc3b","src/ext/pkix/policymap.rs":"c3b2298900fce5228c8ab06cca06577caa676686839ddea9a9bc0ab223a6aa4f","src/ext/pkix/sct.rs":"3c138094e5a0a01ac2de3a2bc6cd15d60fc6687f04fa9cf853088faed7ff11e0","src/lib.rs":"2ad71e3cdc9460898d16a824227e19d83cf60d69e563bc7f9f58fb47aecacadf","src/macros.rs":"3104401b4acb01238ee2bd6c3575b49504d1b03e89f12b4c8e7b577af6cff60b","src/name.rs":"cb7579e953b0109602e2252f9683cb32f28d3208f2af8abfadb498866b73bad0","src/request.rs":"133ee2462510669b7d0610a80d76f688d55cc49a1e7d9bc798e0ec7d35c569b8","src/serial_number.rs":"01f4c4abdf341b01128745f4c7fbb369f0317ba2dff5925ccf1bbbf7c254d54c","src/time.rs":"655ccced65bd97279f2a8b5bece32f282c3189f808770fe75a76e9ece1bfaeb0","tests/builder.rs":"00ad98d8514ec617cc5a3f9f9b1f3d195b9a6a4bbc6662e6d6972895998b8661","tests/certificate.rs":"307867d2c7250103834ea30872d88a7d8a89374d1f7e45f78f89f457adfa526d","tests/certreq.rs":"ef3dcaef71ed0cd0f391e820627c5c622df2bc75f3a636a6ff1a9a5d71478962","tests/crl.rs":"9620abb796c47c6931146b66d7840803375afb9ef2969b3007c1c3054c39d1c2","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.der":"d6c5bdce158bad5f5107441cb2bbe42adfa7bee7c6ccf369b68c993315be04b8","tests/examples/026EDA6FA1EDFA8C253936C75B5EEBD954BFF452.fake.pem":"b152f44a300694af28b3dd7416d3bc1ffce028dab5e5633b3623548b10f63a76","tests/examples/085B1E2F40254F9C7A2387BE9FF4EC116C326E10.fake.der":"321f8f032322e8933279bcff4a5e86780eb58286edd68d99d1f91394450dd760","tests/examples/0954e2343dd5efe0a7f0967d69caf33e5f893720.der":"0b57e9180fc8f1b466a2421069d232cf45596106f83e6fd19621caea183f1cf6","tests/examples/0fcc78fbbca9f32b08b19b032b84f2c86a128f35.der":"6061f773354cd2ed5613a094ab0e8270d5c2479932b42dfda727db83febd18b8","tests/examples/15b05c4865410c6b3ff76a4e8f3d87276756bd0c.der":"f74da4d9a687c5046499aefc9fa867de91a1a3941a09f24cf94603b7ab78108a","tests/examples/16ee54e48c76eaa1052e09010d8faefee95e5ebb.der":"7e32368e24a2cc48d3d29e883b260e40ceda22af97189c78fc5b928484e9a010","tests/examples/2049a5b28f104b2c6e1a08546f9cfc0353d6fd30.der":"ec0cbf1b122d440981788e57ef55fc7e0ca556126b476f865a1418e1273f5993","tests/examples/21723e7a0fb61a0bd4a29879b82a02b2fb4ad096.der":"6c03a6b5b01df504e5af7886e6bceb77e14d09f07f42e397952783b9cea38c6a","tests/examples/284A0A3A9B56DD752DAA2E09E2FADEDB858D9338.fake.der":"a7358a8665442cfc8d96d1525954b3376d8222c0c0c34189f73f8b2b097ecb4f","tests/examples/28879DABB0FD11618FB74E47BE049D2933866D53.fake.der":"d60ff530d5cf57b8338ef30c8396414f0736e74ead47a0d49c8b28eafa05158f","tests/examples/288C8BCFEE6B89D110DAE2C9873897BF7FF53382.fake.der":"40317ddec0b0c91f14043a8263a74c8548de13d30b4afd6730228a1cb0ae1572","tests/examples/28903a635b5280fae6774c0b6da7d6baa64af2e8.der":"88497f01602f3154246ae28c4d5aef10f1d87ebb76626f4ae0b7f95ba7968799","tests/examples/33D8388EDA1E92475EF19075D2EF4093D1CB6F7F.fake.der":"6fac22b428f1b8d4cf83f203e2e6d1a0c98bb5741cae9982267f75f589158c0a","tests/examples/342cd9d3062da48c346965297f081ebc2ef68fdc.der":"5e3571f33f45a7df1537a68b5ffb9e036af9d2f5bc4c9717130dc43d7175aac7","tests/examples/554D5FF11DA613A155584D8D4AA07F67724D8077.fake.der":"4ec4474a86383ab4a0979ad9bb453a8608c1eb3379aba82ca856f527dfcd25b1","tests/examples/GoodCACRL.crl":"d78e5eca421f082f55bf1c25ddf697111be3eeee0d395e339f1b97711ee2b496","tests/examples/GoodCACert.crt":"86d218374763fce77d5b2b45398db48f10e553da1875be7d6103085baca0343f","tests/examples/amazon.der":"5bf3d7e0e6927f773d5106c822c53f6f52c199f7eb1b3b8154b41f2924391c75","tests/examples/amazon.pem":"3b2d6d64e99ec971a1d4455cd6743c8f43e1829ef1f7764199242414960697fd","tests/examples/crates.io-chain.pem":"7bb36476e05b7f5431893bd27373cd17d616a5925aab75e116bd92849238912b","tests/examples/eca.der":"343ff530f246b00c71616a5d42541d551114baf74b7f786c7b42527586c6b22a","tests/examples/eca_policies.ta":"18f040c9e6cffbc36f6e3ff398b6f8797dfbd82717f2c88020be260c0d398ce0","tests/examples/entrust.der":"32e407c73121bf961287e9ccc7110a54f5c90e1e3ccf9f10478b36813fb54ae9","tests/examples/entrust_dnConstraint.ta":"c8bce2bf5424794450ce6a6137590beb1409bd732eaec29370986bc22e82e59b","tests/examples/exostar.der":"b63d71c64784857fc0677f634e7bc9bd0b2b1963f3272317a0406f8746cb9477","tests/examples/exostar_policyFlags.ta":"8927c86016bf1db45421bc497333f2306417b82b852f122582a3820a47084a1d","tests/examples/p256-priv.der":"8125ab208d2181ed3ef05ff0ab1906e5898c36a858277e5b987e78e505288769","tests/examples/p256-pub.der":"b9968d56ed8d6aa3fb43b15fa01e355d7a3a0203b1408b3fd2733637c4d1642c","tests/examples/qualcomm.pem":"4ec6058239c3589ab450c6cae9a4415cff429dfdc9490c35d9f022d03d1a6a82","tests/examples/raytheon.der":"d85ae3f67b0acf316829a02cec624b50f76732ca5c503fce4f53b64a168aa94c","tests/examples/raytheon_pathLenConstraint.ta":"08c8480329fb3fb9e73540c0d7e288b12025ddc7a4bd17ffe8085c33006034ea","tests/examples/rsa2048-crt.der":"283b2e3824ea47fb1556cccb1898eadcecf1adadfcf0782ba41ad7122a213568","tests/examples/rsa2048-crt.pem":"e443351100f1b9acd798f878d5e6266f40265179e7b47933f0e250b75069fdd8","tests/examples/rsa2048-csr.der":"f22da04d95947d3c42a4d1619af70097cd38d0156af5ad31f53c044776c4e909","tests/examples/rsa2048-csr.pem":"c58ca6cd37b4f2f7beb6eb184a26e6819ae650f03abeaf6efa50fa55e54e0b43","tests/examples/rsa2048-priv.der":"f94b60300e4877e863b2bea8d5c366a90432794454c05e0ec098ddbf96263614","tests/examples/rsa2048-prv.der":"2ce481dc184e82f43ff3b5fe2b8cdd2a9113c76f35e2c34e070c6706f73ad09d","tests/examples/rsa2048-prv.pem":"22a248487fb9602d223844cba1993ebf53e701287675e9446c95d38867604b17","tests/examples/rsa2048-pub.der":"efeda9bfead9fd0594f6a5cf6fdf6c163116a3b1fad6d73cea05295b68fd1794","tests/examples/tscpbcasha256.crl":"f7759eefacb39ae86931780a6aafad162b5cd57209d1cf283876296dfb5f06e7","tests/general_name.rs":"fee62078996ccb4440133de1909dfc35519f9d9e4aca3c2262c120bbc44d7bce","tests/name.rs":"ced4a3a0991f3523ffbb67b1c495378b19254a547160ed3b80111ac2f700dd94","tests/pkix_extensions.rs":"ae1aa9088ce3b74b8b046c48f249aca8a2d5f7c2ba036bb778f3eb7538cbed22","tests/trust_anchor_format.rs":"cd6d88262debb8690efd7e2b213442de5ac02cd408ca1125fcd7607577b90647","tests/validity.rs":"687e1c549a250ab6384578e0d31637c932aaf1d6f990c1d5ff3e2163d50ef97e"},"package":"1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94"}
\ No newline at end of file
diff --git a/crates/x509-cert/Android.bp b/crates/x509-cert/Android.bp
index 5cdfa7e..5080661 100644
--- a/crates/x509-cert/Android.bp
+++ b/crates/x509-cert/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "x509_cert",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.2.4",
+    cargo_pkg_version: "0.2.5",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
@@ -44,7 +44,7 @@
     name: "libx509_cert_nostd",
     crate_name: "x509_cert",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.2.4",
+    cargo_pkg_version: "0.2.5",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
diff --git a/crates/x509-cert/CHANGELOG.md b/crates/x509-cert/CHANGELOG.md
index 9922da4..72bd252 100644
--- a/crates/x509-cert/CHANGELOG.md
+++ b/crates/x509-cert/CHANGELOG.md
@@ -4,6 +4,19 @@
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## 0.2.5 (2023-12-23)
+
+### Added
+- Signed Certificate Timestamp (SCT) extension support ([#1134])
+
+### Changed
+- Relax dependencies ([#1179])
+- Use `SubjectPublicKeyInfoOwned::from_key` ([#1271])
+
+[#1134]: https://github.com/RustCrypto/formats/pull/1134
+[#1179]: https://github.com/RustCrypto/formats/pull/1179
+[#1271]: https://github.com/RustCrypto/formats/pull/1271
+
 ## 0.2.4 (2023-07-25)
 
 ### Added
diff --git a/crates/x509-cert/Cargo.toml b/crates/x509-cert/Cargo.toml
index 793721f..61a064f 100644
--- a/crates/x509-cert/Cargo.toml
+++ b/crates/x509-cert/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.65"
 name = "x509-cert"
-version = "0.2.4"
+version = "0.2.5"
 authors = ["RustCrypto Developers"]
 description = """
 Pure Rust implementation of the X.509 Public Key Infrastructure Certificate
@@ -56,7 +56,7 @@
 ]
 
 [dependencies.sha1]
-version = "0.10.0"
+version = "0.10.6"
 optional = true
 
 [dependencies.signature]
@@ -65,11 +65,17 @@
 optional = true
 
 [dependencies.spki]
-version = "0.7.2"
+version = "0.7.3"
 features = ["alloc"]
 
+[dependencies.tls_codec]
+version = "0.4.0"
+features = ["derive"]
+optional = true
+default-features = false
+
 [dev-dependencies.ecdsa]
-version = "0.16.7"
+version = "0.16.8"
 features = [
     "digest",
     "pem",
@@ -85,11 +91,11 @@
 version = "0.8.5"
 
 [dev-dependencies.rsa]
-version = "0.9.2"
+version = "0.9.6"
 features = ["sha2"]
 
 [dev-dependencies.rstest]
-version = "0.17"
+version = "0.18"
 
 [dev-dependencies.sha2]
 version = "0.10"
@@ -119,8 +125,10 @@
     "der/pem",
     "spki/pem",
 ]
+sct = ["dep:tls_codec"]
 std = [
     "const-oid/std",
     "der/std",
     "spki/std",
+    "tls_codec?/std",
 ]
diff --git a/crates/x509-cert/METADATA b/crates/x509-cert/METADATA
index 8e639d5..b425707 100644
--- a/crates/x509-cert/METADATA
+++ b/crates/x509-cert/METADATA
@@ -1,17 +1,17 @@
 name: "x509-cert"
 description: "Pure Rust implementation of the X.509 Public Key Infrastructure Certificate format as described in RFC 5280."
 third_party {
-  version: "0.2.4"
+  version: "0.2.5"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2023
-    month: 12
-    day: 15
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/x509-cert"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/x509-cert/x509-cert-0.2.4.crate"
-    version: "0.2.4"
+    value: "https://static.crates.io/crates/x509-cert/x509-cert-0.2.5.crate"
+    version: "0.2.5"
   }
 }
diff --git a/crates/x509-cert/src/builder.rs b/crates/x509-cert/src/builder.rs
index ec51a7e..c778f1e 100644
--- a/crates/x509-cert/src/builder.rs
+++ b/crates/x509-cert/src/builder.rs
@@ -276,9 +276,7 @@
         cert_signer: &'s S,
     ) -> Result<Self> {
         let verifying_key = cert_signer.verifying_key();
-        let signer_pub = verifying_key
-            .to_public_key_der()?
-            .decode_msg::<SubjectPublicKeyInfoOwned>()?;
+        let signer_pub = SubjectPublicKeyInfoOwned::from_key(verifying_key)?;
 
         let signature_alg = cert_signer.signature_algorithm_identifier()?;
         let issuer = profile.get_issuer(&subject);
@@ -370,9 +368,7 @@
     pub fn new(subject: Name, req_signer: &'s S) -> Result<Self> {
         let version = Default::default();
         let verifying_key = req_signer.verifying_key();
-        let public_key = verifying_key
-            .to_public_key_der()?
-            .decode_msg::<SubjectPublicKeyInfoOwned>()?;
+        let public_key = SubjectPublicKeyInfoOwned::from_key(verifying_key)?;
         let attributes = Default::default();
         let extension_req = Default::default();
 
diff --git a/crates/x509-cert/src/ext/pkix.rs b/crates/x509-cert/src/ext/pkix.rs
index 95a5e2b..2c7a4ff 100644
--- a/crates/x509-cert/src/ext/pkix.rs
+++ b/crates/x509-cert/src/ext/pkix.rs
@@ -9,6 +9,8 @@
 mod authkeyid;
 mod keyusage;
 mod policymap;
+#[cfg(feature = "sct")]
+pub mod sct;
 
 use crate::attr::AttributeTypeAndValue;
 
@@ -24,6 +26,12 @@
 pub use keyusage::{ExtendedKeyUsage, KeyUsage, KeyUsages, PrivateKeyUsagePeriod};
 pub use policymap::{PolicyMapping, PolicyMappings};
 
+#[cfg(feature = "sct")]
+pub use sct::{
+    Error, HashAlgorithm, SerializedSct, SignatureAlgorithm, SignatureAndHashAlgorithm,
+    SignedCertificateTimestamp, SignedCertificateTimestampList, Version,
+};
+
 pub use const_oid::db::rfc5280::{
     ID_CE_INHIBIT_ANY_POLICY, ID_CE_ISSUER_ALT_NAME, ID_CE_SUBJECT_ALT_NAME,
     ID_CE_SUBJECT_DIRECTORY_ATTRIBUTES, ID_CE_SUBJECT_KEY_IDENTIFIER,
diff --git a/crates/x509-cert/src/ext/pkix/name/general.rs b/crates/x509-cert/src/ext/pkix/name/general.rs
index bd0fa7e..821599d 100644
--- a/crates/x509-cert/src/ext/pkix/name/general.rs
+++ b/crates/x509-cert/src/ext/pkix/name/general.rs
@@ -86,6 +86,7 @@
 }
 
 #[cfg(all(feature = "std", test))]
+#[allow(clippy::unwrap_used)]
 mod tests {
     use super::*;
     use der::Encode;
diff --git a/crates/x509-cert/src/ext/pkix/name/other.rs b/crates/x509-cert/src/ext/pkix/name/other.rs
index 26b93bc..89a565e 100644
--- a/crates/x509-cert/src/ext/pkix/name/other.rs
+++ b/crates/x509-cert/src/ext/pkix/name/other.rs
@@ -21,6 +21,7 @@
 
 #[test]
 #[cfg(test)]
+#[allow(clippy::unwrap_used)]
 fn test() {
     use alloc::string::ToString;
     use der::{asn1::Utf8StringRef, Decode, Encode};
diff --git a/crates/x509-cert/src/ext/pkix/sct.rs b/crates/x509-cert/src/ext/pkix/sct.rs
new file mode 100644
index 0000000..32539a5
--- /dev/null
+++ b/crates/x509-cert/src/ext/pkix/sct.rs
@@ -0,0 +1,734 @@
+//! Signed Certificate Timestamp list extension as defined in the
+//! [Certificate Transparency RFC 6962].
+//!
+//! [Certificate Transparency RFC 6962]: https://datatracker.ietf.org/doc/html/rfc6962
+
+#![cfg(feature = "sct")]
+
+use alloc::{format, vec::Vec};
+use const_oid::{AssociatedOid, ObjectIdentifier};
+use der::asn1::OctetString;
+use tls_codec::{
+    DeserializeBytes, SerializeBytes, TlsByteVecU16, TlsDeserializeBytes, TlsSerializeBytes,
+    TlsSize,
+};
+
+/// A signed certificate timestamp list (SCT list) as defined in [RFC 6962 Section 3.3].
+///
+/// ```text
+/// SignedCertificateTimestampList ::= OCTET STRING
+/// ```
+///
+/// [RFC 6962 Section 3.3]: https://datatracker.ietf.org/doc/html/rfc6962#section-3.3
+#[derive(Debug, PartialEq)]
+pub struct SignedCertificateTimestampList(OctetString);
+
+//TODO: Remove this and use const-oid's rfc6962::CT_PRECERT_SCTS once a const-oid version
+// containing it is published
+const CT_PRECERT_SCTS: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.3.6.1.4.1.11129.2.4.2");
+
+impl AssociatedOid for SignedCertificateTimestampList {
+    const OID: ObjectIdentifier = CT_PRECERT_SCTS;
+}
+
+impl_newtype!(SignedCertificateTimestampList, OctetString);
+impl_extension!(SignedCertificateTimestampList, critical = false);
+
+/// Errors that are thrown by this module.
+#[derive(PartialEq, Debug)]
+pub enum Error {
+    /// [Errors][der::Error] from the `der` crate.
+    Der(der::Error),
+    /// [Errors][tls_codec::Error] from the `tls_codec` crate.
+    Tls(tls_codec::Error),
+}
+
+impl From<der::Error> for Error {
+    fn from(value: der::Error) -> Self {
+        Error::Der(value)
+    }
+}
+
+impl From<tls_codec::Error> for Error {
+    fn from(value: tls_codec::Error) -> Self {
+        Error::Tls(value)
+    }
+}
+
+impl SignedCertificateTimestampList {
+    /// Creates a new [`SignedCertificateTimestampList`] from a slice of [`SerializedSct`]s.
+    pub fn new(serialized_scts: &[SerializedSct]) -> Result<Self, Error> {
+        let mut result: Vec<u8> = Vec::new();
+        for timestamp in serialized_scts {
+            let buffer = timestamp.tls_serialize()?;
+            result.extend(buffer);
+        }
+        let tls_vec = TlsByteVecU16::new(result);
+        let buffer = tls_vec.tls_serialize()?;
+        Ok(SignedCertificateTimestampList(OctetString::new(buffer)?))
+    }
+
+    /// Parses the encoded [SerializedSct]s and returns a [Vec] containing them.
+    ///
+    /// Returns an [error][Error] if a [SerializedSct] can't be
+    /// deserialized or if there are trailing bytes after all [SerializedSct]s
+    /// are deserialized.
+    pub fn parse_timestamps(&self) -> Result<Vec<SerializedSct>, Error> {
+        let (tls_vec, rest) = TlsByteVecU16::tls_deserialize_bytes(self.0.as_bytes())?;
+        if !rest.is_empty() {
+            return Err(tls_codec::Error::TrailingData)?;
+        }
+        let mut bytes = tls_vec.as_slice();
+        let mut result = Vec::new();
+        while !bytes.is_empty() {
+            let (serialized_sct, rest) = SerializedSct::tls_deserialize_bytes(bytes)?;
+            result.push(serialized_sct);
+            bytes = rest;
+        }
+        Ok(result)
+    }
+}
+
+/// A byte string that contains a serialized [SignedCertificateTimestamp] as
+/// defined in [RFC 6962 section 3.3].
+///
+/// [RFC 6962 section 3.3]: https://datatracker.ietf.org/doc/html/rfc6962#section-3.3
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+pub struct SerializedSct {
+    data: TlsByteVecU16,
+}
+
+impl SerializedSct {
+    /// Creates a new [SerializedSct] from a [SignedCertificateTimestamp].
+    ///
+    /// Returns [tls_codec Error][tls_codec::Error] if the given [SignedCertificateTimestamp]
+    /// can't be serialized.
+    pub fn new(timestamp: SignedCertificateTimestamp) -> Result<Self, tls_codec::Error> {
+        let buffer = timestamp.tls_serialize()?;
+        Ok(SerializedSct {
+            data: TlsByteVecU16::from_slice(&buffer),
+        })
+    }
+
+    /// Parses a [SignedCertificateTimestamp] from a this [SerializedSct].
+    ///
+    /// Returns an [error][Error] if a [SignedCertificateTimestamp] can't be
+    /// deserialized or if there are trailing bytes after a
+    /// [SignedCertificateTimestamp] has been deserialized.
+    pub fn parse_timestamp(&self) -> Result<SignedCertificateTimestamp, Error> {
+        let (sct, rest) = SignedCertificateTimestamp::tls_deserialize_bytes(self.data.as_slice())?;
+        if !rest.is_empty() {
+            return Err(tls_codec::Error::TrailingData)?;
+        }
+        Ok(sct)
+    }
+}
+
+/// A signed certificate timestamp (SCT) as defined in [RFC 6962 section 3.2].
+///
+/// [RFC 6962 section 3.2]: https://datatracker.ietf.org/doc/html/rfc6962#section-3.2
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+pub struct SignedCertificateTimestamp {
+    /// The version of the protocol to which the SCT conforms.
+    /// Currently, it is always v1.
+    pub version: Version,
+    /// The SHA-256 hash of the log's public key, calculated over
+    /// the DER encoding of the key represented as [SubjectPublicKeyInfo][spki::SubjectPublicKeyInfo].
+    pub log_id: LogId,
+    /// the current NTP Time measured since the `UNIX_EPOCH`
+    /// (January 1, 1970, 00:00), ignoring leap seconds, in milliseconds.
+    pub timestamp: u64,
+    /// The future extensions to protocol version v1.
+    /// Currently, no extensions are specified.
+    pub extensions: TlsByteVecU16,
+    /// A digital signature over many fields including
+    /// version, timestamp, extensions and others. See [RFC 6962 section 3.2]
+    /// for a complete list.
+    ///
+    /// [RFC 6962 section 3.2]:https://datatracker.ietf.org/doc/html/rfc6962#section-3.2
+    pub signature: DigitallySigned,
+}
+
+impl SignedCertificateTimestamp {
+    /// Creates a [DateTime][der::DateTime] from the timestamp field since the `UNIX_EPOCH`.
+    ///
+    /// Returns an error if timestamp is outside the supported date range.
+    pub fn timestamp(&self) -> Result<der::DateTime, der::Error> {
+        der::DateTime::from_unix_duration(core::time::Duration::from_millis(self.timestamp))
+    }
+}
+
+/// The version of the protocol to which the SCT conforms
+/// as defined in [RFC 6962 section 3.2]. Currently, it is always v1.
+///
+/// [RFC 6962 section 3.2]: https://datatracker.ietf.org/doc/html/rfc6962#section-3.2
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+#[repr(u8)]
+pub enum Version {
+    /// Version 1.
+    V1 = 0,
+}
+
+/// The SHA-256 hash of the log's public key, calculated over
+/// the DER encoding of the key represented as [SubjectPublicKeyInfo][spki::SubjectPublicKeyInfo]
+/// as defined in [RFC 6962 section 3.2].
+///
+/// [RFC 6962 section 3.2]: https://datatracker.ietf.org/doc/html/rfc6962#section-3.2
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+pub struct LogId {
+    /// Hash of the log's public key.
+    pub key_id: [u8; 32],
+}
+
+/// Digital signature as defined in [RFC 5246 section 4.7].
+///
+/// [RFC 5246 section 4.7]: https://datatracker.ietf.org/doc/html/rfc5246#section-4.7
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+pub struct DigitallySigned {
+    /// [SignatureAndHashAlgorithm] as defined in [RFC 5246 section 7.4.1.4.1].
+    ///
+    /// [RFC 5246 section 7.4.1.4.1]: https://datatracker.ietf.org/doc/html/rfc5246#section-7.4.1.4.1
+    pub algorithm: SignatureAndHashAlgorithm,
+    /// Digital signature over some contents using the [SignatureAndHashAlgorithm].
+    pub signature: TlsByteVecU16,
+}
+
+/// A combination of signature and hashing algorithms as defined in [RFC 5246 section 7.4.1.4.1].
+///
+/// [RFC 5246 section 7.4.1.4.1]: https://datatracker.ietf.org/doc/html/rfc5246#section-7.4.1.4.1
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+pub struct SignatureAndHashAlgorithm {
+    /// The hashing algorithm.
+    pub hash: HashAlgorithm,
+    /// The signature algorithm.
+    pub signature: SignatureAlgorithm,
+}
+
+/// Signature algorithm as defined in [RFC 5246 section 7.4.1.4.1].
+///
+/// [RFC 5246 section 7.4.1.4.1]: https://datatracker.ietf.org/doc/html/rfc5246#section-7.4.1.4.1
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+#[repr(u8)]
+pub enum SignatureAlgorithm {
+    /// Anonymous signature algorithm.
+    Anonymous = 0,
+    /// RSA signature algorithm.
+    Rsa = 1,
+    /// DSA signature algorithm.
+    Dsa = 2,
+    /// ECDSA signature algorithm.
+    Ecdsa = 3,
+    /// ED25519 signature algorithm.
+    Ed25519 = 7,
+    /// ED448 signature algorithm.
+    Ed448 = 8,
+}
+
+/// Hashing algorithm as defined in [RFC 5246 section 7.4.1.4.1].
+///
+/// [RFC 5246 section 7.4.1.4.1]: https://datatracker.ietf.org/doc/html/rfc5246#section-7.4.1.4.1
+#[derive(PartialEq, Debug, TlsDeserializeBytes, TlsSerializeBytes, TlsSize)]
+#[repr(u8)]
+pub enum HashAlgorithm {
+    /// No algorithm.
+    None = 0,
+    /// MD5 algorithm.
+    Md5 = 1,
+    /// SHA1 algorithm.
+    Sha1 = 2,
+    /// SHA224 algorithm.
+    Sha224 = 3,
+    /// SHA256 algorithm.
+    Sha256 = 4,
+    /// SHA384 algorithm.
+    Sha384 = 5,
+    /// SHA512 algorithm.
+    Sha512 = 6,
+    /// Intrinsic algorithm.
+    Intrinsic = 8,
+}
+
+#[cfg(test)]
+mod tests {
+    use der::{asn1::OctetString, Decode, Encode};
+    use tls_codec::{DeserializeBytes, SerializeBytes, TlsByteVecU16};
+
+    use crate::ext::pkix::sct::LogId;
+
+    use super::{
+        DigitallySigned, HashAlgorithm, SerializedSct, SignatureAlgorithm,
+        SignatureAndHashAlgorithm, SignedCertificateTimestamp, SignedCertificateTimestampList,
+        Version,
+    };
+
+    fn run_deserialization_test<'a, T: DeserializeBytes + PartialEq + core::fmt::Debug>(
+        bytes: &'a [u8],
+        expected_result: Result<(T, &[u8]), tls_codec::Error>,
+    ) -> Result<(T, &'a [u8]), tls_codec::Error> {
+        let actual_result = T::tls_deserialize_bytes(bytes);
+        assert_eq!(actual_result, expected_result);
+        actual_result
+    }
+
+    fn run_serialization_test<T: SerializeBytes>(value: T, expected_bytes: &[u8]) {
+        let result = value.tls_serialize().expect("failed to serialize value");
+        assert_eq!(expected_bytes, &result);
+    }
+
+    #[test]
+    fn test_hash_algorithm_deserialization() {
+        let bytes = [0, 1, 2, 3, 4, 5, 6, 8];
+
+        let result = run_deserialization_test(
+            &bytes,
+            Ok((HashAlgorithm::None, [1, 2, 3, 4, 5, 6, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Md5, [2, 3, 4, 5, 6, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Sha1, [3, 4, 5, 6, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Sha224, [4, 5, 6, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Sha256, [5, 6, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Sha384, [6, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Sha512, [8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((HashAlgorithm::Intrinsic, [].as_slice())),
+        );
+        let _ = run_deserialization_test::<HashAlgorithm>(
+            result.expect("run_deserialization_test failed").1,
+            Err(tls_codec::Error::EndOfStream),
+        );
+        let _ =
+            run_deserialization_test::<HashAlgorithm>(&[7], Err(tls_codec::Error::UnknownValue(7)));
+        let _ =
+            run_deserialization_test::<HashAlgorithm>(&[9], Err(tls_codec::Error::UnknownValue(9)));
+    }
+
+    #[test]
+    fn test_hash_algorithm_serialization() {
+        run_serialization_test(HashAlgorithm::None, &[0]);
+        run_serialization_test(HashAlgorithm::Md5, &[1]);
+        run_serialization_test(HashAlgorithm::Sha1, &[2]);
+        run_serialization_test(HashAlgorithm::Sha224, &[3]);
+        run_serialization_test(HashAlgorithm::Sha256, &[4]);
+        run_serialization_test(HashAlgorithm::Sha384, &[5]);
+        run_serialization_test(HashAlgorithm::Sha512, &[6]);
+        run_serialization_test(HashAlgorithm::Intrinsic, &[8]);
+    }
+
+    #[test]
+    fn test_signature_algorithm_deserialization() {
+        let bytes = [0, 1, 2, 3, 7, 8];
+
+        let result = run_deserialization_test(
+            &bytes,
+            Ok((SignatureAlgorithm::Anonymous, [1, 2, 3, 7, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((SignatureAlgorithm::Rsa, [2, 3, 7, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((SignatureAlgorithm::Dsa, [3, 7, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((SignatureAlgorithm::Ecdsa, [7, 8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((SignatureAlgorithm::Ed25519, [8].as_slice())),
+        );
+        let result = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((SignatureAlgorithm::Ed448, [].as_slice())),
+        );
+        let _ = run_deserialization_test::<SignatureAlgorithm>(
+            result.expect("run_deserialization_test failed").1,
+            Err(tls_codec::Error::EndOfStream),
+        );
+        let _ = run_deserialization_test::<SignatureAlgorithm>(
+            &[4],
+            Err(tls_codec::Error::UnknownValue(4)),
+        );
+        let _ = run_deserialization_test::<SignatureAlgorithm>(
+            &[5],
+            Err(tls_codec::Error::UnknownValue(5)),
+        );
+        let _ = run_deserialization_test::<SignatureAlgorithm>(
+            &[6],
+            Err(tls_codec::Error::UnknownValue(6)),
+        );
+        let _ = run_deserialization_test::<SignatureAlgorithm>(
+            &[9],
+            Err(tls_codec::Error::UnknownValue(9)),
+        );
+    }
+
+    #[test]
+    fn test_signature_algorithm_serialization() {
+        run_serialization_test(SignatureAlgorithm::Anonymous, &[0]);
+        run_serialization_test(SignatureAlgorithm::Rsa, &[1]);
+        run_serialization_test(SignatureAlgorithm::Dsa, &[2]);
+        run_serialization_test(SignatureAlgorithm::Ecdsa, &[3]);
+        run_serialization_test(SignatureAlgorithm::Ed25519, &[7]);
+        run_serialization_test(SignatureAlgorithm::Ed448, &[8]);
+    }
+
+    #[test]
+    fn test_signature_and_hash_algorithm_deserialization() {
+        let bytes = [4, 3, 2, 1];
+
+        let result = run_deserialization_test(
+            &bytes,
+            Ok((
+                SignatureAndHashAlgorithm {
+                    hash: HashAlgorithm::Sha256,
+                    signature: SignatureAlgorithm::Ecdsa,
+                },
+                [2, 1].as_slice(),
+            )),
+        );
+
+        let _ = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((
+                SignatureAndHashAlgorithm {
+                    hash: HashAlgorithm::Sha1,
+                    signature: SignatureAlgorithm::Rsa,
+                },
+                [].as_slice(),
+            )),
+        );
+    }
+
+    #[test]
+    fn test_signature_and_hash_algorithm_serialization() {
+        run_serialization_test(
+            SignatureAndHashAlgorithm {
+                hash: HashAlgorithm::Sha1,
+                signature: SignatureAlgorithm::Rsa,
+            },
+            &[2, 1],
+        );
+        run_serialization_test(
+            SignatureAndHashAlgorithm {
+                hash: HashAlgorithm::Sha256,
+                signature: SignatureAlgorithm::Ecdsa,
+            },
+            &[4, 3],
+        );
+    }
+
+    #[test]
+    fn test_digitally_signed_deserialization() {
+        let bytes = [4, 3, 0, 3, 2, 1, 0, 2, 1, 0, 1, 9];
+
+        let result = run_deserialization_test(
+            &bytes,
+            Ok((
+                DigitallySigned {
+                    algorithm: SignatureAndHashAlgorithm {
+                        hash: HashAlgorithm::Sha256,
+                        signature: SignatureAlgorithm::Ecdsa,
+                    },
+                    signature: TlsByteVecU16::from_slice(&[2, 1, 0]),
+                },
+                [2, 1, 0, 1, 9].as_slice(),
+            )),
+        );
+
+        let _ = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((
+                DigitallySigned {
+                    algorithm: SignatureAndHashAlgorithm {
+                        hash: HashAlgorithm::Sha1,
+                        signature: SignatureAlgorithm::Rsa,
+                    },
+                    signature: TlsByteVecU16::from_slice(&[9]),
+                },
+                [].as_slice(),
+            )),
+        );
+    }
+
+    #[test]
+    fn test_digitally_signed_serialization() {
+        run_serialization_test(
+            DigitallySigned {
+                algorithm: SignatureAndHashAlgorithm {
+                    hash: HashAlgorithm::Sha256,
+                    signature: SignatureAlgorithm::Ecdsa,
+                },
+                signature: TlsByteVecU16::from_slice(&[0, 1, 2]),
+            },
+            &[4, 3, 0, 3, 0, 1, 2],
+        );
+        run_serialization_test(
+            DigitallySigned {
+                algorithm: SignatureAndHashAlgorithm {
+                    hash: HashAlgorithm::Sha1,
+                    signature: SignatureAlgorithm::Rsa,
+                },
+                signature: TlsByteVecU16::from_slice(&[0, 1, 2]),
+            },
+            &[2, 1, 0, 3, 0, 1, 2],
+        );
+    }
+
+    #[test]
+    fn test_version_deserialization() {
+        let bytes = [0, 0];
+
+        let result = run_deserialization_test(&bytes, Ok((Version::V1, [0].as_slice())));
+
+        let _ = run_deserialization_test(
+            result.expect("run_deserialization_test failed").1,
+            Ok((Version::V1, [].as_slice())),
+        );
+        let _ = run_deserialization_test::<Version>(&[1], Err(tls_codec::Error::UnknownValue(1)));
+    }
+
+    #[test]
+    fn test_version_serialization() {
+        run_serialization_test(Version::V1, &[0]);
+    }
+
+    #[test]
+    fn test_log_id_deserialization() {
+        let bytes = [42; 36];
+
+        let _ =
+            run_deserialization_test(&bytes, Ok((LogId { key_id: [42; 32] }, [42; 4].as_slice())));
+    }
+
+    #[test]
+    fn test_log_id_serialization() {
+        run_serialization_test(LogId { key_id: [3; 32] }, &[3; 32]);
+    }
+
+    const TLS_SCT_EXAMPLE: [u8; 119] = [
+        0, 122, 50, 140, 84, 216, 183, 45, 182, 32, 234, 56, 224, 82, 30, 233, 132, 22, 112, 50,
+        19, 133, 77, 59, 210, 43, 193, 58, 87, 163, 82, 235, 82, 0, 0, 1, 135, 224, 74, 186, 106,
+        0, 0, 4, 3, 0, 72, 48, 70, 2, 33, 0, 170, 82, 81, 162, 157, 234, 14, 189, 167, 13, 247,
+        211, 97, 112, 248, 172, 149, 125, 58, 18, 238, 60, 150, 157, 124, 245, 188, 138, 102, 212,
+        244, 187, 2, 33, 0, 209, 79, 31, 63, 208, 79, 240, 233, 193, 187, 28, 33, 190, 95, 130, 66,
+        183, 222, 187, 42, 22, 83, 0, 119, 226, 246, 19, 197, 47, 237, 198, 149,
+    ];
+
+    #[test]
+    fn test_sct_deserialization() {
+        let _ = run_deserialization_test(
+            &TLS_SCT_EXAMPLE,
+            Ok((
+                SignedCertificateTimestamp {
+                    version: Version::V1,
+                    log_id: LogId {
+                        key_id: TLS_SCT_EXAMPLE[1..33]
+                            .try_into()
+                            .expect("failed to convert to u8 array"),
+                    },
+                    timestamp: u64::from_be_bytes(
+                        TLS_SCT_EXAMPLE[33..41]
+                            .try_into()
+                            .expect("failed to convert to u8 array"),
+                    ),
+                    extensions: TlsByteVecU16::from_slice(&[]),
+                    signature: DigitallySigned {
+                        algorithm: SignatureAndHashAlgorithm {
+                            hash: HashAlgorithm::Sha256,
+                            signature: SignatureAlgorithm::Ecdsa,
+                        },
+                        signature: TlsByteVecU16::from_slice(&TLS_SCT_EXAMPLE[47..]),
+                    },
+                },
+                &[],
+            )),
+        );
+    }
+
+    #[test]
+    fn test_sct_serialization() {
+        run_serialization_test(
+            SignedCertificateTimestamp {
+                version: Version::V1,
+                log_id: LogId {
+                    key_id: TLS_SCT_EXAMPLE[1..33]
+                        .try_into()
+                        .expect("failed to convert to u8 array"),
+                },
+                timestamp: u64::from_be_bytes(
+                    TLS_SCT_EXAMPLE[33..41]
+                        .try_into()
+                        .expect("failed to convert to u8 array"),
+                ),
+                extensions: TlsByteVecU16::from_slice(&[]),
+                signature: DigitallySigned {
+                    algorithm: SignatureAndHashAlgorithm {
+                        hash: HashAlgorithm::Sha256,
+                        signature: SignatureAlgorithm::Ecdsa,
+                    },
+                    signature: TlsByteVecU16::from_slice(&TLS_SCT_EXAMPLE[47..]),
+                },
+            },
+            &TLS_SCT_EXAMPLE,
+        );
+    }
+
+    const SCT_EXAMPLE: [u8; 245] = [
+        4, 129, 242, 0, 240, 0, 119, 0, 122, 50, 140, 84, 216, 183, 45, 182, 32, 234, 56, 224, 82,
+        30, 233, 132, 22, 112, 50, 19, 133, 77, 59, 210, 43, 193, 58, 87, 163, 82, 235, 82, 0, 0,
+        1, 135, 224, 74, 186, 106, 0, 0, 4, 3, 0, 72, 48, 70, 2, 33, 0, 170, 82, 81, 162, 157, 234,
+        14, 189, 167, 13, 247, 211, 97, 112, 248, 172, 149, 125, 58, 18, 238, 60, 150, 157, 124,
+        245, 188, 138, 102, 212, 244, 187, 2, 33, 0, 209, 79, 31, 63, 208, 79, 240, 233, 193, 187,
+        28, 33, 190, 95, 130, 66, 183, 222, 187, 42, 22, 83, 0, 119, 226, 246, 19, 197, 47, 237,
+        198, 149, 0, 117, 0, 173, 247, 190, 250, 124, 255, 16, 200, 139, 157, 61, 156, 30, 62, 24,
+        106, 180, 103, 41, 93, 207, 177, 12, 36, 202, 133, 134, 52, 235, 220, 130, 138, 0, 0, 1,
+        135, 224, 74, 186, 164, 0, 0, 4, 3, 0, 70, 48, 68, 2, 32, 29, 110, 144, 37, 157, 227, 170,
+        70, 67, 16, 68, 195, 212, 168, 246, 37, 94, 69, 210, 136, 42, 113, 217, 230, 34, 152, 253,
+        116, 13, 174, 232, 191, 2, 32, 16, 25, 200, 223, 59, 176, 40, 145, 76, 85, 242, 133, 130,
+        212, 61, 216, 83, 238, 115, 130, 82, 240, 196, 162, 249, 54, 199, 120, 175, 72, 223, 14,
+    ];
+
+    #[test]
+    fn test_sct_list_deserialization() {
+        fn run_test(
+            bytes: &[u8],
+            expected_result: Result<SignedCertificateTimestampList, der::Error>,
+        ) -> Result<SignedCertificateTimestampList, der::Error> {
+            let actual_result = SignedCertificateTimestampList::from_der(bytes);
+            assert_eq!(actual_result, expected_result);
+            actual_result
+        }
+
+        let result = run_test(
+            &SCT_EXAMPLE,
+            Ok(SignedCertificateTimestampList(
+                OctetString::new(&SCT_EXAMPLE[3..]).expect("failed to convert to u8 array"),
+            )),
+        );
+        let scts = result
+            .expect("run_test failed")
+            .parse_timestamps()
+            .expect("parse_timestamps failed");
+        assert_eq!(
+            scts[0].parse_timestamp(),
+            Ok(SignedCertificateTimestamp {
+                version: Version::V1,
+                log_id: LogId {
+                    key_id: SCT_EXAMPLE[8..40]
+                        .try_into()
+                        .expect("failed to convert to u8 array"),
+                },
+                timestamp: u64::from_be_bytes(
+                    SCT_EXAMPLE[40..48]
+                        .try_into()
+                        .expect("failed to convert to u8 array")
+                ),
+                extensions: TlsByteVecU16::from_slice(&[]),
+                signature: DigitallySigned {
+                    algorithm: SignatureAndHashAlgorithm {
+                        hash: HashAlgorithm::Sha256,
+                        signature: SignatureAlgorithm::Ecdsa,
+                    },
+                    signature: TlsByteVecU16::from_slice(&SCT_EXAMPLE[54..126]),
+                },
+            })
+        );
+        assert_eq!(
+            scts[1].parse_timestamp(),
+            Ok(SignedCertificateTimestamp {
+                version: Version::V1,
+                log_id: LogId {
+                    key_id: SCT_EXAMPLE[129..161]
+                        .try_into()
+                        .expect("failed to convert to u8 array"),
+                },
+                timestamp: u64::from_be_bytes(
+                    SCT_EXAMPLE[161..169]
+                        .try_into()
+                        .expect("failed to convert to u8 array")
+                ),
+                extensions: TlsByteVecU16::from_slice(&[]),
+                signature: DigitallySigned {
+                    algorithm: SignatureAndHashAlgorithm {
+                        hash: HashAlgorithm::Sha256,
+                        signature: SignatureAlgorithm::Ecdsa,
+                    },
+                    signature: TlsByteVecU16::from_slice(&SCT_EXAMPLE[175..]),
+                },
+            })
+        );
+    }
+
+    #[test]
+    fn test_sct_list_serialization() {
+        let serialized_sct1 = SerializedSct::new(SignedCertificateTimestamp {
+            version: Version::V1,
+            log_id: LogId {
+                key_id: SCT_EXAMPLE[8..40]
+                    .try_into()
+                    .expect("failed to convert to u8 array"),
+            },
+            timestamp: u64::from_be_bytes(
+                SCT_EXAMPLE[40..48]
+                    .try_into()
+                    .expect("failed to convert to u8 array"),
+            ),
+            extensions: TlsByteVecU16::from_slice(&[]),
+            signature: DigitallySigned {
+                algorithm: SignatureAndHashAlgorithm {
+                    hash: HashAlgorithm::Sha256,
+                    signature: SignatureAlgorithm::Ecdsa,
+                },
+                signature: TlsByteVecU16::from_slice(&SCT_EXAMPLE[54..126]),
+            },
+        })
+        .expect("failed to create SerializedSct");
+        let serialized_sct2 = SerializedSct::new(SignedCertificateTimestamp {
+            version: Version::V1,
+            log_id: LogId {
+                key_id: SCT_EXAMPLE[129..161]
+                    .try_into()
+                    .expect("failed to convert to u8 array"),
+            },
+            timestamp: u64::from_be_bytes(
+                SCT_EXAMPLE[161..169]
+                    .try_into()
+                    .expect("failed to convert to u8 array"),
+            ),
+            extensions: TlsByteVecU16::from_slice(&[]),
+            signature: DigitallySigned {
+                algorithm: SignatureAndHashAlgorithm {
+                    hash: HashAlgorithm::Sha256,
+                    signature: SignatureAlgorithm::Ecdsa,
+                },
+                signature: TlsByteVecU16::from_slice(&SCT_EXAMPLE[175..]),
+            },
+        })
+        .expect("failed to create SerializedSct");
+        let list = SignedCertificateTimestampList::new(&[serialized_sct1, serialized_sct2])
+            .expect("failed to create SignedCertificateTimestampList");
+        let der = list.to_der().expect("failed to convert to der");
+        assert_eq!(der.as_slice(), SCT_EXAMPLE.as_slice());
+    }
+}
diff --git a/crates/x509-cert/src/name.rs b/crates/x509-cert/src/name.rs
index ec62249..c12a25c 100644
--- a/crates/x509-cert/src/name.rs
+++ b/crates/x509-cert/src/name.rs
@@ -96,7 +96,7 @@
 /// Split a string at all non-escaped separators.
 fn split(s: &str, b: u8) -> impl '_ + Iterator<Item = &'_ str> {
     let mut prev = 0;
-    find(s, b).chain([s.len()].into_iter()).map(move |i| {
+    find(s, b).chain([s.len()]).map(move |i| {
         let x = &s[prev..i];
         prev = i + 1;
         x
diff --git a/crates/x509-cert/src/serial_number.rs b/crates/x509-cert/src/serial_number.rs
index b14487a..42952fd 100644
--- a/crates/x509-cert/src/serial_number.rs
+++ b/crates/x509-cert/src/serial_number.rs
@@ -147,6 +147,7 @@
 }
 
 #[cfg(test)]
+#[allow(clippy::unwrap_used)]
 mod tests {
     use alloc::string::ToString;
 
diff --git a/crates/x509-cert/tests/builder.rs b/crates/x509-cert/tests/builder.rs
index 06aae51..d31eb8c 100644
--- a/crates/x509-cert/tests/builder.rs
+++ b/crates/x509-cert/tests/builder.rs
@@ -138,7 +138,7 @@
     let builder = CertificateBuilder::new(
         profile,
         serial_number.clone(),
-        validity.clone(),
+        validity,
         subject.clone(),
         pub_key.clone(),
         &signer,
@@ -251,14 +251,12 @@
 
 fn rsa_signer() -> SigningKey<Sha256> {
     let private_key = rsa::RsaPrivateKey::from_pkcs1_der(RSA_2048_PRIV_DER_EXAMPLE).unwrap();
-    let signing_key = SigningKey::<Sha256>::new(private_key);
-    signing_key
+    SigningKey::<Sha256>::new(private_key)
 }
 
 fn rsa_pss_signer() -> rsa::pss::SigningKey<Sha256> {
     let private_key = rsa::RsaPrivateKey::from_pkcs1_der(RSA_2048_PRIV_DER_EXAMPLE).unwrap();
-    let signing_key = rsa::pss::SigningKey::<Sha256>::new(private_key);
-    signing_key
+    rsa::pss::SigningKey::<Sha256>::new(private_key)
 }
 
 const PKCS8_PRIVATE_KEY_DER: &[u8] = include_bytes!("examples/p256-priv.der");
diff --git a/crates/x509-cert/tests/certificate.rs b/crates/x509-cert/tests/certificate.rs
index e5b3243..d4859c2 100644
--- a/crates/x509-cert/tests/certificate.rs
+++ b/crates/x509-cert/tests/certificate.rs
@@ -437,7 +437,7 @@
     assert_eq!(pem_encoded_cert, reencoded.as_bytes());
 }
 
-#[cfg(all(feature = "pem"))]
+#[cfg(feature = "pem")]
 #[test]
 fn load_certificate_chains() {
     let pem_encoded_chain = include_bytes!("examples/crates.io-chain.pem");
diff --git a/crates/x509-cert/tests/pkix_extensions.rs b/crates/x509-cert/tests/pkix_extensions.rs
index 108eeb5..9d9973a 100644
--- a/crates/x509-cert/tests/pkix_extensions.rs
+++ b/crates/x509-cert/tests/pkix_extensions.rs
@@ -1,4 +1,5 @@
 //! Certificate tests
+#![allow(clippy::bool_assert_comparison)]
 use const_oid::AssociatedOid;
 use der::asn1::{Ia5StringRef, OctetString, PrintableStringRef, Utf8StringRef};
 use der::{Decode, Encode, ErrorKind, Length, Tag, Tagged};
@@ -211,194 +212,284 @@
     let result = Certificate::from_der(der_encoded_cert);
     let cert: Certificate = result.unwrap();
     let exts = cert.tbs_certificate.extensions.unwrap();
-    let i = exts.iter();
-    let mut counter = 0;
-    for ext in i {
-        if 0 == counter {
-            assert_eq!(ext.extn_id.to_string(), ID_CE_KEY_USAGE.to_string());
-            assert_eq!(ext.critical, true);
+    for (i, ext) in exts.iter().enumerate() {
+        match i {
+            0 => {
+                assert_eq!(ext.extn_id.to_string(), ID_CE_KEY_USAGE.to_string());
+                assert_eq!(ext.critical, true);
 
-            let ku = KeyUsage::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(KeyUsages::KeyCertSign | KeyUsages::CRLSign, ku);
+                let ku = KeyUsage::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(KeyUsages::KeyCertSign | KeyUsages::CRLSign, ku);
 
-            let reencoded = ku.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-        } else if 1 == counter {
-            assert_eq!(ext.extn_id.to_string(), ID_CE_BASIC_CONSTRAINTS.to_string());
-            assert_eq!(ext.critical, true);
-            let bc = BasicConstraints::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(true, bc.ca);
-            assert!(bc.path_len_constraint.is_none());
-
-            let reencoded = bc.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-        } else if 2 == counter {
-            assert_eq!(ext.extn_id.to_string(), ID_CE_POLICY_MAPPINGS.to_string());
-            assert_eq!(ext.critical, false);
-            let pm = PolicyMappings::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(19, pm.0.len());
-
-            let reencoded = pm.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-
-            let subject_domain_policy: [&str; 19] = [
-                "2.16.840.1.101.3.2.1.48.2",
-                "2.16.840.1.101.3.2.1.48.2",
-                "2.16.840.1.101.3.2.1.48.3",
-                "2.16.840.1.101.3.2.1.48.3",
-                "2.16.840.1.101.3.2.1.48.5",
-                "2.16.840.1.101.3.2.1.48.5",
-                "2.16.840.1.101.3.2.1.48.4",
-                "2.16.840.1.101.3.2.1.48.4",
-                "2.16.840.1.101.3.2.1.48.6",
-                "2.16.840.1.101.3.2.1.48.6",
-                "2.16.840.1.101.3.2.1.48.78",
-                "2.16.840.1.101.3.2.1.48.78",
-                "2.16.840.1.101.3.2.1.48.78",
-                "2.16.840.1.101.3.2.1.48.79",
-                "2.16.840.1.101.3.2.1.48.80",
-                "2.16.840.1.101.3.2.1.48.99",
-                "2.16.840.1.101.3.2.1.48.99",
-                "2.16.840.1.101.3.2.1.48.100",
-                "2.16.840.1.101.3.2.1.48.100",
-            ];
-
-            let issuer_domain_policy: [&str; 19] = [
-                "2.16.840.1.113839.0.100.2.1",
-                "2.16.840.1.113839.0.100.2.2",
-                "2.16.840.1.113839.0.100.3.1",
-                "2.16.840.1.113839.0.100.3.2",
-                "2.16.840.1.113839.0.100.14.1",
-                "2.16.840.1.113839.0.100.14.2",
-                "2.16.840.1.113839.0.100.12.1",
-                "2.16.840.1.113839.0.100.12.2",
-                "2.16.840.1.113839.0.100.15.1",
-                "2.16.840.1.113839.0.100.15.2",
-                "2.16.840.1.113839.0.100.18.0",
-                "2.16.840.1.113839.0.100.18.1",
-                "2.16.840.1.113839.0.100.18.2",
-                "2.16.840.1.113839.0.100.19.1",
-                "2.16.840.1.113839.0.100.20.1",
-                "2.16.840.1.113839.0.100.37.1",
-                "2.16.840.1.113839.0.100.37.2",
-                "2.16.840.1.113839.0.100.38.1",
-                "2.16.840.1.113839.0.100.38.2",
-            ];
-
-            let mut counter_pm = 0;
-            for mapping in pm.0 {
-                assert_eq!(
-                    issuer_domain_policy[counter_pm],
-                    mapping.issuer_domain_policy.to_string()
-                );
-                assert_eq!(
-                    subject_domain_policy[counter_pm],
-                    mapping.subject_domain_policy.to_string()
-                );
-                counter_pm += 1;
+                let reencoded = ku.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
             }
-        } else if 3 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_CE_CERTIFICATE_POLICIES.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let cps = CertificatePolicies::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(19, cps.0.len());
+            1 => {
+                assert_eq!(ext.extn_id.to_string(), ID_CE_BASIC_CONSTRAINTS.to_string());
+                assert_eq!(ext.critical, true);
+                let bc = BasicConstraints::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(true, bc.ca);
+                assert!(bc.path_len_constraint.is_none());
 
-            let reencoded = cps.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
+                let reencoded = bc.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
+            }
+            2 => {
+                assert_eq!(ext.extn_id.to_string(), ID_CE_POLICY_MAPPINGS.to_string());
+                assert_eq!(ext.critical, false);
+                let pm = PolicyMappings::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(19, pm.0.len());
 
-            let ids: [&str; 19] = [
-                "2.16.840.1.113839.0.100.2.1",
-                "2.16.840.1.113839.0.100.2.2",
-                "2.16.840.1.113839.0.100.3.1",
-                "2.16.840.1.113839.0.100.3.2",
-                "2.16.840.1.113839.0.100.14.1",
-                "2.16.840.1.113839.0.100.14.2",
-                "2.16.840.1.113839.0.100.12.1",
-                "2.16.840.1.113839.0.100.12.2",
-                "2.16.840.1.113839.0.100.15.1",
-                "2.16.840.1.113839.0.100.15.2",
-                "2.16.840.1.113839.0.100.18.0",
-                "2.16.840.1.113839.0.100.18.1",
-                "2.16.840.1.113839.0.100.18.2",
-                "2.16.840.1.113839.0.100.19.1",
-                "2.16.840.1.113839.0.100.20.1",
-                "2.16.840.1.113839.0.100.37.1",
-                "2.16.840.1.113839.0.100.37.2",
-                "2.16.840.1.113839.0.100.38.1",
-                "2.16.840.1.113839.0.100.38.2",
-            ];
+                let reencoded = pm.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
 
-            let mut cp_counter = 0;
-            for cp in cps.0 {
-                assert_eq!(ids[cp_counter], cp.policy_identifier.to_string());
-                if 18 == cp_counter {
-                    assert!(cp.policy_qualifiers.is_some());
-                    let pq = cp.policy_qualifiers.unwrap();
-                    let mut counter_pq = 0;
-                    for pqi in pq.iter() {
-                        if 0 == counter_pq {
-                            assert_eq!("1.3.6.1.5.5.7.2.1", pqi.policy_qualifier_id.to_string());
-                            let cpsval =
-                                Ia5StringRef::try_from(pqi.qualifier.as_ref().unwrap()).unwrap();
-                            assert_eq!(
-                                "https://secure.identrust.com/certificates/policy/IGC/index.html",
-                                cpsval.to_string()
-                            );
-                        } else if 1 == counter_pq {
-                            assert_eq!("1.3.6.1.5.5.7.2.2", pqi.policy_qualifier_id.to_string());
-                            // TODO VisibleString
-                        }
-                        counter_pq += 1;
-                    }
-                } else {
-                    assert!(cp.policy_qualifiers.is_none())
+                let subject_domain_policy: [&str; 19] = [
+                    "2.16.840.1.101.3.2.1.48.2",
+                    "2.16.840.1.101.3.2.1.48.2",
+                    "2.16.840.1.101.3.2.1.48.3",
+                    "2.16.840.1.101.3.2.1.48.3",
+                    "2.16.840.1.101.3.2.1.48.5",
+                    "2.16.840.1.101.3.2.1.48.5",
+                    "2.16.840.1.101.3.2.1.48.4",
+                    "2.16.840.1.101.3.2.1.48.4",
+                    "2.16.840.1.101.3.2.1.48.6",
+                    "2.16.840.1.101.3.2.1.48.6",
+                    "2.16.840.1.101.3.2.1.48.78",
+                    "2.16.840.1.101.3.2.1.48.78",
+                    "2.16.840.1.101.3.2.1.48.78",
+                    "2.16.840.1.101.3.2.1.48.79",
+                    "2.16.840.1.101.3.2.1.48.80",
+                    "2.16.840.1.101.3.2.1.48.99",
+                    "2.16.840.1.101.3.2.1.48.99",
+                    "2.16.840.1.101.3.2.1.48.100",
+                    "2.16.840.1.101.3.2.1.48.100",
+                ];
+
+                let issuer_domain_policy: [&str; 19] = [
+                    "2.16.840.1.113839.0.100.2.1",
+                    "2.16.840.1.113839.0.100.2.2",
+                    "2.16.840.1.113839.0.100.3.1",
+                    "2.16.840.1.113839.0.100.3.2",
+                    "2.16.840.1.113839.0.100.14.1",
+                    "2.16.840.1.113839.0.100.14.2",
+                    "2.16.840.1.113839.0.100.12.1",
+                    "2.16.840.1.113839.0.100.12.2",
+                    "2.16.840.1.113839.0.100.15.1",
+                    "2.16.840.1.113839.0.100.15.2",
+                    "2.16.840.1.113839.0.100.18.0",
+                    "2.16.840.1.113839.0.100.18.1",
+                    "2.16.840.1.113839.0.100.18.2",
+                    "2.16.840.1.113839.0.100.19.1",
+                    "2.16.840.1.113839.0.100.20.1",
+                    "2.16.840.1.113839.0.100.37.1",
+                    "2.16.840.1.113839.0.100.37.2",
+                    "2.16.840.1.113839.0.100.38.1",
+                    "2.16.840.1.113839.0.100.38.2",
+                ];
+
+                for (j, mapping) in pm.0.iter().enumerate() {
+                    assert_eq!(
+                        issuer_domain_policy[j],
+                        mapping.issuer_domain_policy.to_string()
+                    );
+                    assert_eq!(
+                        subject_domain_policy[j],
+                        mapping.subject_domain_policy.to_string()
+                    );
                 }
-
-                cp_counter += 1;
             }
-        } else if 4 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_CE_SUBJECT_KEY_IDENTIFIER.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let skid = SubjectKeyIdentifier::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(Length::new(21), skid.0.len());
-            assert_eq!(
-                &hex!("DBD3DEBF0D7B615B32803BC0206CD7AADD39B8ACFF"),
-                skid.0.as_bytes()
-            );
+            3 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_CE_CERTIFICATE_POLICIES.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let cps = CertificatePolicies::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(19, cps.0.len());
 
-            let reencoded = skid.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-        } else if 5 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_CE_CRL_DISTRIBUTION_POINTS.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let crl_dps = CrlDistributionPoints::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(2, crl_dps.0.len());
+                let reencoded = cps.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
 
-            let reencoded = crl_dps.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
+                let ids: [&str; 19] = [
+                    "2.16.840.1.113839.0.100.2.1",
+                    "2.16.840.1.113839.0.100.2.2",
+                    "2.16.840.1.113839.0.100.3.1",
+                    "2.16.840.1.113839.0.100.3.2",
+                    "2.16.840.1.113839.0.100.14.1",
+                    "2.16.840.1.113839.0.100.14.2",
+                    "2.16.840.1.113839.0.100.12.1",
+                    "2.16.840.1.113839.0.100.12.2",
+                    "2.16.840.1.113839.0.100.15.1",
+                    "2.16.840.1.113839.0.100.15.2",
+                    "2.16.840.1.113839.0.100.18.0",
+                    "2.16.840.1.113839.0.100.18.1",
+                    "2.16.840.1.113839.0.100.18.2",
+                    "2.16.840.1.113839.0.100.19.1",
+                    "2.16.840.1.113839.0.100.20.1",
+                    "2.16.840.1.113839.0.100.37.1",
+                    "2.16.840.1.113839.0.100.37.2",
+                    "2.16.840.1.113839.0.100.38.1",
+                    "2.16.840.1.113839.0.100.38.2",
+                ];
 
-            let mut crldp_counter = 0;
-            for crldp in crl_dps.0 {
-                let dpn = crldp.distribution_point.unwrap();
-                if 0 == crldp_counter {
-                    match dpn {
-                        DistributionPointName::FullName(gns) => {
-                            assert_eq!(1, gns.len());
-                            let gn = gns.get(0).unwrap();
+                for (cp_counter, cp) in cps.0.into_iter().enumerate() {
+                    assert_eq!(ids[cp_counter], cp.policy_identifier.to_string());
+                    match cp_counter {
+                        18 => {
+                            assert!(cp.policy_qualifiers.is_some());
+                            let pq = cp.policy_qualifiers.unwrap();
+                            for (pq_counter, pqi) in pq.iter().enumerate() {
+                                match pq_counter {
+                                    0 => {
+                                        assert_eq!(
+                                            "1.3.6.1.5.5.7.2.1",
+                                            pqi.policy_qualifier_id.to_string()
+                                        );
+                                        let cpsval =
+                                            Ia5StringRef::try_from(pqi.qualifier.as_ref().unwrap())
+                                                .unwrap();
+                                        assert_eq!(
+                                            "https://secure.identrust.com/certificates/policy/IGC/index.html",
+                                            cpsval.to_string()
+                                        );
+                                    }
+                                    1 => {
+                                        assert_eq!(
+                                            "1.3.6.1.5.5.7.2.2",
+                                            pqi.policy_qualifier_id.to_string()
+                                        );
+                                        // TODO VisibleString
+                                    }
+                                    _ => unreachable!(),
+                                }
+                            }
+                        }
+                        _ => assert!(cp.policy_qualifiers.is_none()),
+                    }
+                }
+            }
+            4 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_CE_SUBJECT_KEY_IDENTIFIER.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let skid = SubjectKeyIdentifier::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(Length::new(21), skid.0.len());
+                assert_eq!(
+                    &hex!("DBD3DEBF0D7B615B32803BC0206CD7AADD39B8ACFF"),
+                    skid.0.as_bytes()
+                );
+
+                let reencoded = skid.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
+            }
+            5 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_CE_CRL_DISTRIBUTION_POINTS.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let crl_dps = CrlDistributionPoints::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(2, crl_dps.0.len());
+
+                let reencoded = crl_dps.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
+
+                for (crldp_counter, crldp) in crl_dps.0.into_iter().enumerate() {
+                    let dpn = crldp.distribution_point.unwrap();
+                    match crldp_counter {
+                        0 => match dpn {
+                            DistributionPointName::FullName(gns) => {
+                                assert_eq!(1, gns.len());
+                                let gn = gns.first().unwrap();
+                                match gn {
+                                    GeneralName::UniformResourceIdentifier(uri) => {
+                                        assert_eq!(
+                                            "http://crl-pte.identrust.com.test/crl/IGCRootca1.crl",
+                                            uri.to_string()
+                                        );
+                                    }
+                                    _ => {
+                                        panic!("Expected UniformResourceIdentifier");
+                                    }
+                                }
+                            }
+                            _ => {
+                                panic!("Expected FullName");
+                            }
+                        },
+                        1 => match dpn {
+                            DistributionPointName::FullName(gns) => {
+                                assert_eq!(1, gns.len());
+                                let gn = gns.first().unwrap();
+                                match gn {
+                                    GeneralName::UniformResourceIdentifier(uri) => {
+                                        assert_eq!("ldap://ldap-pte.identrust.com.test/cn%3DIGC%20Root%20CA1%2Co%3DIdenTrust%2Cc%3DUS%3FcertificateRevocationList%3Bbinary", uri.to_string());
+                                    }
+                                    _ => {
+                                        panic!("Expected UniformResourceIdentifier");
+                                    }
+                                }
+                            }
+                            _ => {
+                                panic!("Expected UniformResourceIdentifier");
+                            }
+                        },
+                        _ => unreachable!(),
+                    }
+                }
+            }
+            6 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_PE_SUBJECT_INFO_ACCESS.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let sias = SubjectInfoAccessSyntax::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(1, sias.0.len());
+
+                let reencoded = sias.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
+
+                for sia in sias.0 {
+                    assert_eq!("1.3.6.1.5.5.7.48.5", sia.access_method.to_string());
+                    let gn = sia.access_location;
+                    match gn {
+                        GeneralName::UniformResourceIdentifier(gn) => {
+                            assert_eq!(
+                            "http://http.cite.fpki-lab.gov.test/bridge/caCertsIssuedBytestFBCA.p7c",
+                            gn.to_string()
+                        );
+                        }
+                        _ => {
+                            panic!("Expected UniformResourceIdentifier");
+                        }
+                    }
+                }
+            }
+            7 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_PE_AUTHORITY_INFO_ACCESS.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let aias = AuthorityInfoAccessSyntax::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(2, aias.0.len());
+
+                let reencoded = aias.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
+
+                for (aia_counter, aia) in aias.0.into_iter().enumerate() {
+                    match aia_counter {
+                        0 => {
+                            assert_eq!("1.3.6.1.5.5.7.48.2", aia.access_method.to_string());
+                            let gn = aia.access_location;
                             match gn {
-                                GeneralName::UniformResourceIdentifier(uri) => {
+                                GeneralName::UniformResourceIdentifier(gn) => {
                                     assert_eq!(
-                                        "http://crl-pte.identrust.com.test/crl/IGCRootca1.crl",
-                                        uri.to_string()
+                                        "http://apps-stg.identrust.com.test/roots/IGCRootca1.p7c",
+                                        gn.to_string()
                                     );
                                 }
                                 _ => {
@@ -406,133 +497,54 @@
                                 }
                             }
                         }
-                        _ => {
-                            panic!("Expected FullName");
-                        }
-                    }
-                } else if 1 == crldp_counter {
-                    match dpn {
-                        DistributionPointName::FullName(gns) => {
-                            assert_eq!(1, gns.len());
-                            let gn = gns.get(0).unwrap();
+                        1 => {
+                            assert_eq!("1.3.6.1.5.5.7.48.1", aia.access_method.to_string());
+                            let gn = aia.access_location;
                             match gn {
-                                GeneralName::UniformResourceIdentifier(uri) => {
-                                    assert_eq!("ldap://ldap-pte.identrust.com.test/cn%3DIGC%20Root%20CA1%2Co%3DIdenTrust%2Cc%3DUS%3FcertificateRevocationList%3Bbinary", uri.to_string());
+                                GeneralName::UniformResourceIdentifier(gn) => {
+                                    assert_eq!(
+                                        "http://igcrootpte.ocsp.identrust.com.test:8125",
+                                        gn.to_string()
+                                    );
                                 }
                                 _ => {
                                     panic!("Expected UniformResourceIdentifier");
                                 }
                             }
                         }
-                        _ => {
-                            panic!("Expected UniformResourceIdentifier");
-                        }
-                    }
-                }
-
-                crldp_counter += 1;
-            }
-        } else if 6 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_PE_SUBJECT_INFO_ACCESS.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let sias = SubjectInfoAccessSyntax::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(1, sias.0.len());
-
-            let reencoded = sias.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-
-            for sia in sias.0 {
-                assert_eq!("1.3.6.1.5.5.7.48.5", sia.access_method.to_string());
-                let gn = sia.access_location;
-                match gn {
-                    GeneralName::UniformResourceIdentifier(gn) => {
-                        assert_eq!(
-                            "http://http.cite.fpki-lab.gov.test/bridge/caCertsIssuedBytestFBCA.p7c",
-                            gn.to_string()
-                        );
-                    }
-                    _ => {
-                        panic!("Expected UniformResourceIdentifier");
+                        _ => unreachable!(),
                     }
                 }
             }
-        } else if 7 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_PE_AUTHORITY_INFO_ACCESS.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let aias = AuthorityInfoAccessSyntax::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(2, aias.0.len());
-            let mut aia_counter = 0;
+            8 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_CE_INHIBIT_ANY_POLICY.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let iap = InhibitAnyPolicy::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(0, iap.0);
 
-            let reencoded = aias.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-
-            for aia in aias.0 {
-                if 0 == aia_counter {
-                    assert_eq!("1.3.6.1.5.5.7.48.2", aia.access_method.to_string());
-                    let gn = aia.access_location;
-                    match gn {
-                        GeneralName::UniformResourceIdentifier(gn) => {
-                            assert_eq!(
-                                "http://apps-stg.identrust.com.test/roots/IGCRootca1.p7c",
-                                gn.to_string()
-                            );
-                        }
-                        _ => {
-                            panic!("Expected UniformResourceIdentifier");
-                        }
-                    }
-                } else if 1 == aia_counter {
-                    assert_eq!("1.3.6.1.5.5.7.48.1", aia.access_method.to_string());
-                    let gn = aia.access_location;
-                    match gn {
-                        GeneralName::UniformResourceIdentifier(gn) => {
-                            assert_eq!(
-                                "http://igcrootpte.ocsp.identrust.com.test:8125",
-                                gn.to_string()
-                            );
-                        }
-                        _ => {
-                            panic!("Expected UniformResourceIdentifier");
-                        }
-                    }
-                }
-
-                aia_counter += 1;
+                let reencoded = iap.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
             }
-        } else if 8 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_CE_INHIBIT_ANY_POLICY.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let iap = InhibitAnyPolicy::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(0, iap.0);
+            9 => {
+                assert_eq!(
+                    ext.extn_id.to_string(),
+                    ID_CE_AUTHORITY_KEY_IDENTIFIER.to_string()
+                );
+                assert_eq!(ext.critical, false);
+                let akid = AuthorityKeyIdentifier::from_der(ext.extn_value.as_bytes()).unwrap();
+                assert_eq!(
+                    &hex!("7C4C863AB80BD589870BEDB7E11BBD2A08BB3D23FF"),
+                    akid.key_identifier.as_ref().unwrap().as_bytes()
+                );
 
-            let reencoded = iap.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
-        } else if 9 == counter {
-            assert_eq!(
-                ext.extn_id.to_string(),
-                ID_CE_AUTHORITY_KEY_IDENTIFIER.to_string()
-            );
-            assert_eq!(ext.critical, false);
-            let akid = AuthorityKeyIdentifier::from_der(ext.extn_value.as_bytes()).unwrap();
-            assert_eq!(
-                &hex!("7C4C863AB80BD589870BEDB7E11BBD2A08BB3D23FF"),
-                akid.key_identifier.as_ref().unwrap().as_bytes()
-            );
-
-            let reencoded = akid.to_der().and_then(OctetString::new).unwrap();
-            assert_eq!(ext.extn_value, reencoded);
+                let reencoded = akid.to_der().and_then(OctetString::new).unwrap();
+                assert_eq!(ext.extn_value, reencoded);
+            }
+            _ => unreachable!(),
         }
-
-        counter += 1;
     }
 
     let der_encoded_cert = include_bytes!("examples/GoodCACert.crt");
@@ -850,22 +862,15 @@
 
     let gn =
         GeneralName::from_der(&hex!("A45C305A310B3009060355040613025553311F301D060355040A131654657374204365727469666963617465732032303137311C301A060355040B13136F6E6C79536F6D65526561736F6E7320434133310C300A0603550403130343524C")).unwrap();
-    match gn {
-        GeneralName::DirectoryName(gn) => {
-            assert_eq!(4, gn.0.len());
-        }
-        _ => {}
+    if let GeneralName::DirectoryName(gn) = gn {
+        assert_eq!(4, gn.0.len());
     }
 
     let gns =
         GeneralNames::from_der(&hex!("305EA45C305A310B3009060355040613025553311F301D060355040A131654657374204365727469666963617465732032303137311C301A060355040B13136F6E6C79536F6D65526561736F6E7320434133310C300A0603550403130343524C")).unwrap();
     assert_eq!(1, gns.len());
-    let gn = gns.get(0).unwrap();
-    match gn {
-        GeneralName::DirectoryName(gn) => {
-            assert_eq!(4, gn.0.len());
-        }
-        _ => {}
+    if let GeneralName::DirectoryName(gn) = gns.first().unwrap() {
+        assert_eq!(4, gn.0.len());
     }
 
     //TODO - fix decode impl (expecting a SEQUENCE despite this being a CHOICE). Sort out FixedTag implementation.
@@ -887,20 +892,13 @@
 
     let dp =
         DistributionPoint::from_der(&hex!("3062A060A05EA45C305A310B3009060355040613025553311F301D060355040A131654657374204365727469666963617465732032303137311C301A060355040B13136F6E6C79536F6D65526561736F6E7320434133310C300A0603550403130343524C")).unwrap();
-    let dpn = dp.distribution_point.unwrap();
-    match dpn {
-        DistributionPointName::FullName(dpn) => {
-            assert_eq!(1, dpn.len());
-            let gn = dpn.get(0).unwrap();
-            match gn {
-                GeneralName::DirectoryName(gn) => {
-                    assert_eq!(4, gn.0.len());
-                }
-                _ => {}
-            }
+    if let DistributionPointName::FullName(dpn) = dp.distribution_point.unwrap() {
+        assert_eq!(1, dpn.len());
+        if let GeneralName::DirectoryName(gn) = dpn.first().unwrap() {
+            assert_eq!(4, gn.0.len());
         }
-        _ => {}
     }
+
     assert!(dp.crl_issuer.is_none());
     assert!(dp.reasons.is_none());
 
diff --git a/crates/zerocopy-derive/.android-checksum.json b/crates/zerocopy-derive/.android-checksum.json
index 41eb25e..5675260 100644
--- a/crates/zerocopy-derive/.android-checksum.json
+++ b/crates/zerocopy-derive/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"287b9de02b9cdc016210f615e38fbffd2cdfeb09f6b3bdceb4696b35ada7e61c","Android.bp":"52c5a67c3604efcea727e3964b2e0ef1f957f402517ad11c17de12a7db15ecc6","Cargo.toml":"aff2bfb47f671c6f7bd278d0ec3709af5105595e6d1956f92ee6c13b365c9047","LICENSE":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-APACHE":"06f9864e3037a400a7f71dc1aa0f21e02424bc6a1e64830f099968dd03829208","LICENSE-BSD":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-MIT":"3e24ce9879b9a289b7413493fe10221df3551f197741ceeef6c38680dd1bf44f","METADATA":"e911eae565bdc9d969abf037db98ca30c15061db87ddcf21c700883a1c74a3f4","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"3d5b3f68b29cddd9a4914e197f6c58b71a60e1dd603641a1834a046255d6d13e","cargo_embargo.json":"33717aa4950cc0a843d50cf4d752fec82e2508e9967d4e5afe9a15c941fa0474","patches/LICENSE.patch":"fcafb83042215e4a906214694a50d4a76f333aadb3fcd6bee8547f3831c0b1a4","src/enum.rs":"2852e4f8b6830a81d20e35352618d2d5a0202a9d7007cf3073d46300de9529da","src/ext.rs":"e4ec13ba55bef86ad26761814a4f89265afd324d82d7c2a208aec02a35995cf4","src/lib.rs":"551e25daace091cf5b8729e1376619f7ecdf45b745c326f9519b395b5c2320c9","src/output_tests.rs":"35e5c89c35f64aa9f95e3b1e79e3a37b5a4689130d7835a4dae59421011b8d38","src/repr.rs":"a089e6413bd65c6b2794cbd94d1e2f4395b416dbc149ba5fc7567d59badaebae","tests/deprecated.rs":"0c0a7b634670fd922c10249dc610cff475685c7f8eddf40b768c035dc3f6a17f","tests/enum_from_zeros.rs":"4e9b6b1d2010276dc6f7148661bd753034ff4046458566e074270b543aeda3f7","tests/enum_known_layout.rs":"8706a65ac5cddcfeca6e9fc9a9ddfe85bb2439f7131d61f809abee67e71f295e","tests/enum_no_cell.rs":"2598305734b25e2f2603b193f8b3de749a3c38aa07bc15810714f6352e877d11","tests/enum_to_bytes.rs":"fbeea1398ee2e0a5884df26491496d117123c05d6690c2318642dfbd870809fe","tests/enum_try_from_bytes.rs":"1de55f76a23f03a5c13415db922b17f8531241686fd1b90e488f30d4bb59e96f","tests/enum_unaligned.rs":"39874beccbc15926c94eff003179babd3b5296dc9f0a47d7d517b693aeab2423","tests/hygiene.rs":"bff9a0b5ed4bc0c29b9a943acddd888ef85264cb28f3794579657e9c79ccd143","tests/include.rs":"ec5107c776d780ab595018447d7bb79ef21fffca0033053fabdb50a660898e46","tests/issue_2117.rs":"110dd4df5c464a9b02d29a2c90c9399dc1c9da62f25c06a6e9f07a25c9090ec5","tests/paths_and_modules.rs":"cb236f45352d641dc3fe48e34f83a4e4d1b3ee63aea19f70968b6b609da3dbbe","tests/priv_in_pub.rs":"1775c99899c66b15d0951dd03ee84e65dda736eaa64895340ae2a96dc436b3ea","tests/struct_from_bytes.rs":"56ee10792f5151079c799ffac9175c7c81939ae860cc7094ad175c59c900c949","tests/struct_from_zeros.rs":"451a0c4bbda2b864fda704006af8924a68a048663a3866bbf8fba5a4a6c70d55","tests/struct_known_layout.rs":"1a9c4b609a8fb20ca2351a4fa0315e5b5a4b94030ddb876ba91660de4a95fe39","tests/struct_no_cell.rs":"bc752c287297a3cdd72e2a7d04d761351d70ba9ed9b52d48f6013b6828eb7999","tests/struct_to_bytes.rs":"0524f1c2bed3d61aecafc773a0083daff06aaff64d86561358eef670e7ccacc6","tests/struct_try_from_bytes.rs":"6f0ee0a5556d7e7da2e1e7e355e0fbaa7d65ef91cc2c9684b3b56e761a2af732","tests/struct_unaligned.rs":"aeae9c670e0c0c0ccb8d79835453ca7997b4463d66ffa933cc33b6c16e763cc8","tests/trybuild.rs":"6bd309c9df870ee2c95f6009708d4c2f3c5f6710fddcd115fe97603e44ac6283","tests/ui-msrv/derive_transparent.rs":"154b27e419fd1ff4a5aeeff3933b991fb76091254862b3a8a21de5d64d5d2cf8","tests/ui-msrv/derive_transparent.stderr":"e8fa237daf922a7f56efe2b6434835159d5720be2358148187d46ba51d9470f9","tests/ui-msrv/enum.rs":"f40df2de87dc984dc71804de50fff1365df4786f015ed2663af72abee437a048","tests/ui-msrv/enum.stderr":"400846355a435f31db7fcd18dc959df6ac668e6ae80ce5a237238a3b80cdbca8","tests/ui-msrv/enum_from_bytes_u8_too_few.rs":"7ebf87ce92ba9d3371a9cd58f370d15c74ae7a04877d1a590042fba22e36c214","tests/ui-msrv/enum_from_bytes_u8_too_few.stderr":"52c1f193303999816f7b0757a11117c4ea56f7e7ae73438efe5e8e45b1d53148","tests/ui-msrv/late_compile_pass.rs":"e8e0e441f6eca2942e5b096d93a45743a898b845450a635be26a1f21490f5139","tests/ui-msrv/late_compile_pass.stderr":"9a60b1de3f7f8bbce32cc4243c5a535c97676dc49929db035b90e5e97b94b41f","tests/ui-msrv/mid_compile_pass.rs":"ab8d748f6e4ba10396281350dbc9b381563241e41fbdee6c2ac951dd782cd34b","tests/ui-msrv/mid_compile_pass.stderr":"8db06292e6f738b9f96c2c4b57ddae236a53a3c6a37f97c5ec877b19c4e84d9c","tests/ui-msrv/msrv_specific.rs":"8672b910e03ad7e0cb6a8133cf33dfcb671600fe584f23988c3391c8fd1b5034","tests/ui-msrv/msrv_specific.stderr":"7e1574819905920427ed9c0e142312bc9a694b78ded640062eed825d102fa8ae","tests/ui-msrv/struct.rs":"b5f0bb698052a82e835922cc485a98acd93f793a592a40e038eebafbb1d1c664","tests/ui-msrv/struct.stderr":"31ab458c01a6d061dabf629993ae16f78e224650b5139f4297df27b5c4626389","tests/ui-msrv/union.rs":"9197226c356c294e1818bf90df5dcfdcf68470e4b110c6fd37bd9b5668a16d6c","tests/ui-msrv/union.stderr":"116d11f3dc0e8c48b34b97a35acd77bdfae89d6f6e04943c4187bc7cebda3c2f","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.rs":"95458a42b8ccf01507c061d605a670f3424b15c2c9c7d487145c0cb551e3bbf7","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"c50fa04bfada2b6caa57e5e47565e062c4966dae84bf653c6b1c1de7db8cd3ad","tests/ui-nightly/absence_of_deprecated_warning.rs":"57bfe124352c8ffaaad27236337fa9e36892c045961a63945de20d305d717d71","tests/ui-nightly/absence_of_deprecated_warning.stderr":"2e949ae43339d3266b521c044df1c83467564048cb83f331af424f84ffc1304d","tests/ui-nightly/derive_transparent.rs":"154b27e419fd1ff4a5aeeff3933b991fb76091254862b3a8a21de5d64d5d2cf8","tests/ui-nightly/derive_transparent.stderr":"eb166d27369594f686ffeb14b06bdda1171abe503ad9ccc198b902036882075a","tests/ui-nightly/enum.rs":"f40df2de87dc984dc71804de50fff1365df4786f015ed2663af72abee437a048","tests/ui-nightly/enum.stderr":"c396d5cb9ebb2a2360ec6cb19cdc840342ccd35a9d090645fc0dacfb094f93d4","tests/ui-nightly/enum_from_bytes_u8_too_few.rs":"7ebf87ce92ba9d3371a9cd58f370d15c74ae7a04877d1a590042fba22e36c214","tests/ui-nightly/enum_from_bytes_u8_too_few.stderr":"5f54bc513207b3eb7486c47fab46ddb2717593aa85f992659d536950024ad988","tests/ui-nightly/late_compile_pass.rs":"e8e0e441f6eca2942e5b096d93a45743a898b845450a635be26a1f21490f5139","tests/ui-nightly/late_compile_pass.stderr":"d2d2bb3fbb2a7bbd2e97ee174f3058edc5f8cadd712cccb8084183b08f2d3056","tests/ui-nightly/mid_compile_pass.rs":"ab8d748f6e4ba10396281350dbc9b381563241e41fbdee6c2ac951dd782cd34b","tests/ui-nightly/mid_compile_pass.stderr":"c781918015830abd9555365ba70b39d0fedc37baf452a5918511a5cf79017184","tests/ui-nightly/struct.rs":"b5f0bb698052a82e835922cc485a98acd93f793a592a40e038eebafbb1d1c664","tests/ui-nightly/struct.stderr":"f2e83f59aff8954c2110d0d6147d9a317af7b2ef8a4e638f8248e6575a6c4819","tests/ui-nightly/union.rs":"9197226c356c294e1818bf90df5dcfdcf68470e4b110c6fd37bd9b5668a16d6c","tests/ui-nightly/union.stderr":"8dfb47f797306387088b503376926bbe9d699166de64a0e4e892df58c537ac08","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.rs":"95458a42b8ccf01507c061d605a670f3424b15c2c9c7d487145c0cb551e3bbf7","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"10aea1f93a8619febbe4ca9500adba4974608db2a7817c1f277337c4b3871c38","tests/ui-stable/derive_transparent.rs":"154b27e419fd1ff4a5aeeff3933b991fb76091254862b3a8a21de5d64d5d2cf8","tests/ui-stable/derive_transparent.stderr":"47f79e545be7ecf1906e19b8a66d3d57d6e0b5e222813604a6379d9caf35ab58","tests/ui-stable/enum.rs":"f40df2de87dc984dc71804de50fff1365df4786f015ed2663af72abee437a048","tests/ui-stable/enum.stderr":"ff1a5193f55a13c4a37b60635eb4fca22593ccf48046abfae5adff8b64957a27","tests/ui-stable/enum_from_bytes_u8_too_few.rs":"7ebf87ce92ba9d3371a9cd58f370d15c74ae7a04877d1a590042fba22e36c214","tests/ui-stable/enum_from_bytes_u8_too_few.stderr":"cc0181d1f9979c91dc39355e09bedd930a812efb05d55936e60f95f687a257b8","tests/ui-stable/late_compile_pass.rs":"e8e0e441f6eca2942e5b096d93a45743a898b845450a635be26a1f21490f5139","tests/ui-stable/late_compile_pass.stderr":"99f34197cda3da5aa6c1deeb56655322de5c137d6a971ba6b57dd6b0511a1ca4","tests/ui-stable/mid_compile_pass.rs":"ab8d748f6e4ba10396281350dbc9b381563241e41fbdee6c2ac951dd782cd34b","tests/ui-stable/mid_compile_pass.stderr":"0bdd0bbf6342b284a1027279324b8e8c20b1d764a445f1e6c7732478ff1f43d5","tests/ui-stable/struct.rs":"b5f0bb698052a82e835922cc485a98acd93f793a592a40e038eebafbb1d1c664","tests/ui-stable/struct.stderr":"c796ae9e821d2930a78480e34cb235a74e49dd60e7c9ef7b90bb651d39b9adb1","tests/ui-stable/union.rs":"9197226c356c294e1818bf90df5dcfdcf68470e4b110c6fd37bd9b5668a16d6c","tests/ui-stable/union.stderr":"41ec21825e2599ea385f96a7f91ddf488ad6fbad1f272dc5a8f93c81ee6b0182","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.rs":"95458a42b8ccf01507c061d605a670f3424b15c2c9c7d487145c0cb551e3bbf7","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"a301e2d8a779bf19ac746e85c22285e2dcaa9ae319053db2f89268c25467845f","tests/union_from_bytes.rs":"d507f7b2817b0b9e47e8b5632204b0b4efc81cf5bf39c03beeb1f123b143b9c9","tests/union_from_zeros.rs":"05af073a7045e641e1fa85de00ee18c9ca844c368dcf4dbe0727d11eff82bc38","tests/union_known_layout.rs":"9ae5f1813b6871c9b4e327afd09523d3427751297af661384c0c3ff0924d2659","tests/union_no_cell.rs":"050c9bb79ea00b07457069b4a0ae30c9dc8c2284596e6a36d08d7f72f073aab2","tests/union_to_bytes.rs":"79d210d161567b23f26c1e6eab8bd28348880cb3dce4047aa6b82ce9a7b1566e","tests/union_try_from_bytes.rs":"1aad3f7493a30426e680fb4ef5f1a7fd61cb1bc1cae10f86539b6c32a2eeaf37","tests/union_unaligned.rs":"40b6ad76ce60d20cf8c5107f3bbfac7ba9196c7c043506fbb5e9136b063e1e29"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"e04e5ded577626d499478f2debe9e37410bba4af6486538bd541ed80d62965dd","Android.bp":"3b528c21b9a02644061dde175cfdb14fca7e6c092d3b6d869306112e647a41d8","Cargo.toml":"1682efe9481ee82858103fc67f249cb7c969d161fa3d5eea7126e514aa8be8d9","LICENSE":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-APACHE":"06f9864e3037a400a7f71dc1aa0f21e02424bc6a1e64830f099968dd03829208","LICENSE-BSD":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-MIT":"3e24ce9879b9a289b7413493fe10221df3551f197741ceeef6c38680dd1bf44f","METADATA":"3952fed596328d558b3a5027efc62dfed584877f64081a3605d3f2b5f70acf4c","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","TEST_MAPPING":"3d5b3f68b29cddd9a4914e197f6c58b71a60e1dd603641a1834a046255d6d13e","cargo_embargo.json":"33717aa4950cc0a843d50cf4d752fec82e2508e9967d4e5afe9a15c941fa0474","patches/LICENSE.patch":"fcafb83042215e4a906214694a50d4a76f333aadb3fcd6bee8547f3831c0b1a4","src/enum.rs":"2852e4f8b6830a81d20e35352618d2d5a0202a9d7007cf3073d46300de9529da","src/ext.rs":"e4ec13ba55bef86ad26761814a4f89265afd324d82d7c2a208aec02a35995cf4","src/lib.rs":"0253bb5773969bddba4328fac15a7697fd5d965e6c42fbae34890867c515aff1","src/output_tests.rs":"489a26383541f1a1a1b05c8a5f53525dcbaf3e9751592565a8619428314474b7","src/repr.rs":"a089e6413bd65c6b2794cbd94d1e2f4395b416dbc149ba5fc7567d59badaebae","tests/deprecated.rs":"0c0a7b634670fd922c10249dc610cff475685c7f8eddf40b768c035dc3f6a17f","tests/enum_from_zeros.rs":"4e9b6b1d2010276dc6f7148661bd753034ff4046458566e074270b543aeda3f7","tests/enum_known_layout.rs":"8706a65ac5cddcfeca6e9fc9a9ddfe85bb2439f7131d61f809abee67e71f295e","tests/enum_no_cell.rs":"2598305734b25e2f2603b193f8b3de749a3c38aa07bc15810714f6352e877d11","tests/enum_to_bytes.rs":"fbeea1398ee2e0a5884df26491496d117123c05d6690c2318642dfbd870809fe","tests/enum_try_from_bytes.rs":"1de55f76a23f03a5c13415db922b17f8531241686fd1b90e488f30d4bb59e96f","tests/enum_unaligned.rs":"39874beccbc15926c94eff003179babd3b5296dc9f0a47d7d517b693aeab2423","tests/hash.rs":"d0f5102ada65411bdc5e4804a965a4d00918445df36540cc1c20b3314884da44","tests/hygiene.rs":"bff9a0b5ed4bc0c29b9a943acddd888ef85264cb28f3794579657e9c79ccd143","tests/include.rs":"1f149294ad3cffd5e7f41556a123a36eda4882a0457c20d4a679977fbe716dbe","tests/issue_2117.rs":"110dd4df5c464a9b02d29a2c90c9399dc1c9da62f25c06a6e9f07a25c9090ec5","tests/paths_and_modules.rs":"cb236f45352d641dc3fe48e34f83a4e4d1b3ee63aea19f70968b6b609da3dbbe","tests/priv_in_pub.rs":"1775c99899c66b15d0951dd03ee84e65dda736eaa64895340ae2a96dc436b3ea","tests/struct_from_bytes.rs":"56ee10792f5151079c799ffac9175c7c81939ae860cc7094ad175c59c900c949","tests/struct_from_zeros.rs":"451a0c4bbda2b864fda704006af8924a68a048663a3866bbf8fba5a4a6c70d55","tests/struct_known_layout.rs":"1a9c4b609a8fb20ca2351a4fa0315e5b5a4b94030ddb876ba91660de4a95fe39","tests/struct_no_cell.rs":"bc752c287297a3cdd72e2a7d04d761351d70ba9ed9b52d48f6013b6828eb7999","tests/struct_to_bytes.rs":"0524f1c2bed3d61aecafc773a0083daff06aaff64d86561358eef670e7ccacc6","tests/struct_try_from_bytes.rs":"6f0ee0a5556d7e7da2e1e7e355e0fbaa7d65ef91cc2c9684b3b56e761a2af732","tests/struct_unaligned.rs":"aeae9c670e0c0c0ccb8d79835453ca7997b4463d66ffa933cc33b6c16e763cc8","tests/trybuild.rs":"6bd309c9df870ee2c95f6009708d4c2f3c5f6710fddcd115fe97603e44ac6283","tests/ui-msrv/derive_transparent.rs":"154b27e419fd1ff4a5aeeff3933b991fb76091254862b3a8a21de5d64d5d2cf8","tests/ui-msrv/derive_transparent.stderr":"e8fa237daf922a7f56efe2b6434835159d5720be2358148187d46ba51d9470f9","tests/ui-msrv/enum.rs":"f40df2de87dc984dc71804de50fff1365df4786f015ed2663af72abee437a048","tests/ui-msrv/enum.stderr":"400846355a435f31db7fcd18dc959df6ac668e6ae80ce5a237238a3b80cdbca8","tests/ui-msrv/enum_from_bytes_u8_too_few.rs":"7ebf87ce92ba9d3371a9cd58f370d15c74ae7a04877d1a590042fba22e36c214","tests/ui-msrv/enum_from_bytes_u8_too_few.stderr":"52c1f193303999816f7b0757a11117c4ea56f7e7ae73438efe5e8e45b1d53148","tests/ui-msrv/late_compile_pass.rs":"e8e0e441f6eca2942e5b096d93a45743a898b845450a635be26a1f21490f5139","tests/ui-msrv/late_compile_pass.stderr":"9a60b1de3f7f8bbce32cc4243c5a535c97676dc49929db035b90e5e97b94b41f","tests/ui-msrv/mid_compile_pass.rs":"ab8d748f6e4ba10396281350dbc9b381563241e41fbdee6c2ac951dd782cd34b","tests/ui-msrv/mid_compile_pass.stderr":"8db06292e6f738b9f96c2c4b57ddae236a53a3c6a37f97c5ec877b19c4e84d9c","tests/ui-msrv/msrv_specific.rs":"8672b910e03ad7e0cb6a8133cf33dfcb671600fe584f23988c3391c8fd1b5034","tests/ui-msrv/msrv_specific.stderr":"7e1574819905920427ed9c0e142312bc9a694b78ded640062eed825d102fa8ae","tests/ui-msrv/struct.rs":"b5f0bb698052a82e835922cc485a98acd93f793a592a40e038eebafbb1d1c664","tests/ui-msrv/struct.stderr":"31ab458c01a6d061dabf629993ae16f78e224650b5139f4297df27b5c4626389","tests/ui-msrv/union.rs":"9197226c356c294e1818bf90df5dcfdcf68470e4b110c6fd37bd9b5668a16d6c","tests/ui-msrv/union.stderr":"116d11f3dc0e8c48b34b97a35acd77bdfae89d6f6e04943c4187bc7cebda3c2f","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.rs":"95458a42b8ccf01507c061d605a670f3424b15c2c9c7d487145c0cb551e3bbf7","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"c50fa04bfada2b6caa57e5e47565e062c4966dae84bf653c6b1c1de7db8cd3ad","tests/ui-nightly/absence_of_deprecated_warning.rs":"57bfe124352c8ffaaad27236337fa9e36892c045961a63945de20d305d717d71","tests/ui-nightly/absence_of_deprecated_warning.stderr":"2e949ae43339d3266b521c044df1c83467564048cb83f331af424f84ffc1304d","tests/ui-nightly/derive_transparent.rs":"154b27e419fd1ff4a5aeeff3933b991fb76091254862b3a8a21de5d64d5d2cf8","tests/ui-nightly/derive_transparent.stderr":"eb166d27369594f686ffeb14b06bdda1171abe503ad9ccc198b902036882075a","tests/ui-nightly/enum.rs":"f40df2de87dc984dc71804de50fff1365df4786f015ed2663af72abee437a048","tests/ui-nightly/enum.stderr":"c396d5cb9ebb2a2360ec6cb19cdc840342ccd35a9d090645fc0dacfb094f93d4","tests/ui-nightly/enum_from_bytes_u8_too_few.rs":"7ebf87ce92ba9d3371a9cd58f370d15c74ae7a04877d1a590042fba22e36c214","tests/ui-nightly/enum_from_bytes_u8_too_few.stderr":"5f54bc513207b3eb7486c47fab46ddb2717593aa85f992659d536950024ad988","tests/ui-nightly/late_compile_pass.rs":"e8e0e441f6eca2942e5b096d93a45743a898b845450a635be26a1f21490f5139","tests/ui-nightly/late_compile_pass.stderr":"d2d2bb3fbb2a7bbd2e97ee174f3058edc5f8cadd712cccb8084183b08f2d3056","tests/ui-nightly/mid_compile_pass.rs":"ab8d748f6e4ba10396281350dbc9b381563241e41fbdee6c2ac951dd782cd34b","tests/ui-nightly/mid_compile_pass.stderr":"c781918015830abd9555365ba70b39d0fedc37baf452a5918511a5cf79017184","tests/ui-nightly/struct.rs":"b5f0bb698052a82e835922cc485a98acd93f793a592a40e038eebafbb1d1c664","tests/ui-nightly/struct.stderr":"f2e83f59aff8954c2110d0d6147d9a317af7b2ef8a4e638f8248e6575a6c4819","tests/ui-nightly/union.rs":"9197226c356c294e1818bf90df5dcfdcf68470e4b110c6fd37bd9b5668a16d6c","tests/ui-nightly/union.stderr":"8dfb47f797306387088b503376926bbe9d699166de64a0e4e892df58c537ac08","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.rs":"95458a42b8ccf01507c061d605a670f3424b15c2c9c7d487145c0cb551e3bbf7","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"10aea1f93a8619febbe4ca9500adba4974608db2a7817c1f277337c4b3871c38","tests/ui-stable/derive_transparent.rs":"154b27e419fd1ff4a5aeeff3933b991fb76091254862b3a8a21de5d64d5d2cf8","tests/ui-stable/derive_transparent.stderr":"47f79e545be7ecf1906e19b8a66d3d57d6e0b5e222813604a6379d9caf35ab58","tests/ui-stable/enum.rs":"f40df2de87dc984dc71804de50fff1365df4786f015ed2663af72abee437a048","tests/ui-stable/enum.stderr":"ff1a5193f55a13c4a37b60635eb4fca22593ccf48046abfae5adff8b64957a27","tests/ui-stable/enum_from_bytes_u8_too_few.rs":"7ebf87ce92ba9d3371a9cd58f370d15c74ae7a04877d1a590042fba22e36c214","tests/ui-stable/enum_from_bytes_u8_too_few.stderr":"cc0181d1f9979c91dc39355e09bedd930a812efb05d55936e60f95f687a257b8","tests/ui-stable/late_compile_pass.rs":"e8e0e441f6eca2942e5b096d93a45743a898b845450a635be26a1f21490f5139","tests/ui-stable/late_compile_pass.stderr":"99f34197cda3da5aa6c1deeb56655322de5c137d6a971ba6b57dd6b0511a1ca4","tests/ui-stable/mid_compile_pass.rs":"ab8d748f6e4ba10396281350dbc9b381563241e41fbdee6c2ac951dd782cd34b","tests/ui-stable/mid_compile_pass.stderr":"0bdd0bbf6342b284a1027279324b8e8c20b1d764a445f1e6c7732478ff1f43d5","tests/ui-stable/struct.rs":"b5f0bb698052a82e835922cc485a98acd93f793a592a40e038eebafbb1d1c664","tests/ui-stable/struct.stderr":"c796ae9e821d2930a78480e34cb235a74e49dd60e7c9ef7b90bb651d39b9adb1","tests/ui-stable/union.rs":"9197226c356c294e1818bf90df5dcfdcf68470e4b110c6fd37bd9b5668a16d6c","tests/ui-stable/union.stderr":"41ec21825e2599ea385f96a7f91ddf488ad6fbad1f272dc5a8f93c81ee6b0182","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.rs":"95458a42b8ccf01507c061d605a670f3424b15c2c9c7d487145c0cb551e3bbf7","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"a301e2d8a779bf19ac746e85c22285e2dcaa9ae319053db2f89268c25467845f","tests/union_from_bytes.rs":"d507f7b2817b0b9e47e8b5632204b0b4efc81cf5bf39c03beeb1f123b143b9c9","tests/union_from_zeros.rs":"05af073a7045e641e1fa85de00ee18c9ca844c368dcf4dbe0727d11eff82bc38","tests/union_known_layout.rs":"9ae5f1813b6871c9b4e327afd09523d3427751297af661384c0c3ff0924d2659","tests/union_no_cell.rs":"050c9bb79ea00b07457069b4a0ae30c9dc8c2284596e6a36d08d7f72f073aab2","tests/union_to_bytes.rs":"79d210d161567b23f26c1e6eab8bd28348880cb3dce4047aa6b82ce9a7b1566e","tests/union_try_from_bytes.rs":"1aad3f7493a30426e680fb4ef5f1a7fd61cb1bc1cae10f86539b6c32a2eeaf37","tests/union_unaligned.rs":"40b6ad76ce60d20cf8c5107f3bbfac7ba9196c7c043506fbb5e9136b063e1e29"}}
\ No newline at end of file
diff --git a/crates/zerocopy-derive/.cargo-checksum.json b/crates/zerocopy-derive/.cargo-checksum.json
index d7942f0..a255452 100644
--- a/crates/zerocopy-derive/.cargo-checksum.json
+++ b/crates/zerocopy-derive/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"b6a94140da85890d3243c656bea4a4003c651111acff06449a7f09aa67fece3a","LICENSE-APACHE":"9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3","LICENSE-BSD":"83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32","LICENSE-MIT":"1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df","src/enum.rs":"2baa96d4c5f9b01271f846975288fbc8b035c8ab9a34e9152efd9c6540674fc2","src/ext.rs":"a58f64d086dfb94011b23c7edbcf277c47f3500cb3229fe290c7511afa439695","src/lib.rs":"7eab586a3bb8de395700f3d65c92f87566c5bf97289cb2c041ff79b0933cbba2","src/output_tests.rs":"b5a65b35761e6b720fc1bae2a15cf2f6d40e2662f1f075540c3ec5832683fec9","src/repr.rs":"04c3399caec0b12fd3cd070391ab813f429dcb7eb05d004714c0f39b21d69399","tests/deprecated.rs":"a8c7e51d3c43fcea40fd1873f5237ad1e6d8f12e2b011f012d0bafa484da245b","tests/enum_from_zeros.rs":"1e712a2802195af290c7ebefb8645158eef96698dfb93b323f9ce234e878c58d","tests/enum_known_layout.rs":"9a36492810c0a7744e651dc8dd8a5749a81dd678b8cd6713ebe3aaa5fe17d7e6","tests/enum_no_cell.rs":"0024ffbd04551350ff2c4d8c4262fc22ebadc599d1f641bedf1bf24d6a060c78","tests/enum_to_bytes.rs":"cf7d0c482e833d2b4f6f677f4c45495f654bdc4862b5044a183dea56533a2e7a","tests/enum_try_from_bytes.rs":"f6d3ce1277182cc659286c01f6eaf52220c10ff0290b23865268a69a67556daf","tests/enum_unaligned.rs":"e04c9d1fa0f8abcd2353cab94015da010e2b3bdee65e23186c7bd13ff89d54c3","tests/hygiene.rs":"5ee71dbb525e5e40161e9b886d322b2969c60da152c2e87c59e759fc24cd143d","tests/include.rs":"1ef29aa27e728c755a3bb562d063a8e5c62e4aad6e99c5673f121a52dc37ebf8","tests/issue_2117.rs":"7cd6480a9684c7efe915753057973363a0e2bce93bea5a85d3139ea9b2f519bd","tests/paths_and_modules.rs":"07a0cc3006e5b60dd32fb0530fa4e5c9e4438d38b3cdd4eb7aca456e6f45a121","tests/priv_in_pub.rs":"790751822cd2101b90d039d2d8d0dbff49dd1b0ab57a39d6ddcdc395988bfbe8","tests/struct_from_bytes.rs":"95dc1d2fec9917044da0bad9a4e217641f3052f95bb8d5f7511fdf72683ce040","tests/struct_from_zeros.rs":"3436b3c34d0ccd69b456dc41264a6c5d3af60f1f955e08f6475cc9ace3cd5f95","tests/struct_known_layout.rs":"dde768e2f6f77bffc60d6cac00c2ae63689569b5c9a1b940fae1eff1221013a8","tests/struct_no_cell.rs":"aea0ef4836d5ad38a968304ea57a2cbf46c8b60864c98dd421c72b3369aafb6c","tests/struct_to_bytes.rs":"ac07b1ee60886058533ac14d54226ebdaf0ac1652671b22df14ac0f017ce4bc0","tests/struct_try_from_bytes.rs":"0641bf24bfc8b712c3d33a4b1f9c1b297f9eae3f3cbee55f67597ddf7111b29b","tests/struct_unaligned.rs":"405ac720c3ce5f6b63ca17248455d45ca92967f8a43b3f347deec03fdb841c6e","tests/trybuild.rs":"c53d036fc0fceb5fd49405c779c1be74e66bd37f66e5f2492cb208df7b86f709","tests/ui-msrv/derive_transparent.rs":"a822e79244df0da55fad83b8cde327f3c1dab7011c8e0b828221d3921537f9ad","tests/ui-msrv/derive_transparent.stderr":"4e9ba3634e4552a9b30a7c654bd56505612ad73a322858066942423e26072ea0","tests/ui-msrv/enum.rs":"cbaa483762e1f9ba8448279d740cf5ad9444b144aa9fc31300cfb89cfc123db9","tests/ui-msrv/enum.stderr":"ac9768eef0dd67a70072e91ee199316203dabad13764f01e5e286e9c847c098d","tests/ui-msrv/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-msrv/enum_from_bytes_u8_too_few.stderr":"a5ab2757166ef9dfa51a09d3dbddd5e9e2b1a46bd3d4b8d175b33a90747878d7","tests/ui-msrv/late_compile_pass.rs":"99b0efefd16ca266c24425342a8926925f03e5bea904d8bd162c9a9ce9469795","tests/ui-msrv/late_compile_pass.stderr":"eb7523a102dc99c5c69403786f4fcefad964cff540798a9e9dc6d9bb72bdad9a","tests/ui-msrv/mid_compile_pass.rs":"b80b01bfd383c537173f7d630ec2789a2af3e01bc6d53c807fdcf271b235d0c9","tests/ui-msrv/mid_compile_pass.stderr":"02f51290ac6e31ebab51d7917df644163f6c2346877506d7debe8a6351acda95","tests/ui-msrv/msrv_specific.rs":"ab1dff9c90664ceb2601d1b88cfca76a4adfc9677ebc961316dc7be702520fb6","tests/ui-msrv/msrv_specific.stderr":"be1995eb73835ce7eb3df71b24c57ea667a96085124cb4ebfe55b0e6b484ab4b","tests/ui-msrv/struct.rs":"93f99d83adba0496f21d188add6a1cbec61b0186ad554dd54edf62c7cb836fde","tests/ui-msrv/struct.stderr":"837da74233b2ab21ba32973a5e4e6b54b7259a330cc1e445620c81430ce2fc12","tests/ui-msrv/union.rs":"d93cb6114533bcff6523b5add3927bcf560d16d2582c86f92b50671c644a9578","tests/ui-msrv/union.stderr":"4ea81d37fc2d035433177548d3d6a78c28085c6758db66dd6344c1d6b1f12a43","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.rs":"a0168adcd0dfdc46e84421937c704b713a1307a4fc2efc19bac5dc32f6758e89","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"0b9af4f767cc1d6fc591d75b046d31617b5230f012d8ce7c70d7c20ffd6178ca","tests/ui-nightly/absence_of_deprecated_warning.rs":"126083dc4f3efaa51c0606ab68073fea904dc3f71805782b47117bb4ca563b44","tests/ui-nightly/absence_of_deprecated_warning.stderr":"7177d3bbc4b897037c34775f801baef8461483d55915443f07a165f67c5b5f16","tests/ui-nightly/derive_transparent.rs":"a822e79244df0da55fad83b8cde327f3c1dab7011c8e0b828221d3921537f9ad","tests/ui-nightly/derive_transparent.stderr":"bb141d3aef830b0ad6e64937e79a32ab9e9298fbbe83c0a45f34606d111238c3","tests/ui-nightly/enum.rs":"cbaa483762e1f9ba8448279d740cf5ad9444b144aa9fc31300cfb89cfc123db9","tests/ui-nightly/enum.stderr":"ba09f885bd9c2882a8ec5cfb1f30170ff145013acefc1a66ffd6a11993ba0d26","tests/ui-nightly/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-nightly/enum_from_bytes_u8_too_few.stderr":"28a493e1057279ea8e20df49ff0c02dfa132027a86bb6f5fe50e250c14e62572","tests/ui-nightly/late_compile_pass.rs":"99b0efefd16ca266c24425342a8926925f03e5bea904d8bd162c9a9ce9469795","tests/ui-nightly/late_compile_pass.stderr":"e994f152e0494c0dd7c52758183df73657e0f4841b35d2f021fdf8e11261a67d","tests/ui-nightly/mid_compile_pass.rs":"b80b01bfd383c537173f7d630ec2789a2af3e01bc6d53c807fdcf271b235d0c9","tests/ui-nightly/mid_compile_pass.stderr":"b0808ea3394f4bfd5d56adbc823e9afc1ac8926ab86a8a8f4a4145b663ebcb72","tests/ui-nightly/struct.rs":"93f99d83adba0496f21d188add6a1cbec61b0186ad554dd54edf62c7cb836fde","tests/ui-nightly/struct.stderr":"8bb51f0abed533e2a53e271a711c8a08d0c0a78eb2c44fd3e3482066ce49bdb5","tests/ui-nightly/union.rs":"d93cb6114533bcff6523b5add3927bcf560d16d2582c86f92b50671c644a9578","tests/ui-nightly/union.stderr":"73fbf7dae03658a6f201bcfd82b1fbc47992c0419bc5660a47417f7d797283cd","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.rs":"a0168adcd0dfdc46e84421937c704b713a1307a4fc2efc19bac5dc32f6758e89","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"6b5ac99d2da1ae8bf8d3f918854a934e567f5392ddaff6f5e8d3fbed86574a38","tests/ui-stable/derive_transparent.rs":"a822e79244df0da55fad83b8cde327f3c1dab7011c8e0b828221d3921537f9ad","tests/ui-stable/derive_transparent.stderr":"1effa48b4a58e1c72502fc158643c1cdefe0aa8cdf4eee7a002a79e15b9c6afd","tests/ui-stable/enum.rs":"cbaa483762e1f9ba8448279d740cf5ad9444b144aa9fc31300cfb89cfc123db9","tests/ui-stable/enum.stderr":"ea594502e63c9958933b97217b417dbdc9ddb4ec817304e33c2aa120eb80fcca","tests/ui-stable/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-stable/enum_from_bytes_u8_too_few.stderr":"b3edb381f968f6f2ad9ab4810132df5962b0650460e07f77af818ababf124fe7","tests/ui-stable/late_compile_pass.rs":"99b0efefd16ca266c24425342a8926925f03e5bea904d8bd162c9a9ce9469795","tests/ui-stable/late_compile_pass.stderr":"034a7f045c3cf53abdd4edb3912f3e51b5403c22fdd346edeb09eb9f86c7df3f","tests/ui-stable/mid_compile_pass.rs":"b80b01bfd383c537173f7d630ec2789a2af3e01bc6d53c807fdcf271b235d0c9","tests/ui-stable/mid_compile_pass.stderr":"cdfabbd710472dc893964e72bf8be52a68091b4df17feeb7d3e7450800e98ce9","tests/ui-stable/struct.rs":"93f99d83adba0496f21d188add6a1cbec61b0186ad554dd54edf62c7cb836fde","tests/ui-stable/struct.stderr":"3735612dd1af22c6cf1a4377d9d6e3ce76094800350e58c64cbfd16d308be37b","tests/ui-stable/union.rs":"d93cb6114533bcff6523b5add3927bcf560d16d2582c86f92b50671c644a9578","tests/ui-stable/union.stderr":"ac224c1bbb7d6dfb6666c572f9ccdef334f0e85517d760910ec1e8df7d5884be","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.rs":"a0168adcd0dfdc46e84421937c704b713a1307a4fc2efc19bac5dc32f6758e89","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"b963d316b4acae982c2078a86f845a1502a34152464c185f76b7cb19186cde67","tests/union_from_bytes.rs":"6cb7ecc1a18985bc65b09a48581ae2b5a5b1c4947e0ca46bf00f0dfabe49c5a1","tests/union_from_zeros.rs":"f2dfc80bf4422b8dc5164a467c31021be1d6868e0d65eafda3714345770782b5","tests/union_known_layout.rs":"9af0d34af3a443ca52b25448f4353bd45eebda67203a890a5dbf7471481f728d","tests/union_no_cell.rs":"be5040a2e878fafa34b7d153a698b31ce6c1577b4d0bfd24df2902b666805be9","tests/union_to_bytes.rs":"bef8e076a781fa5fa6ec3bab759add6f981c7c42527d0123db5780dd98b6a99d","tests/union_try_from_bytes.rs":"ee25edcf303a6f37d6d4e921614a26b4df46180ddf20d188ff55f1badefdeafa","tests/union_unaligned.rs":"eb3a44fe2f3bf66acf6303765dd4c4cf65063d4bb3318d0e8160998651a7f5bf"},"package":"7988d73a4303ca289df03316bc490e934accf371af6bc745393cf3c2c5c4f25d"}
\ No newline at end of file
+{"files":{"Cargo.toml":"1725527fabdf830414277de776e41ba1edb8b2039fa1a184cee5fcfe6d43aef8","LICENSE-APACHE":"9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3","LICENSE-BSD":"83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32","LICENSE-MIT":"1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df","src/enum.rs":"2baa96d4c5f9b01271f846975288fbc8b035c8ab9a34e9152efd9c6540674fc2","src/ext.rs":"a58f64d086dfb94011b23c7edbcf277c47f3500cb3229fe290c7511afa439695","src/lib.rs":"2a10c045e5157bf9e56eae5cab0990509b49f59577719c0f80894bbde1864006","src/output_tests.rs":"ee5077460944f6e02ce334863bcb3608d295f5e07398e1a41025ed4e1c2a12a2","src/repr.rs":"04c3399caec0b12fd3cd070391ab813f429dcb7eb05d004714c0f39b21d69399","tests/deprecated.rs":"a8c7e51d3c43fcea40fd1873f5237ad1e6d8f12e2b011f012d0bafa484da245b","tests/enum_from_zeros.rs":"1e712a2802195af290c7ebefb8645158eef96698dfb93b323f9ce234e878c58d","tests/enum_known_layout.rs":"9a36492810c0a7744e651dc8dd8a5749a81dd678b8cd6713ebe3aaa5fe17d7e6","tests/enum_no_cell.rs":"0024ffbd04551350ff2c4d8c4262fc22ebadc599d1f641bedf1bf24d6a060c78","tests/enum_to_bytes.rs":"cf7d0c482e833d2b4f6f677f4c45495f654bdc4862b5044a183dea56533a2e7a","tests/enum_try_from_bytes.rs":"f6d3ce1277182cc659286c01f6eaf52220c10ff0290b23865268a69a67556daf","tests/enum_unaligned.rs":"e04c9d1fa0f8abcd2353cab94015da010e2b3bdee65e23186c7bd13ff89d54c3","tests/hash.rs":"f0dd3df5f177b6806def5334d38f89348308e56680f7624ca3753ef503f98604","tests/hygiene.rs":"5ee71dbb525e5e40161e9b886d322b2969c60da152c2e87c59e759fc24cd143d","tests/include.rs":"2b5c979ab483238f0164f5fd136c8859128b49797f47de571f632dcf9d515e30","tests/issue_2117.rs":"7cd6480a9684c7efe915753057973363a0e2bce93bea5a85d3139ea9b2f519bd","tests/paths_and_modules.rs":"07a0cc3006e5b60dd32fb0530fa4e5c9e4438d38b3cdd4eb7aca456e6f45a121","tests/priv_in_pub.rs":"790751822cd2101b90d039d2d8d0dbff49dd1b0ab57a39d6ddcdc395988bfbe8","tests/struct_from_bytes.rs":"95dc1d2fec9917044da0bad9a4e217641f3052f95bb8d5f7511fdf72683ce040","tests/struct_from_zeros.rs":"3436b3c34d0ccd69b456dc41264a6c5d3af60f1f955e08f6475cc9ace3cd5f95","tests/struct_known_layout.rs":"dde768e2f6f77bffc60d6cac00c2ae63689569b5c9a1b940fae1eff1221013a8","tests/struct_no_cell.rs":"aea0ef4836d5ad38a968304ea57a2cbf46c8b60864c98dd421c72b3369aafb6c","tests/struct_to_bytes.rs":"ac07b1ee60886058533ac14d54226ebdaf0ac1652671b22df14ac0f017ce4bc0","tests/struct_try_from_bytes.rs":"0641bf24bfc8b712c3d33a4b1f9c1b297f9eae3f3cbee55f67597ddf7111b29b","tests/struct_unaligned.rs":"405ac720c3ce5f6b63ca17248455d45ca92967f8a43b3f347deec03fdb841c6e","tests/trybuild.rs":"c53d036fc0fceb5fd49405c779c1be74e66bd37f66e5f2492cb208df7b86f709","tests/ui-msrv/derive_transparent.rs":"a822e79244df0da55fad83b8cde327f3c1dab7011c8e0b828221d3921537f9ad","tests/ui-msrv/derive_transparent.stderr":"4e9ba3634e4552a9b30a7c654bd56505612ad73a322858066942423e26072ea0","tests/ui-msrv/enum.rs":"cbaa483762e1f9ba8448279d740cf5ad9444b144aa9fc31300cfb89cfc123db9","tests/ui-msrv/enum.stderr":"ac9768eef0dd67a70072e91ee199316203dabad13764f01e5e286e9c847c098d","tests/ui-msrv/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-msrv/enum_from_bytes_u8_too_few.stderr":"a5ab2757166ef9dfa51a09d3dbddd5e9e2b1a46bd3d4b8d175b33a90747878d7","tests/ui-msrv/late_compile_pass.rs":"99b0efefd16ca266c24425342a8926925f03e5bea904d8bd162c9a9ce9469795","tests/ui-msrv/late_compile_pass.stderr":"eb7523a102dc99c5c69403786f4fcefad964cff540798a9e9dc6d9bb72bdad9a","tests/ui-msrv/mid_compile_pass.rs":"b80b01bfd383c537173f7d630ec2789a2af3e01bc6d53c807fdcf271b235d0c9","tests/ui-msrv/mid_compile_pass.stderr":"02f51290ac6e31ebab51d7917df644163f6c2346877506d7debe8a6351acda95","tests/ui-msrv/msrv_specific.rs":"ab1dff9c90664ceb2601d1b88cfca76a4adfc9677ebc961316dc7be702520fb6","tests/ui-msrv/msrv_specific.stderr":"be1995eb73835ce7eb3df71b24c57ea667a96085124cb4ebfe55b0e6b484ab4b","tests/ui-msrv/struct.rs":"93f99d83adba0496f21d188add6a1cbec61b0186ad554dd54edf62c7cb836fde","tests/ui-msrv/struct.stderr":"837da74233b2ab21ba32973a5e4e6b54b7259a330cc1e445620c81430ce2fc12","tests/ui-msrv/union.rs":"d93cb6114533bcff6523b5add3927bcf560d16d2582c86f92b50671c644a9578","tests/ui-msrv/union.stderr":"4ea81d37fc2d035433177548d3d6a78c28085c6758db66dd6344c1d6b1f12a43","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.rs":"a0168adcd0dfdc46e84421937c704b713a1307a4fc2efc19bac5dc32f6758e89","tests/ui-msrv/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"0b9af4f767cc1d6fc591d75b046d31617b5230f012d8ce7c70d7c20ffd6178ca","tests/ui-nightly/absence_of_deprecated_warning.rs":"126083dc4f3efaa51c0606ab68073fea904dc3f71805782b47117bb4ca563b44","tests/ui-nightly/absence_of_deprecated_warning.stderr":"7177d3bbc4b897037c34775f801baef8461483d55915443f07a165f67c5b5f16","tests/ui-nightly/derive_transparent.rs":"a822e79244df0da55fad83b8cde327f3c1dab7011c8e0b828221d3921537f9ad","tests/ui-nightly/derive_transparent.stderr":"bb141d3aef830b0ad6e64937e79a32ab9e9298fbbe83c0a45f34606d111238c3","tests/ui-nightly/enum.rs":"cbaa483762e1f9ba8448279d740cf5ad9444b144aa9fc31300cfb89cfc123db9","tests/ui-nightly/enum.stderr":"ba09f885bd9c2882a8ec5cfb1f30170ff145013acefc1a66ffd6a11993ba0d26","tests/ui-nightly/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-nightly/enum_from_bytes_u8_too_few.stderr":"28a493e1057279ea8e20df49ff0c02dfa132027a86bb6f5fe50e250c14e62572","tests/ui-nightly/late_compile_pass.rs":"99b0efefd16ca266c24425342a8926925f03e5bea904d8bd162c9a9ce9469795","tests/ui-nightly/late_compile_pass.stderr":"e994f152e0494c0dd7c52758183df73657e0f4841b35d2f021fdf8e11261a67d","tests/ui-nightly/mid_compile_pass.rs":"b80b01bfd383c537173f7d630ec2789a2af3e01bc6d53c807fdcf271b235d0c9","tests/ui-nightly/mid_compile_pass.stderr":"b0808ea3394f4bfd5d56adbc823e9afc1ac8926ab86a8a8f4a4145b663ebcb72","tests/ui-nightly/struct.rs":"93f99d83adba0496f21d188add6a1cbec61b0186ad554dd54edf62c7cb836fde","tests/ui-nightly/struct.stderr":"8bb51f0abed533e2a53e271a711c8a08d0c0a78eb2c44fd3e3482066ce49bdb5","tests/ui-nightly/union.rs":"d93cb6114533bcff6523b5add3927bcf560d16d2582c86f92b50671c644a9578","tests/ui-nightly/union.stderr":"73fbf7dae03658a6f201bcfd82b1fbc47992c0419bc5660a47417f7d797283cd","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.rs":"a0168adcd0dfdc46e84421937c704b713a1307a4fc2efc19bac5dc32f6758e89","tests/ui-nightly/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"6b5ac99d2da1ae8bf8d3f918854a934e567f5392ddaff6f5e8d3fbed86574a38","tests/ui-stable/derive_transparent.rs":"a822e79244df0da55fad83b8cde327f3c1dab7011c8e0b828221d3921537f9ad","tests/ui-stable/derive_transparent.stderr":"1effa48b4a58e1c72502fc158643c1cdefe0aa8cdf4eee7a002a79e15b9c6afd","tests/ui-stable/enum.rs":"cbaa483762e1f9ba8448279d740cf5ad9444b144aa9fc31300cfb89cfc123db9","tests/ui-stable/enum.stderr":"ea594502e63c9958933b97217b417dbdc9ddb4ec817304e33c2aa120eb80fcca","tests/ui-stable/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-stable/enum_from_bytes_u8_too_few.stderr":"b3edb381f968f6f2ad9ab4810132df5962b0650460e07f77af818ababf124fe7","tests/ui-stable/late_compile_pass.rs":"99b0efefd16ca266c24425342a8926925f03e5bea904d8bd162c9a9ce9469795","tests/ui-stable/late_compile_pass.stderr":"034a7f045c3cf53abdd4edb3912f3e51b5403c22fdd346edeb09eb9f86c7df3f","tests/ui-stable/mid_compile_pass.rs":"b80b01bfd383c537173f7d630ec2789a2af3e01bc6d53c807fdcf271b235d0c9","tests/ui-stable/mid_compile_pass.stderr":"cdfabbd710472dc893964e72bf8be52a68091b4df17feeb7d3e7450800e98ce9","tests/ui-stable/struct.rs":"93f99d83adba0496f21d188add6a1cbec61b0186ad554dd54edf62c7cb836fde","tests/ui-stable/struct.stderr":"3735612dd1af22c6cf1a4377d9d6e3ce76094800350e58c64cbfd16d308be37b","tests/ui-stable/union.rs":"d93cb6114533bcff6523b5add3927bcf560d16d2582c86f92b50671c644a9578","tests/ui-stable/union.stderr":"ac224c1bbb7d6dfb6666c572f9ccdef334f0e85517d760910ec1e8df7d5884be","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.rs":"a0168adcd0dfdc46e84421937c704b713a1307a4fc2efc19bac5dc32f6758e89","tests/ui-stable/union_into_bytes_cfg/union_into_bytes_cfg.stderr":"b963d316b4acae982c2078a86f845a1502a34152464c185f76b7cb19186cde67","tests/union_from_bytes.rs":"6cb7ecc1a18985bc65b09a48581ae2b5a5b1c4947e0ca46bf00f0dfabe49c5a1","tests/union_from_zeros.rs":"f2dfc80bf4422b8dc5164a467c31021be1d6868e0d65eafda3714345770782b5","tests/union_known_layout.rs":"9af0d34af3a443ca52b25448f4353bd45eebda67203a890a5dbf7471481f728d","tests/union_no_cell.rs":"be5040a2e878fafa34b7d153a698b31ce6c1577b4d0bfd24df2902b666805be9","tests/union_to_bytes.rs":"bef8e076a781fa5fa6ec3bab759add6f981c7c42527d0123db5780dd98b6a99d","tests/union_try_from_bytes.rs":"ee25edcf303a6f37d6d4e921614a26b4df46180ddf20d188ff55f1badefdeafa","tests/union_unaligned.rs":"eb3a44fe2f3bf66acf6303765dd4c4cf65063d4bb3318d0e8160998651a7f5bf"},"package":"d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1"}
\ No newline at end of file
diff --git a/crates/zerocopy-derive/Android.bp b/crates/zerocopy-derive/Android.bp
index cb82c9e..ebe7a8a 100644
--- a/crates/zerocopy-derive/Android.bp
+++ b/crates/zerocopy-derive/Android.bp
@@ -17,7 +17,7 @@
     name: "libzerocopy_derive",
     crate_name: "zerocopy_derive",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.13",
+    cargo_pkg_version: "0.8.14",
     crate_root: "src/lib.rs",
     edition: "2021",
     rustlibs: [
diff --git a/crates/zerocopy-derive/Cargo.toml b/crates/zerocopy-derive/Cargo.toml
index c916e83..32ad9d4 100644
--- a/crates/zerocopy-derive/Cargo.toml
+++ b/crates/zerocopy-derive/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2021"
 name = "zerocopy-derive"
-version = "0.8.13"
+version = "0.8.14"
 authors = ["Joshua Liebow-Feeser <[email protected]>"]
 build = false
 exclude = [
@@ -63,6 +63,10 @@
 path = "tests/enum_unaligned.rs"
 
 [[test]]
+name = "hash"
+path = "tests/hash.rs"
+
+[[test]]
 name = "hygiene"
 path = "tests/hygiene.rs"
 
diff --git a/crates/zerocopy-derive/METADATA b/crates/zerocopy-derive/METADATA
index f34df0f..6c705c4 100644
--- a/crates/zerocopy-derive/METADATA
+++ b/crates/zerocopy-derive/METADATA
@@ -1,17 +1,17 @@
 name: "zerocopy-derive"
 description: "Custom derive for traits from the zerocopy crate"
 third_party {
-  version: "0.8.13"
+  version: "0.8.14"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 12
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/zerocopy-derive"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/zerocopy-derive/zerocopy-derive-0.8.13.crate"
-    version: "0.8.13"
+    value: "https://static.crates.io/crates/zerocopy-derive/zerocopy-derive-0.8.14.crate"
+    version: "0.8.14"
   }
 }
diff --git a/crates/zerocopy-derive/src/lib.rs b/crates/zerocopy-derive/src/lib.rs
index c7fac7d..7082624 100644
--- a/crates/zerocopy-derive/src/lib.rs
+++ b/crates/zerocopy-derive/src/lib.rs
@@ -107,6 +107,7 @@
 derive!(FromBytes => derive_from_bytes => derive_from_bytes_inner);
 derive!(IntoBytes => derive_into_bytes => derive_into_bytes_inner);
 derive!(Unaligned => derive_unaligned => derive_unaligned_inner);
+derive!(ByteHash => derive_hash => derive_hash_inner);
 
 /// Deprecated: prefer [`FromZeros`] instead.
 #[deprecated(since = "0.8.0", note = "`FromZeroes` was renamed to `FromZeros`")]
@@ -320,6 +321,10 @@
                 // `#ty`, not `__ZerocopyKnownLayoutMaybeUninit` (see #2116).
                 #repr
                 #[doc(hidden)]
+                // Required on some rustc versions due to a lint that is only
+                // triggered when `derive(KnownLayout)` is applied to `repr(C)`
+                // structs that are generated by macros. See #2177 for details.
+                #[allow(private_bounds)]
                 #vis struct __ZerocopyKnownLayoutMaybeUninit<#params> (
                     #(::zerocopy::util::macro_util::core_reexport::mem::MaybeUninit<
                         <#ident #ty_generics as
@@ -528,6 +533,50 @@
     }
 }
 
+fn derive_hash_inner(ast: &DeriveInput, _top_level: Trait) -> Result<TokenStream, Error> {
+    // This doesn't delegate to `impl_block` because `impl_block` assumes it is deriving a
+    // `zerocopy`-defined trait, and these trait impls share a common shape that `Hash` does not.
+    // In particular, `zerocopy` traits contain a method that only `zerocopy_derive` macros
+    // are supposed to implement, and `impl_block` generating this trait method is incompatible
+    // with `Hash`.
+    let type_ident = &ast.ident;
+    let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
+    let where_predicates = where_clause.map(|clause| &clause.predicates);
+    Ok(quote! {
+        // TODO(#553): Add a test that generates a warning when
+        // `#[allow(deprecated)]` isn't present.
+        #[allow(deprecated)]
+        // While there are not currently any warnings that this suppresses (that
+        // we're aware of), it's good future-proofing hygiene.
+        #[automatically_derived]
+        impl #impl_generics ::zerocopy::util::macro_util::core_reexport::hash::Hash for #type_ident #ty_generics
+        where
+            Self: ::zerocopy::IntoBytes + ::zerocopy::Immutable,
+            #where_predicates
+        {
+            fn hash<H>(&self, state: &mut H)
+            where
+                H: ::zerocopy::util::macro_util::core_reexport::hash::Hasher,
+            {
+                ::zerocopy::util::macro_util::core_reexport::hash::Hasher::write(
+                    state,
+                    ::zerocopy::IntoBytes::as_bytes(self)
+                )
+            }
+
+            fn hash_slice<H>(data: &[Self], state: &mut H)
+            where
+                H: ::zerocopy::util::macro_util::core_reexport::hash::Hasher,
+            {
+                ::zerocopy::util::macro_util::core_reexport::hash::Hasher::write(
+                    state,
+                    ::zerocopy::IntoBytes::as_bytes(data)
+                )
+            }
+        }
+    })
+}
+
 /// A struct is `TryFromBytes` if:
 /// - all fields are `TryFromBytes`
 fn derive_try_from_bytes_struct(
@@ -1294,6 +1343,7 @@
     IntoBytes,
     Unaligned,
     Sized,
+    ByteHash,
 }
 
 impl ToTokens for Trait {
@@ -1316,6 +1366,7 @@
             Trait::IntoBytes => "IntoBytes",
             Trait::Unaligned => "Unaligned",
             Trait::Sized => "Sized",
+            Trait::ByteHash => "ByteHash",
         };
         let ident = Ident::new(s, Span::call_site());
         tokens.extend(core::iter::once(TokenTree::Ident(ident)));
diff --git a/crates/zerocopy-derive/src/output_tests.rs b/crates/zerocopy-derive/src/output_tests.rs
index 269a669..7eb908c 100644
--- a/crates/zerocopy-derive/src/output_tests.rs
+++ b/crates/zerocopy-derive/src/output_tests.rs
@@ -26,6 +26,7 @@
     FromBytes => derive_from_bytes_inner,
     IntoBytes => derive_into_bytes_inner,
     Unaligned => derive_unaligned_inner,
+    ByteHash => derive_hash_inner,
 );
 
 /// Test that the given derive input expands to the expected output.
@@ -191,6 +192,7 @@
                 #[repr(C)]
                 #[repr(align(2))]
                 #[doc(hidden)]
+                #[allow(private_bounds)]
                 struct __ZerocopyKnownLayoutMaybeUninit<T, U>(
                     ::zerocopy::util::macro_util::core_reexport::mem::MaybeUninit<
                         <Foo<T, U> as ::zerocopy::util::macro_util::Field<__Zerocopy_Field_0>>::Type,
@@ -1981,3 +1983,40 @@
         } no_build
     }
 }
+
+#[test]
+fn test_hash() {
+    test! {
+        ByteHash {
+            struct Foo<T: Clone>(T) where Self: Sized;
+        } expands to {
+            #[allow(deprecated)]
+            #[automatically_derived]
+            impl<T: Clone> ::zerocopy::util::macro_util::core_reexport::hash::Hash for Foo<T>
+            where
+                Self: ::zerocopy::IntoBytes + ::zerocopy::Immutable,
+                Self: Sized,
+            {
+                fn hash<H>(&self, state: &mut H)
+                where
+                    H: ::zerocopy::util::macro_util::core_reexport::hash::Hasher,
+                {
+                    ::zerocopy::util::macro_util::core_reexport::hash::Hasher::write(
+                        state,
+                        ::zerocopy::IntoBytes::as_bytes(self)
+                    )
+                }
+
+                fn hash_slice<H>(data: &[Self], state: &mut H)
+                where
+                    H: ::zerocopy::util::macro_util::core_reexport::hash::Hasher,
+                {
+                    ::zerocopy::util::macro_util::core_reexport::hash::Hasher::write(
+                        state,
+                        ::zerocopy::IntoBytes::as_bytes(data)
+                    )
+                }
+            }
+        } no_build
+    }
+}
diff --git a/crates/zerocopy-derive/tests/hash.rs b/crates/zerocopy-derive/tests/hash.rs
new file mode 100644
index 0000000..08b172f
--- /dev/null
+++ b/crates/zerocopy-derive/tests/hash.rs
@@ -0,0 +1,38 @@
+// Copyright 2024 The Fuchsia Authors
+//
+// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
+// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
+// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
+// This file may not be copied, modified, or distributed except according to
+// those terms.
+
+// See comment in `include.rs` for why we disable the prelude.
+#![no_implicit_prelude]
+#![allow(warnings)]
+
+include!("include.rs");
+
+#[derive(imp::IntoBytes, imp::Immutable, imp::ByteHash)]
+#[repr(C)]
+struct Struct {
+    a: u64,
+    b: u32,
+    c: u32,
+}
+
+util_assert_impl_all!(Struct: imp::IntoBytes, imp::hash::Hash);
+
+#[test]
+fn test_hash() {
+    use imp::{
+        hash::{Hash, Hasher},
+        DefaultHasher,
+    };
+    fn hash(val: impl Hash) -> u64 {
+        let mut hasher = DefaultHasher::new();
+        val.hash(&mut hasher);
+        hasher.finish()
+    }
+    hash(Struct { a: 10, b: 15, c: 20 });
+    hash(&[Struct { a: 10, b: 15, c: 20 }, Struct { a: 5, b: 4, c: 3 }]);
+}
diff --git a/crates/zerocopy-derive/tests/include.rs b/crates/zerocopy-derive/tests/include.rs
index 6c236a3..14690f2 100644
--- a/crates/zerocopy-derive/tests/include.rs
+++ b/crates/zerocopy-derive/tests/include.rs
@@ -29,13 +29,14 @@
             assert_eq,
             cell::UnsafeCell,
             convert::TryFrom,
+            hash,
             marker::PhantomData,
             mem::{ManuallyDrop, MaybeUninit},
             option::IntoIter,
             prelude::v1::*,
             primitive::*,
         },
-        ::std::prelude::v1::*,
+        ::std::{collections::hash_map::DefaultHasher, prelude::v1::*},
         ::zerocopy::*,
     };
 }
diff --git a/crates/zerocopy/.android-checksum.json b/crates/zerocopy/.android-checksum.json
index c6ddc19..5bd1373 100644
--- a/crates/zerocopy/.android-checksum.json
+++ b/crates/zerocopy/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"43fad3a7e45434221414bf24b48052ef973a28adbdf71127977f156360cbfa29","Android.bp":"8105a4e78532d0899ee8db7bfa76bef9d2a511e92719789949efb99049a3f1be","CHANGELOG.md":"e2b2be60932270ea30707700e553a050b044ffbb6303df84feaad6a729aebc07","CONTRIBUTING.md":"85209a827d866e207cdc1ed0110192a41c8371af86cbd6d1f2010dce88ae7a49","Cargo.toml":"7285899c3240496522e6b3fb932bdab3f6a598ffc7b401f7521aee10464a4f58","LICENSE":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-APACHE":"06f9864e3037a400a7f71dc1aa0f21e02424bc6a1e64830f099968dd03829208","LICENSE-BSD":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-MIT":"3e24ce9879b9a289b7413493fe10221df3551f197741ceeef6c38680dd1bf44f","METADATA":"44e3a52ca24ed57c2b1cd93005ee8acc4a478f66aabd99121451a96559a49ef4","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","POLICIES.md":"2c88a1c9779bd76926e57478ecb54f633f7ed71b5dceb95a8aff1168e3cd708a","README.md":"11b7d40320fe792a2a9e536116032a23cdd3a38c8508834a0fe85c5dd72b08be","TEST_MAPPING":"20cde0a7b53544a9f3a65e3d60b64b01ae54892de9762cc8e51d38a5f8ceea4d","build.rs":"fdbbfba1fb64dadc4a4e0fc89c8eb2bcb71889ff737290c042be1ab14d447180","cargo.sh":"dac54d3a35b77498b165a902b948ab1a4e61ce6d80cdb4fb1cb99b061554f9b1","cargo_embargo.json":"8dadca62fb893eebf3315c2bd5c6faf68509954c1dae3d43fbb4b7ba3a9adc52","ci/check_all_toolchains_tested.sh":"65277017a3b96017036eab505921c30b789cff519fc10fa20ce1b00fe068eab8","ci/check_fmt.sh":"65a2a98c251f61d5804a0c2f3bfd16551eefef9c703324c603a14683c5a9baf2","ci/check_job_dependencies.sh":"7a48930c53d0c4500fcd6ddadbd2bcbed217c91de1a697ff9eae6012ad1cf85f","ci/check_readme.sh":"7360da9fef9a0b97d81badb52016f78c2e0e5e2960229e0696956ef566626e54","ci/check_versions.sh":"12c44efae36aeed4e4fc655d8f99a0b17194eba8716e589d81f8063fceb4d721","ci/release_crate_version.sh":"eead8dd30d3b86dc2a0821deedaa99e32d25373cd6e7f935ac7f9de6c1938c84","clippy.toml":"24577ed72d5ec356b0bd79a5ae1d38a79e8b15ae7b6e5b187cf0ef87ac2ef7f2","githooks/pre-push":"8f58f384a52f14baaae2cb06b687a0feccfc5df24d0ae817823b1bbc4d78dbf5","patches/LICENSE.patch":"fcafb83042215e4a906214694a50d4a76f333aadb3fcd6bee8547f3831c0b1a4","rustfmt.toml":"5c169706acf81062608764052838eafc68fe950d12d8ccda6013af5b446d63fe","src/byte_slice.rs":"3e5dd3a8dbc6556c8d9a035c7cf8ce4127b81d45d12a21e8e3e28587d7aa2a50","src/byteorder.rs":"6dff8fb8c04fb054431eee5a9ae1fce1746b840edd26a3bd98e59988b85b823a","src/deprecated.rs":"9361d398426a3e834b065fe188e592c7504f1335552d7863918a8f75a793db8e","src/error.rs":"15ad121a811b4111d10e6fac9e12152cc6ff8d7a1f2149377feba4fb49d60d00","src/impls.rs":"6f87145ff343afb93b947782d1ed9954905723074c88c152b95635397ac871b2","src/layout.rs":"21a840004a6919ad6c74a721af1edc59bc0558b0853ffcc110c20252136a23f6","src/lib.rs":"4b5ff4ea788b7c7580df3b420efa63a323ba81b93f61b1b8c7f78aabab63cad4","src/macros.rs":"9fb37d94e970ed890bbeab98ef7e234b9e33704f7a2dc3413ee204b394200d00","src/pointer/aliasing_safety.rs":"483198df1f9b2bca14a1630954e9ea0e1275963ff383afedfaf8d87a397f2740","src/pointer/mod.rs":"425bf5082767fe98d041e2dd95e705eec7629d94dcd36a3ed5dc6523d7f0400d","src/pointer/ptr.rs":"51ae8675f62b8b59e375f5910a36578e2e31a67fbea8b1ece961961930e6de73","src/ref.rs":"8b39604079965342da67c8727ca57fe078f0b95d2c02c9aec4183790a4ad68a8","src/util/macro_util.rs":"10df86d960f9f051200c4b05d70fda5eab07a312b28e90634bf455875b7d02d6","src/util/macros.rs":"28b6b8da66bed57374e874511e5b3497c53d58ea85e82bd502bdee360cb89e66","src/util/mod.rs":"d5e69ec37a8414ce237fd1aa7ade4f709382c12bf12c161fef0109d6b93a371a","src/wrappers.rs":"d6f5fea4cb462e0208bdbe82abc3191f268ee7d24f3737937270ec84cdb6e5a3","testdata/include_value/data":"87c24be7c86405fd019739c0e6362147a7e45b70d4a704282719ff9a4b62dd36","tests/trybuild.rs":"921ec22964a75a8354b4c94f95093b8f854655b71251d7858f583708511f7d77","tests/ui-msrv/diagnostic-not-implemented-from-bytes.rs":"4bb5386f54737e163bc7240f1c06b43e82e943e42745fe7de14bca9ef0ea50c1","tests/ui-msrv/diagnostic-not-implemented-from-bytes.stderr":"4089215b1df5a3c6bb2614000378bc4b4555d5e9b09008eb4f5a3d89deabdbb3","tests/ui-msrv/diagnostic-not-implemented-from-zeros.rs":"504fdc193b662116cad680d8354433aae2afd12650b7ce149c5d6c1b280ff650","tests/ui-msrv/diagnostic-not-implemented-from-zeros.stderr":"7fee78190af015710d94d5c3534bc8dc75157c462a32c4a89a2f4b932d4cb7f4","tests/ui-msrv/diagnostic-not-implemented-immutable.rs":"df176f71d385efe46108dfc2d676c7fedddb48f0a9f53ec5fa903e6b7761cf92","tests/ui-msrv/diagnostic-not-implemented-immutable.stderr":"4bcf0cba8c816a7a5e7f13256b273e0b83c4da317a7fe6b8e61e4909b509af02","tests/ui-msrv/diagnostic-not-implemented-into-bytes.rs":"5edc2bf1c76f28376eb17613d79025624efbb3465b471b317edb7d399c110e6e","tests/ui-msrv/diagnostic-not-implemented-into-bytes.stderr":"2ee6d51b0355f8387542230e22aa748dc9bec684c285d448189afc66f2da01ed","tests/ui-msrv/diagnostic-not-implemented-issue-1296.rs":"2f603de3cd80439cf2d50bb36fcc5b9d40c3bd06475273e6f135d9da335866d9","tests/ui-msrv/diagnostic-not-implemented-issue-1296.stderr":"2d7be324e42e09c9e6fce03d2b66cce55a2ee69e5a0aa07de0f71ec18baed1ba","tests/ui-msrv/diagnostic-not-implemented-known-layout.rs":"fa78a576df6c568a5ad8517efac60f5953a4d58b233e33e135638bcdfff43ae2","tests/ui-msrv/diagnostic-not-implemented-known-layout.stderr":"b4ff1049ca82c188053454f208c3003014a5bedd782fd03d7aa748dcdbf656ab","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.rs":"272d0a53001ba1145b6389077fa9d4b494d56651088ed1e929b7591ca4d76048","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.stderr":"a62b9bd963ca08819e43c531340f7b7bdc289041b653335879a23cb78289eaba","tests/ui-msrv/diagnostic-not-implemented-unaligned.rs":"2966d1c424ddade377afc988dbf2bbc323011d222784a0869c6f804eba4d6cbc","tests/ui-msrv/diagnostic-not-implemented-unaligned.stderr":"c8e633af41e48e2d7d2c89629b01a00a8019bc15726b03e2202065484a82b55e","tests/ui-msrv/include_value_not_from_bytes.rs":"a08295e6ec9c4fc6fe0f6a90d7227acb444ce4680e64efb2c53c4ffbd7029dba","tests/ui-msrv/include_value_not_from_bytes.stderr":"04cbcdc040f649d03cd9ebce8a1e6158645f836f44a72195bb153b9043ac34a8","tests/ui-msrv/include_value_wrong_size.rs":"4993458b5a5df4dabf7668203d30f01b756dbce7b27e2bd3fc6998987d673fcd","tests/ui-msrv/include_value_wrong_size.stderr":"7f501791ea006e3df03d9b3e0dcccc46f5d9bdbb5c64fcaaa31d126311318bb4","tests/ui-msrv/invalid-impls/invalid-impls.rs":"d135ef15bca8d0e7b2c3bf1596c57dbf4b5a98923089b4e5c060a830dd76ff3e","tests/ui-msrv/invalid-impls/invalid-impls.stderr":"ff24c7a5c75cdbbd9cd8919934cb922efb295104dae41490987e6f129977ab05","tests/ui-msrv/max-align.rs":"cdca9a14834aa08b1dea1a59baddd126a77cb7dffe9b90c9f9feb6b490c31594","tests/ui-msrv/max-align.stderr":"eef0eaf82a223fe5b406e2b507478474b47d323cd8cab32a730dcc230dfa4969","tests/ui-msrv/transmute-dst-not-frombytes.rs":"532de6fb9bb6df56a8621a5f1abb4c58d957650461d266a59581deb36ee77316","tests/ui-msrv/transmute-dst-not-frombytes.stderr":"84e2b67c3c9f73b7d561c97a91048ae9eb91f5e2737b1723bbe6ae1ba05cd9d4","tests/ui-msrv/transmute-mut-alignment-increase.rs":"4c898b19c904440672c87b7b9ee5b15d996eb312e65b595abfdfcb03cff53345","tests/ui-msrv/transmute-mut-alignment-increase.stderr":"9714d77cb5dad09b24f116c4018e8179d1c4fe7a130147cb6838b8d06b905f9c","tests/ui-msrv/transmute-mut-const.rs":"726368515b62c5a4e8c54c91239f28f77ccee01eb384893ac7797e7f47189455","tests/ui-msrv/transmute-mut-const.stderr":"d08ac7260d7d425e66fb273dc61f01dc7726b475d2912caabd62cffa912d48ba","tests/ui-msrv/transmute-mut-dst-generic.rs":"41e6addb7da9fde8c3f93182b3cc484d3a2b5c1cfc077ecc66c0a6f27e22f647","tests/ui-msrv/transmute-mut-dst-generic.stderr":"4f1d49ba0b043741e8881e6f53922e5b0b60dcadf8148a141395e471766a7679","tests/ui-msrv/transmute-mut-dst-not-a-reference.rs":"6c0fecf8e2bfb51f2d5b46f0b6d6c454b235b26bf63a09e95e01d874125053cd","tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr":"b10e6b76150168288a9ad5a494a93d2c92e31b74cfb9517d93ed82e9d06f1abb","tests/ui-msrv/transmute-mut-dst-not-frombytes.rs":"f51acc153ec92e2ac81b383e8ae662dd8ab253c0a62cd9d846f6d1e2ed76f5a2","tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr":"05000ba72ea1747a1c12806404dbb124edb068a39d85904d314acfdf412cdee1","tests/ui-msrv/transmute-mut-dst-not-intobytes.rs":"b9ab140926cae46e0f253eddfa332a0845b25b49ffbe60a17694d06580235066","tests/ui-msrv/transmute-mut-dst-not-intobytes.stderr":"6e170000866643500d9711b7002779d2d8fffbe06a3bc8632e6e9a4a8bdc1979","tests/ui-msrv/transmute-mut-dst-unsized.rs":"5c040c3eec4b360b4b65a948bcfe1220567cf5bb1939eeefd5bf200cd73d3b96","tests/ui-msrv/transmute-mut-dst-unsized.stderr":"73ccc44398fa6320a8e830313c812619072cfbc9e1a694c6f88a5fa06d7e0124","tests/ui-msrv/transmute-mut-illegal-lifetime.rs":"cd95f98b5a7f43c9b9f20d53bedbfa0cc3d8b6ba2af182abf6a2098b31dc6c6e","tests/ui-msrv/transmute-mut-illegal-lifetime.stderr":"914c16f19c5ad3418e08e3701fb693f4dae1ed844dd2d357a4d861d3df8704c3","tests/ui-msrv/transmute-mut-size-decrease.rs":"9ab9c03ccf1546957e3412911564a9dad6f0940d55c5285945548f76186fec56","tests/ui-msrv/transmute-mut-size-decrease.stderr":"b7ee92e76faa4129d75d9f986ce2e5ef50f8924fef485ace3e0ad732062e28cd","tests/ui-msrv/transmute-mut-size-increase.rs":"70fa56ad32004364710f2c711859bf601aef0ab61ff5264b8f071d9d06769a63","tests/ui-msrv/transmute-mut-size-increase.stderr":"79ffa82f2d0c53fe5b2e55f0f358c7d20f8452cf892f3866716e08b4ea6322bd","tests/ui-msrv/transmute-mut-src-dst-generic.rs":"880430db77b417304756e0244ac8187c4392a9b1887bdb9683246376a7a557a0","tests/ui-msrv/transmute-mut-src-dst-generic.stderr":"369d3e3947e81de8f3e2fa49ade8e8263e7b493bc4e7d5560e44796a960fe87b","tests/ui-msrv/transmute-mut-src-dst-not-references.rs":"cbb01caa49218ce6e4914b03ad1b8bb99a648d7867152577add772de9f0a705e","tests/ui-msrv/transmute-mut-src-dst-not-references.stderr":"93584326ab2fd8dd8e4ebef465bc3541761ea43ff5aac3a7794aa4ee52eaca2f","tests/ui-msrv/transmute-mut-src-dst-unsized.rs":"d52aec2bc815fac314a4ca5819d730a0d1dbac13b51bf2b844701d77ce969a8e","tests/ui-msrv/transmute-mut-src-dst-unsized.stderr":"881f46cb6943f842351be5c0c76ef2ddc87e4a194dac8959d280b68cd7250fe2","tests/ui-msrv/transmute-mut-src-generic.rs":"a013a66dfe3ca9fbf349c85794ec8a68a980929a56520df305e7a5a4f9922202","tests/ui-msrv/transmute-mut-src-generic.stderr":"2978625f4a64e19ab7c90daa94053ea3e57012e4e42de1aed645c8dfe1ad9221","tests/ui-msrv/transmute-mut-src-immutable.rs":"1cb591944d85bb526f182fdc476a0ba965dade3dfbaac8a29a648045d9ac5a21","tests/ui-msrv/transmute-mut-src-immutable.stderr":"48ddd05834acde5456f6b6e9e389098995a837562dbde288d813b0c9233900b0","tests/ui-msrv/transmute-mut-src-not-a-reference.rs":"a854a05999caebc97a08e37d037c4905a859e3a1f4f6d5e5803ff03af0bb5470","tests/ui-msrv/transmute-mut-src-not-a-reference.stderr":"10a77e576756bdeb3867c5f8b54687c8ef68660b3ebc15265acc2d0c4234577c","tests/ui-msrv/transmute-mut-src-not-frombytes.rs":"049b386c8bf296d45e8a1a1f020a763df4ea480a3e1027ccc8f6c31b05889c79","tests/ui-msrv/transmute-mut-src-not-frombytes.stderr":"034da485616c2a7430868b6827bcef2e5c9c39fe4c89ac577eb58f4dc63091d9","tests/ui-msrv/transmute-mut-src-not-intobytes.rs":"12adc96a6bce75e01456c50e5fa08a93290a0b48ed13ef8571b0cad1211cbc8f","tests/ui-msrv/transmute-mut-src-not-intobytes.stderr":"b693b1af440fc684c9cbebe580d58ba3f1909e8ee52a7b27234e2b3d6fb9b2e1","tests/ui-msrv/transmute-mut-src-unsized.rs":"128a9f55a7b83c98e3bfafdd6a714e60ff545a322cecdef81f8702da3b1e3eb9","tests/ui-msrv/transmute-mut-src-unsized.stderr":"8bbcb2bde1a1257a087a7fc240ad897508c371b90478586a6b8cadb0e8594218","tests/ui-msrv/transmute-ptr-to-usize.rs":"d8aabb58133988be7c282ec9771906b8f199418e69762c92ffc167305890d353","tests/ui-msrv/transmute-ptr-to-usize.stderr":"80764029a66325c51dffca8961dfaae3b0c9b3723d8c1d53933942ffac6deb2f","tests/ui-msrv/transmute-ref-alignment-increase.rs":"adea0a036330e7d60a2fa663ca873dc24596fd81383545ef945d76adcca1c2ab","tests/ui-msrv/transmute-ref-alignment-increase.stderr":"396fd42941a0259a13d868554e6bf7e9a72753ebf3198d13eb3faa6efcc3f81c","tests/ui-msrv/transmute-ref-dst-generic.rs":"fceea5349611147b46a0d897ff4df4353ef2d2550c45a5ee14a74bba9fa272c1","tests/ui-msrv/transmute-ref-dst-generic.stderr":"1e4429d9600ff4cb5f729779c32cd239cc39e6cd7a1b20bb2e52824bc0d7c804","tests/ui-msrv/transmute-ref-dst-mutable.rs":"4283c537172971fda2c3c529c0971bbac66a4ac844bb6f0356f24284d4084b77","tests/ui-msrv/transmute-ref-dst-mutable.stderr":"bce1331bebdebfbc253e8945f68897d9f0abd1a2eff9259e6657daba1bdae9fd","tests/ui-msrv/transmute-ref-dst-not-a-reference.rs":"6829c16de2e2dcae944f846235e2f76fca742a24c6970559fc4d10bbf214f96b","tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr":"b94916f2a4fddd7280cfc4114be176479ecefd8030891791d38760a475e688f7","tests/ui-msrv/transmute-ref-dst-not-frombytes.rs":"a989f7f680cd3072ee1a0dd631fab02caa30c64c53ced9b5719d79dbcfbcf97f","tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr":"aef30d5527db0585fcc4cd9ceef91a49b31ebff3c3e6c8d385616fde1dac2b0f","tests/ui-msrv/transmute-ref-dst-not-nocell.rs":"51ecd363ef66bbcf0d8daa3376667b8a9ad35b61d78765d502644c1183cbdf1c","tests/ui-msrv/transmute-ref-dst-not-nocell.stderr":"7626fce7a73436c76c9fedb695a35cf05a749b131ec39ff6e664b80c5f47506a","tests/ui-msrv/transmute-ref-dst-unsized.rs":"e3beead5f1b51a62ad8974c024fb0db3ed0611c05e5ab05a65ee284e150b3ff8","tests/ui-msrv/transmute-ref-dst-unsized.stderr":"c1c57f34ec8166ce885fd244afce0a70898563e9b4966d07f1c0e4713c8ed906","tests/ui-msrv/transmute-ref-illegal-lifetime.rs":"771b734779b00309b7ab112891e5fa76af2d7b5a822b4db2f34b3edebf1f7b9d","tests/ui-msrv/transmute-ref-illegal-lifetime.stderr":"6fee6a359ec36d57358d73a87af9ed45b380f10a6a07212fc711c7671828ec82","tests/ui-msrv/transmute-ref-size-decrease.rs":"318b336f688eaeb7ddcb574cf750b7e1cc728b1db3ae97b5d025a325bcc95747","tests/ui-msrv/transmute-ref-size-decrease.stderr":"76f3e04b668db7118c8914877d57e6d79d8812d50fc98e651252de6319309e25","tests/ui-msrv/transmute-ref-size-increase.rs":"7f3a5897b73dd9272eac08c4a43e3946fdf527761c3fb376a266e945ddb96448","tests/ui-msrv/transmute-ref-size-increase.stderr":"809749bdc3acfb0d0575962659aff3f15e1c464a6d9e421448d674c2230b3c49","tests/ui-msrv/transmute-ref-src-dst-generic.rs":"2d25888552996fd964461247b07cf1a5974e6fc0dffed2464b795bdf56e7e518","tests/ui-msrv/transmute-ref-src-dst-generic.stderr":"199483e82b59ad8724485d64062c623124714a31a4a4aa38fd2808521d7f9eb4","tests/ui-msrv/transmute-ref-src-dst-not-references.rs":"b44e925cca270c67fc7f9c4dc18207acd90f77231f8cf79ec965b592586a890f","tests/ui-msrv/transmute-ref-src-dst-not-references.stderr":"b58f31a729ee4a90f8c30ff950c02d49d6ca340d882b431f7764120b0ff8d829","tests/ui-msrv/transmute-ref-src-dst-unsized.rs":"902e8182ea6b3de7b6e548ae03abc54b5bb8b8a01057e25d1c5e12838876349d","tests/ui-msrv/transmute-ref-src-dst-unsized.stderr":"e419f9725cf4a4dd8df13335ede12fff4b8eaba1ae0537831df8e39e46992c29","tests/ui-msrv/transmute-ref-src-generic.rs":"57c4bbd0ec820778dcfdd40645741e2251f981ca4e98de9ac344c7dbb5381e16","tests/ui-msrv/transmute-ref-src-generic.stderr":"06042e71a9b709923edd9ea77ba9c71d1d1564445a15a7971fdaf284abe552a0","tests/ui-msrv/transmute-ref-src-not-a-reference.rs":"69dc6327b77a6cfe806b3493a4287bdfa88d8b353256673ff1e4bc2e28c8eb28","tests/ui-msrv/transmute-ref-src-not-a-reference.stderr":"da596f7aa5e826b171e3bea5b39cc7c5c19d232d9b575095943e83af802dee08","tests/ui-msrv/transmute-ref-src-not-intobytes.rs":"dd932cdde770d1ad0c0e5c147cb53aebdbfe6a023a6873e807f2429a14bc654d","tests/ui-msrv/transmute-ref-src-not-intobytes.stderr":"b6837722a77618c0a5e3adf04250a381eb0fe45563e231c658a306ca3e373847","tests/ui-msrv/transmute-ref-src-not-nocell.rs":"cdd5eeb40f42963e7bec7b45283a53f4322df4a7068398089d0ddc18402ec0a9","tests/ui-msrv/transmute-ref-src-not-nocell.stderr":"2c3929245c9435c725724839cec07e38dfd1e77927931005bf9f14e3aad794b3","tests/ui-msrv/transmute-ref-src-unsized.rs":"cbb75ec9eb3729442f57afc55758f4b638687ed0677e58a5e784b5f53e6a82ee","tests/ui-msrv/transmute-ref-src-unsized.stderr":"c0c284ae12d1e66006238c401ebc695b3b6c53dfc4ea203c5634a397c4e9f499","tests/ui-msrv/transmute-size-decrease.rs":"ef04ab5d6ed074c0d0ab0f979fba4b5a580e1ebeab431b7a432a4348194a67b9","tests/ui-msrv/transmute-size-decrease.stderr":"bb3ba97e5f733b67714bc2502be26096eecdc1aada43ade0e1bb5baaebbc1be0","tests/ui-msrv/transmute-size-increase.rs":"d57c9f23ba23313236a84809b6a1e1d0fdfc67c1d64db8143f5762671eb68ca9","tests/ui-msrv/transmute-size-increase.stderr":"73a98194a0dcf4af4eb3f5b3e06ff9c1fc3710f4a629e1c51abff165642e12aa","tests/ui-msrv/transmute-src-not-intobytes.rs":"e39129733ec5406376c1cd79a0eb2b66d89ee89e0cd629cf8ba5c8c6fe0c0cd1","tests/ui-msrv/transmute-src-not-intobytes.stderr":"a92c335cdf37ad91e524b31ba674e8ac60f7a46934d14da39ba8ce05fbe134a2","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.rs":"9b4b6b062a4f1a0f29df9754c87b0ec0dfc75cc026ecbf57f67e48acf8ed3b0e","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.stderr":"2bec587fd16b99c1d3e4cc42031f00fd7b6381ff4baba56c937c3d819eff1ac4","tests/ui-msrv/try_transmute-size-decrease.rs":"7ec7d4c829f2a2df74149b880686371c2a64e293dcb6f5ec10a0c09c4f8229c0","tests/ui-msrv/try_transmute-size-decrease.stderr":"d42b2c8fdd44d6b5172d5bb507b8c45bf44b3feb98501940d7e37d16b07aebca","tests/ui-msrv/try_transmute-size-increase.rs":"5b085b4eb85a46d70ce03799652ba49bc4d51e861e821eddebd94919bcb0ad30","tests/ui-msrv/try_transmute-size-increase.stderr":"0ef17b0ea081da61831dfccfdc47532278955eaffc1ba2981cec7333d93b8f93","tests/ui-msrv/try_transmute-src-not-intobytes.rs":"83ab8176279f90930b9548592114343d724b5af57999ed04cb5b5c32f56f5aad","tests/ui-msrv/try_transmute-src-not-intobytes.stderr":"20985ea4dbaa60825db12cb0db36d3919175ed046c8dd786ab08612bec91e24a","tests/ui-msrv/try_transmute_mut-alignment-increase.rs":"6f16a7e4753153e84581902d3d42fc4f0cb2d7ef4b01b71bcaccb0d434dc0f9c","tests/ui-msrv/try_transmute_mut-alignment-increase.stderr":"f9f50bf211cd30ac6eb653dea5b654a747ce2af13c5e84535c0db078bbf5f09f","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.rs":"aeb4371e28787b0a2e75e616441a55129cd299d9681a81095c72e6e7f7b9512a","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.stderr":"14ff79216efe8ec2c47daa4799f6aa4bdb8757556b9582492034b75cec5bf766","tests/ui-msrv/try_transmute_mut-size-decrease.rs":"35886c88a716734e77c05775d5a0766e9b637b9ed4cc76a9cfbba2aa262e1d13","tests/ui-msrv/try_transmute_mut-size-decrease.stderr":"60c65a6a4062ddf51aa878d60ed048d2580bc0da0085281c4cf1d7b0bafd451c","tests/ui-msrv/try_transmute_mut-size-increase.rs":"56fbb3134ebc173dc2d959515400b3a9cb9341835337ef3f554f350e316abdb2","tests/ui-msrv/try_transmute_mut-size-increase.stderr":"4eda49b143d847bc6679d478edd985bfc470b1f7a81b443aa7f4cc60087cf524","tests/ui-msrv/try_transmute_mut-src-not-intobytes.rs":"6d426e7cd765e9b633e6bb0585db7cad22c90ddb7ba403d7894d8bf6848395ed","tests/ui-msrv/try_transmute_mut-src-not-intobytes.stderr":"13aed6a3078e732fc281710798e0f5440bfc2f3516f237d8e1164904f756a977","tests/ui-msrv/try_transmute_ref-alignment-increase.rs":"4401c8ae85558b388627f60a60960b33bf4df8eae28437ffa4d20bb668f47036","tests/ui-msrv/try_transmute_ref-alignment-increase.stderr":"94c5c47b77019bf307e009b38589317eb3308ba8b6706b920d5fcadf550a3b8e","tests/ui-msrv/try_transmute_ref-dst-mutable.rs":"cc0497f618bc155ea07bb7538dc570c7e3bba708ad8e52189ea6e10fd63e40bf","tests/ui-msrv/try_transmute_ref-dst-mutable.stderr":"598902a4e5023ffe5758c362abfedad411e027b4473c76e894a361d2c2f22ec6","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"9308e38dd814b2bab53b5912207cc7621635a5c547e621f947ba0d66e2601730","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"9a3b289fff477333baf68bb61bec4e167d02cb177be3803b42001dc256f3f453","tests/ui-msrv/try_transmute_ref-size-decrease.rs":"084d0983a7855e3d1eb8a08b0ca9838b1e0b8a07fc88d867a2a7b4519f1057ab","tests/ui-msrv/try_transmute_ref-size-decrease.stderr":"bf5148e7b5bcbb3fbbf83ada9b3f79e4ea0c40105b21720f9d1115773e371ee7","tests/ui-msrv/try_transmute_ref-size-increase.rs":"4d0fea16788077a938b14852a93c110b7791aa0013bfa12c1cfb4c6689b8eb24","tests/ui-msrv/try_transmute_ref-size-increase.stderr":"6898694893e788813173aeade8233ee48ad3b8eda57cc9b412ebc06af586d129","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.rs":"da8b40f0ffb13a891a0a3a76217532da81e7b71d5c6f9c1ebe78cff5c9fcc177","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.stderr":"e59012471cdd2b69bc96b5d9e146058ab30e6bbbe0e432b22158d3a45caacb03","tests/ui-nightly/diagnostic-not-implemented-from-bytes.rs":"4bb5386f54737e163bc7240f1c06b43e82e943e42745fe7de14bca9ef0ea50c1","tests/ui-nightly/diagnostic-not-implemented-from-bytes.stderr":"d0e6bf4707a48c1f8c75527edd27735f0bfe04b562c00c88c6e43b43af029e8b","tests/ui-nightly/diagnostic-not-implemented-from-zeros.rs":"504fdc193b662116cad680d8354433aae2afd12650b7ce149c5d6c1b280ff650","tests/ui-nightly/diagnostic-not-implemented-from-zeros.stderr":"b09ff91579e1b467aca6c217251ee0f197257838923ad4e832d0ecd71fb9a283","tests/ui-nightly/diagnostic-not-implemented-immutable.rs":"df176f71d385efe46108dfc2d676c7fedddb48f0a9f53ec5fa903e6b7761cf92","tests/ui-nightly/diagnostic-not-implemented-immutable.stderr":"ce7e567bd10fedfdf7d33e088805d955a66d8388ee65988a3e574e12eac6270a","tests/ui-nightly/diagnostic-not-implemented-into-bytes.rs":"5edc2bf1c76f28376eb17613d79025624efbb3465b471b317edb7d399c110e6e","tests/ui-nightly/diagnostic-not-implemented-into-bytes.stderr":"a0a9e604da0412a7cea16c649196a045b6a2f0cb69f43c961b5a08eea76fe74c","tests/ui-nightly/diagnostic-not-implemented-issue-1296.rs":"2f603de3cd80439cf2d50bb36fcc5b9d40c3bd06475273e6f135d9da335866d9","tests/ui-nightly/diagnostic-not-implemented-issue-1296.stderr":"668d4470b770ebb67f3afa1faadff16234a6fd68961aa4732eb60d3e24a5d845","tests/ui-nightly/diagnostic-not-implemented-known-layout.rs":"fa78a576df6c568a5ad8517efac60f5953a4d58b233e33e135638bcdfff43ae2","tests/ui-nightly/diagnostic-not-implemented-known-layout.stderr":"fe85103ea5bed6073f5f9be9f96e99be91af4a0d1665e1929c21c57d631180ef","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.rs":"272d0a53001ba1145b6389077fa9d4b494d56651088ed1e929b7591ca4d76048","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.stderr":"ccf8320bbd97bd44406934ee837a84790ab8f05822f87f5f3ed816d047cdf9c8","tests/ui-nightly/diagnostic-not-implemented-unaligned.rs":"2966d1c424ddade377afc988dbf2bbc323011d222784a0869c6f804eba4d6cbc","tests/ui-nightly/diagnostic-not-implemented-unaligned.stderr":"74b52b9885291dc3268a07006abd52dbb08ee4bb81342753a87afe0150f3662a","tests/ui-nightly/include_value_not_from_bytes.rs":"a08295e6ec9c4fc6fe0f6a90d7227acb444ce4680e64efb2c53c4ffbd7029dba","tests/ui-nightly/include_value_not_from_bytes.stderr":"b9f9fcd0eb2d39704970c8f86bd3ce4eaf33b4c4a9eda58d0414cc5408c6b61c","tests/ui-nightly/include_value_wrong_size.rs":"4993458b5a5df4dabf7668203d30f01b756dbce7b27e2bd3fc6998987d673fcd","tests/ui-nightly/include_value_wrong_size.stderr":"cf7ab76adbdcde63f4b12b7f97724d5a929788afde3dfe27afcc06841cacd364","tests/ui-nightly/invalid-impls/invalid-impls.rs":"d135ef15bca8d0e7b2c3bf1596c57dbf4b5a98923089b4e5c060a830dd76ff3e","tests/ui-nightly/invalid-impls/invalid-impls.stderr":"78696f82238459ae50851e30a89bd8bcf6c2a07edb09e79055cd92561c494949","tests/ui-nightly/max-align.rs":"cdca9a14834aa08b1dea1a59baddd126a77cb7dffe9b90c9f9feb6b490c31594","tests/ui-nightly/max-align.stderr":"0382389bea42134ee3fb73e79cdde8821264fd21c9f8da91dd98b240d4e592a4","tests/ui-nightly/transmute-dst-not-frombytes.rs":"532de6fb9bb6df56a8621a5f1abb4c58d957650461d266a59581deb36ee77316","tests/ui-nightly/transmute-dst-not-frombytes.stderr":"27131268c9a6d1908bd399e7c02b0e54e12f00f56ef6f45e4fb007a2e2f814d4","tests/ui-nightly/transmute-mut-alignment-increase.rs":"4c898b19c904440672c87b7b9ee5b15d996eb312e65b595abfdfcb03cff53345","tests/ui-nightly/transmute-mut-alignment-increase.stderr":"6953ae0f33bcd9e911b263d56c3a82702ac22deee81c854e23d79b5edf26db4c","tests/ui-nightly/transmute-mut-const.rs":"726368515b62c5a4e8c54c91239f28f77ccee01eb384893ac7797e7f47189455","tests/ui-nightly/transmute-mut-const.stderr":"173ffdf5487393ba533c3c3e939c2b86738b6203d1718e9f7a8ff2a68cd4d50c","tests/ui-nightly/transmute-mut-dst-generic.rs":"41e6addb7da9fde8c3f93182b3cc484d3a2b5c1cfc077ecc66c0a6f27e22f647","tests/ui-nightly/transmute-mut-dst-generic.stderr":"4c57933cb9db077d9be42b1c52f7371d13a04d1a385a297e63f543477961a00c","tests/ui-nightly/transmute-mut-dst-not-a-reference.rs":"6c0fecf8e2bfb51f2d5b46f0b6d6c454b235b26bf63a09e95e01d874125053cd","tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr":"39a9aa400068c67a5121d594ccbf775161328e2d96703ec557259a0967a873f3","tests/ui-nightly/transmute-mut-dst-not-frombytes.rs":"f51acc153ec92e2ac81b383e8ae662dd8ab253c0a62cd9d846f6d1e2ed76f5a2","tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr":"ac49fe2fd04c795f75791d6456fbd8d96b1ff81161c05fc587e24e29f8aa2647","tests/ui-nightly/transmute-mut-dst-not-intobytes.rs":"b9ab140926cae46e0f253eddfa332a0845b25b49ffbe60a17694d06580235066","tests/ui-nightly/transmute-mut-dst-not-intobytes.stderr":"5f4b571e0531c8b00a1eefa31553f7b21fb6efe26929393b96af6a14dc79daae","tests/ui-nightly/transmute-mut-dst-unsized.rs":"5c040c3eec4b360b4b65a948bcfe1220567cf5bb1939eeefd5bf200cd73d3b96","tests/ui-nightly/transmute-mut-dst-unsized.stderr":"896a128d004daf46732047d051e3240a6449f863b151027f3733626bd9336c75","tests/ui-nightly/transmute-mut-illegal-lifetime.rs":"cd95f98b5a7f43c9b9f20d53bedbfa0cc3d8b6ba2af182abf6a2098b31dc6c6e","tests/ui-nightly/transmute-mut-illegal-lifetime.stderr":"4a0979b14505f84ef7c6a701bb0134251c720ae78d398e0e467ac5c3f4dbbd4e","tests/ui-nightly/transmute-mut-size-decrease.rs":"9ab9c03ccf1546957e3412911564a9dad6f0940d55c5285945548f76186fec56","tests/ui-nightly/transmute-mut-size-decrease.stderr":"d2b080797a83dfb2168e2641483bac5672a033d3a8a90bbc8732d2f062bad7a9","tests/ui-nightly/transmute-mut-size-increase.rs":"70fa56ad32004364710f2c711859bf601aef0ab61ff5264b8f071d9d06769a63","tests/ui-nightly/transmute-mut-size-increase.stderr":"f884f89285f7b4fdbf97ac8af67a47d3b3f14da8d4effde160f6fa34ccbd9077","tests/ui-nightly/transmute-mut-src-dst-generic.rs":"880430db77b417304756e0244ac8187c4392a9b1887bdb9683246376a7a557a0","tests/ui-nightly/transmute-mut-src-dst-generic.stderr":"822747c6985827da75680660c52db65a28c8ebd97ffabda1060d7c04e61ef1ef","tests/ui-nightly/transmute-mut-src-dst-not-references.rs":"cbb01caa49218ce6e4914b03ad1b8bb99a648d7867152577add772de9f0a705e","tests/ui-nightly/transmute-mut-src-dst-not-references.stderr":"107640628a6e6c0cd9358de8d1841a1442409cd39ce789870d07cd62eb825e02","tests/ui-nightly/transmute-mut-src-dst-unsized.rs":"d52aec2bc815fac314a4ca5819d730a0d1dbac13b51bf2b844701d77ce969a8e","tests/ui-nightly/transmute-mut-src-dst-unsized.stderr":"5e2f582c22507e8ee21947b3f6fde213e3c282c700a9b9fb52662ce5f7d2ac7b","tests/ui-nightly/transmute-mut-src-generic.rs":"a013a66dfe3ca9fbf349c85794ec8a68a980929a56520df305e7a5a4f9922202","tests/ui-nightly/transmute-mut-src-generic.stderr":"d34b17cc3c86a3b9ade3f48979091690f7628ac1c5a741d52cfe751db0809abb","tests/ui-nightly/transmute-mut-src-immutable.rs":"1cb591944d85bb526f182fdc476a0ba965dade3dfbaac8a29a648045d9ac5a21","tests/ui-nightly/transmute-mut-src-immutable.stderr":"39535092fe08383c4c3402e45d1a77f375dd023a2d8a751a902bed545534a55f","tests/ui-nightly/transmute-mut-src-not-a-reference.rs":"a854a05999caebc97a08e37d037c4905a859e3a1f4f6d5e5803ff03af0bb5470","tests/ui-nightly/transmute-mut-src-not-a-reference.stderr":"d17b2875a1dc1d904f8dbb6001dad080100b653673f5cc6ee192825666400fe9","tests/ui-nightly/transmute-mut-src-not-frombytes.rs":"049b386c8bf296d45e8a1a1f020a763df4ea480a3e1027ccc8f6c31b05889c79","tests/ui-nightly/transmute-mut-src-not-frombytes.stderr":"8ec2e28872ba7d08e597ecbc5bea5ba4875846c4e0bef3583f67beebeba8b470","tests/ui-nightly/transmute-mut-src-not-intobytes.rs":"12adc96a6bce75e01456c50e5fa08a93290a0b48ed13ef8571b0cad1211cbc8f","tests/ui-nightly/transmute-mut-src-not-intobytes.stderr":"77e790c7036ea63560945d06816232c6e04b864a5d16b6a19418dd984bd099b9","tests/ui-nightly/transmute-mut-src-unsized.rs":"128a9f55a7b83c98e3bfafdd6a714e60ff545a322cecdef81f8702da3b1e3eb9","tests/ui-nightly/transmute-mut-src-unsized.stderr":"5918d349eb2d8ec0452728ec16440bb9a3ee8fe2c45ddb8efa08e36b7a38b62d","tests/ui-nightly/transmute-ptr-to-usize.rs":"d8aabb58133988be7c282ec9771906b8f199418e69762c92ffc167305890d353","tests/ui-nightly/transmute-ptr-to-usize.stderr":"52244e5fdd1f8c620c745cca54f594eebea3408101ac77def8b2889e4a86c8de","tests/ui-nightly/transmute-ref-alignment-increase.rs":"adea0a036330e7d60a2fa663ca873dc24596fd81383545ef945d76adcca1c2ab","tests/ui-nightly/transmute-ref-alignment-increase.stderr":"db8bc6a0ac55ed87f35ddeb22965c7259b6a076d7616b56fe4fa0db4e201cd1b","tests/ui-nightly/transmute-ref-dst-generic.rs":"fceea5349611147b46a0d897ff4df4353ef2d2550c45a5ee14a74bba9fa272c1","tests/ui-nightly/transmute-ref-dst-generic.stderr":"9d5f318f064a2f5f4a23d27ace8757b38db048badfde9f3a8ec8a45b2c272506","tests/ui-nightly/transmute-ref-dst-mutable.rs":"4283c537172971fda2c3c529c0971bbac66a4ac844bb6f0356f24284d4084b77","tests/ui-nightly/transmute-ref-dst-mutable.stderr":"0c11986772b58a910ac8a7d601002afc02cd378f45382827ce21b25ed64e7ab9","tests/ui-nightly/transmute-ref-dst-not-a-reference.rs":"6829c16de2e2dcae944f846235e2f76fca742a24c6970559fc4d10bbf214f96b","tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr":"718ffdabf82ebe3f12e6f592efe4016cadf2c1da3d749c2701ab8a32438f1837","tests/ui-nightly/transmute-ref-dst-not-frombytes.rs":"a989f7f680cd3072ee1a0dd631fab02caa30c64c53ced9b5719d79dbcfbcf97f","tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr":"569b2104c13b482bab2733aab462e05d0b7c59b5daae2fefdb8a4a1aa32a6a11","tests/ui-nightly/transmute-ref-dst-not-nocell.rs":"51ecd363ef66bbcf0d8daa3376667b8a9ad35b61d78765d502644c1183cbdf1c","tests/ui-nightly/transmute-ref-dst-not-nocell.stderr":"962c54606c4b7f7e3c96b88efeb713c31881d43e8bf92be4fcd6e6c17df1ea05","tests/ui-nightly/transmute-ref-dst-unsized.rs":"e3beead5f1b51a62ad8974c024fb0db3ed0611c05e5ab05a65ee284e150b3ff8","tests/ui-nightly/transmute-ref-dst-unsized.stderr":"1de78a9ba5821e82f4a18a8a846cfcd24ea66c78d0b4c54e25da3ad40c1f99a0","tests/ui-nightly/transmute-ref-illegal-lifetime.rs":"771b734779b00309b7ab112891e5fa76af2d7b5a822b4db2f34b3edebf1f7b9d","tests/ui-nightly/transmute-ref-illegal-lifetime.stderr":"fe0f7131d3d794f5ffaee93c324e29c73f2f6bf82cfa1f9105bd999af81bf497","tests/ui-nightly/transmute-ref-size-decrease.rs":"318b336f688eaeb7ddcb574cf750b7e1cc728b1db3ae97b5d025a325bcc95747","tests/ui-nightly/transmute-ref-size-decrease.stderr":"ed1304243850ab7a06427cff1d1216f306be94d389bad35f9d048129640d3586","tests/ui-nightly/transmute-ref-size-increase.rs":"7f3a5897b73dd9272eac08c4a43e3946fdf527761c3fb376a266e945ddb96448","tests/ui-nightly/transmute-ref-size-increase.stderr":"744c7b543f417246d7fde6dd5680c4f293e577a6ce7b005742ece6ecba98d552","tests/ui-nightly/transmute-ref-src-dst-generic.rs":"2d25888552996fd964461247b07cf1a5974e6fc0dffed2464b795bdf56e7e518","tests/ui-nightly/transmute-ref-src-dst-generic.stderr":"4b8d7f7106f4c0a1e527d3bbf6879104d87aa9d17e53c7304b6c27b3480fbd7d","tests/ui-nightly/transmute-ref-src-dst-not-references.rs":"b44e925cca270c67fc7f9c4dc18207acd90f77231f8cf79ec965b592586a890f","tests/ui-nightly/transmute-ref-src-dst-not-references.stderr":"4ee1f130bdc0e185d1cd0a180976bd099db162a11ad51e6eb8730353c253ea44","tests/ui-nightly/transmute-ref-src-dst-unsized.rs":"902e8182ea6b3de7b6e548ae03abc54b5bb8b8a01057e25d1c5e12838876349d","tests/ui-nightly/transmute-ref-src-dst-unsized.stderr":"f9db33200fe5eb498ae50246b685334126a52c856f1ca17929bc15a766468469","tests/ui-nightly/transmute-ref-src-generic.rs":"57c4bbd0ec820778dcfdd40645741e2251f981ca4e98de9ac344c7dbb5381e16","tests/ui-nightly/transmute-ref-src-generic.stderr":"6df8948f70d9677198b6065cd8f62d5cd652f00bda556a9d88ed0d22fd24f772","tests/ui-nightly/transmute-ref-src-not-a-reference.rs":"69dc6327b77a6cfe806b3493a4287bdfa88d8b353256673ff1e4bc2e28c8eb28","tests/ui-nightly/transmute-ref-src-not-a-reference.stderr":"0018c74a5285cafdfd06d4453abec66692bd39f5926b4e8e25f9592c8c3adc12","tests/ui-nightly/transmute-ref-src-not-intobytes.rs":"dd932cdde770d1ad0c0e5c147cb53aebdbfe6a023a6873e807f2429a14bc654d","tests/ui-nightly/transmute-ref-src-not-intobytes.stderr":"b551efcfe51676842fbcdfa9cbc7044470cbe1289adcd731f486ebaadf4d47aa","tests/ui-nightly/transmute-ref-src-not-nocell.rs":"cdd5eeb40f42963e7bec7b45283a53f4322df4a7068398089d0ddc18402ec0a9","tests/ui-nightly/transmute-ref-src-not-nocell.stderr":"1bbe3c1eef6b73c67a08299825451071dafbc8e73de3807624a635c4233b2dd3","tests/ui-nightly/transmute-ref-src-unsized.rs":"cbb75ec9eb3729442f57afc55758f4b638687ed0677e58a5e784b5f53e6a82ee","tests/ui-nightly/transmute-ref-src-unsized.stderr":"0095536d93fd5e48b95ce51beeb90e7d5ba595e9d1d39a0baff4352ea4e29f58","tests/ui-nightly/transmute-size-decrease.rs":"ef04ab5d6ed074c0d0ab0f979fba4b5a580e1ebeab431b7a432a4348194a67b9","tests/ui-nightly/transmute-size-decrease.stderr":"daa5aa155c5018eb91ec289c1675fc253140607c36922393668f4ab0d0b4401e","tests/ui-nightly/transmute-size-increase.rs":"d57c9f23ba23313236a84809b6a1e1d0fdfc67c1d64db8143f5762671eb68ca9","tests/ui-nightly/transmute-size-increase.stderr":"3c2cf176db54b8e9f0a8c2a6d0764454a9504e6ff95fdc9acc12f71a7b57a280","tests/ui-nightly/transmute-src-not-intobytes.rs":"e39129733ec5406376c1cd79a0eb2b66d89ee89e0cd629cf8ba5c8c6fe0c0cd1","tests/ui-nightly/transmute-src-not-intobytes.stderr":"bd9283266ac9c30cfea3d1a6f91e52a5972ed3bf83d8421a7c64f2911b805a92","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.rs":"9b4b6b062a4f1a0f29df9754c87b0ec0dfc75cc026ecbf57f67e48acf8ed3b0e","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.stderr":"93f81521554ae4ca5f38a5448834c3cb9fd33e7038e44cee5fa8dc78fa095288","tests/ui-nightly/try_transmute-size-decrease.rs":"7ec7d4c829f2a2df74149b880686371c2a64e293dcb6f5ec10a0c09c4f8229c0","tests/ui-nightly/try_transmute-size-decrease.stderr":"1ad2968f1243db577e85892b652bbc151f3602828c3a4e68b860cbf178d1e694","tests/ui-nightly/try_transmute-size-increase.rs":"5b085b4eb85a46d70ce03799652ba49bc4d51e861e821eddebd94919bcb0ad30","tests/ui-nightly/try_transmute-size-increase.stderr":"3e21640a804b7ab375eff3c3b8f9d802b2a4da4551b29dd83489faedb021b54a","tests/ui-nightly/try_transmute-src-not-intobytes.rs":"83ab8176279f90930b9548592114343d724b5af57999ed04cb5b5c32f56f5aad","tests/ui-nightly/try_transmute-src-not-intobytes.stderr":"cae4cec519a3b8067f5fc75288cbc850283123c577b37ed726de0a1b8b6e2655","tests/ui-nightly/try_transmute_mut-alignment-increase.rs":"6f16a7e4753153e84581902d3d42fc4f0cb2d7ef4b01b71bcaccb0d434dc0f9c","tests/ui-nightly/try_transmute_mut-alignment-increase.stderr":"74a715b6f48e41a43d74e2a6645cf42957a2201d15d91e00f7778fe390af7504","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.rs":"aeb4371e28787b0a2e75e616441a55129cd299d9681a81095c72e6e7f7b9512a","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.stderr":"321e83acf340e4ec84f3558b962c8ceed1cbc90d9587e755989023b613c30d8a","tests/ui-nightly/try_transmute_mut-size-decrease.rs":"35886c88a716734e77c05775d5a0766e9b637b9ed4cc76a9cfbba2aa262e1d13","tests/ui-nightly/try_transmute_mut-size-decrease.stderr":"02ba457b8a97a46a75af4fd26a621c6387fd020c42e4123dff4e072bf068ccdb","tests/ui-nightly/try_transmute_mut-size-increase.rs":"56fbb3134ebc173dc2d959515400b3a9cb9341835337ef3f554f350e316abdb2","tests/ui-nightly/try_transmute_mut-size-increase.stderr":"855253b0ca5e6e0a46b88077f1c4d43938b07c42d71f3c09d94cae3d83730a04","tests/ui-nightly/try_transmute_mut-src-not-intobytes.rs":"6d426e7cd765e9b633e6bb0585db7cad22c90ddb7ba403d7894d8bf6848395ed","tests/ui-nightly/try_transmute_mut-src-not-intobytes.stderr":"1ee8ee3b5baf3992d671dd4f07d3eab31ac1b48e7b012f8b5ad83070651c01d1","tests/ui-nightly/try_transmute_ref-alignment-increase.rs":"4401c8ae85558b388627f60a60960b33bf4df8eae28437ffa4d20bb668f47036","tests/ui-nightly/try_transmute_ref-alignment-increase.stderr":"7e5091f376fa99eeb8240dfdee4a18f73101e54ffd85c058900ce46906b36ac4","tests/ui-nightly/try_transmute_ref-dst-mutable.rs":"cc0497f618bc155ea07bb7538dc570c7e3bba708ad8e52189ea6e10fd63e40bf","tests/ui-nightly/try_transmute_ref-dst-mutable.stderr":"3ecd55adfd0ebd1d1f91444cd41776e052e1bf85d0f17dca454fd1b5889f03d5","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"9308e38dd814b2bab53b5912207cc7621635a5c547e621f947ba0d66e2601730","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"b59f2818bb1e3b145a86bf05c5c780153bf5e3cb30e25b2f39563bafd85f7af1","tests/ui-nightly/try_transmute_ref-size-decrease.rs":"084d0983a7855e3d1eb8a08b0ca9838b1e0b8a07fc88d867a2a7b4519f1057ab","tests/ui-nightly/try_transmute_ref-size-decrease.stderr":"b9b37df32c91aa8574ffcac50f3bccf12747af3c823a71f6df9f2c1bf912a40b","tests/ui-nightly/try_transmute_ref-size-increase.rs":"4d0fea16788077a938b14852a93c110b7791aa0013bfa12c1cfb4c6689b8eb24","tests/ui-nightly/try_transmute_ref-size-increase.stderr":"72391b2609791208e4ad07cf50aadf25ec86413027563c91890c2b4aba7bce0a","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.rs":"da8b40f0ffb13a891a0a3a76217532da81e7b71d5c6f9c1ebe78cff5c9fcc177","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.stderr":"0fd957d785b6fa2c9084c09aeef120f5b0dbb4ec6c4aa1f810b54a3efbdb1bca","tests/ui-stable/diagnostic-not-implemented-from-bytes.rs":"4bb5386f54737e163bc7240f1c06b43e82e943e42745fe7de14bca9ef0ea50c1","tests/ui-stable/diagnostic-not-implemented-from-bytes.stderr":"00d55d5070a77d60947a488bc88be730d16ec1f0f14f5b01ac8bbd69d1a1d4dc","tests/ui-stable/diagnostic-not-implemented-from-zeros.rs":"504fdc193b662116cad680d8354433aae2afd12650b7ce149c5d6c1b280ff650","tests/ui-stable/diagnostic-not-implemented-from-zeros.stderr":"b1e6fe06699c7be7fc49f987e6b985905e44c26a547907b58d1867751b3c1c9e","tests/ui-stable/diagnostic-not-implemented-immutable.rs":"df176f71d385efe46108dfc2d676c7fedddb48f0a9f53ec5fa903e6b7761cf92","tests/ui-stable/diagnostic-not-implemented-immutable.stderr":"f518f79ce9ad326613859ad0c5abc5ed035e0e0a15ce2f3a643182d4ac20dc5b","tests/ui-stable/diagnostic-not-implemented-into-bytes.rs":"5edc2bf1c76f28376eb17613d79025624efbb3465b471b317edb7d399c110e6e","tests/ui-stable/diagnostic-not-implemented-into-bytes.stderr":"2e93a0ee06f0fa6552cc6addfb0d7432879cd77b6c480680e99ba225e9436db9","tests/ui-stable/diagnostic-not-implemented-issue-1296.rs":"2f603de3cd80439cf2d50bb36fcc5b9d40c3bd06475273e6f135d9da335866d9","tests/ui-stable/diagnostic-not-implemented-issue-1296.stderr":"fd05a6126ee99c97bf588bc1945dee217ec6b1ebd6c5f9bc2e86d1568db5f21c","tests/ui-stable/diagnostic-not-implemented-known-layout.rs":"fa78a576df6c568a5ad8517efac60f5953a4d58b233e33e135638bcdfff43ae2","tests/ui-stable/diagnostic-not-implemented-known-layout.stderr":"c6c580eb089d6b3e72f84be6af84727cc8db2f8d6e9cc18baa8542f31d89bd8d","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.rs":"272d0a53001ba1145b6389077fa9d4b494d56651088ed1e929b7591ca4d76048","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.stderr":"70d8c7ce6cf862f5859c6559b4dac7104d2cc7d852af6b7cc62ba6d20dc03882","tests/ui-stable/diagnostic-not-implemented-unaligned.rs":"2966d1c424ddade377afc988dbf2bbc323011d222784a0869c6f804eba4d6cbc","tests/ui-stable/diagnostic-not-implemented-unaligned.stderr":"7d0aba840e75ae397534090e22dddebcf6a2895e92acfa4ca3b122dd0894b37f","tests/ui-stable/include_value_not_from_bytes.rs":"a08295e6ec9c4fc6fe0f6a90d7227acb444ce4680e64efb2c53c4ffbd7029dba","tests/ui-stable/include_value_not_from_bytes.stderr":"e89055768f51ec6d74a2f2477795951759ea58f1b46442b14d8ef5e22bfbf3c5","tests/ui-stable/include_value_wrong_size.rs":"4993458b5a5df4dabf7668203d30f01b756dbce7b27e2bd3fc6998987d673fcd","tests/ui-stable/include_value_wrong_size.stderr":"69cb54abc7ee3df7a9ebd4606efc36bb714239b8a24dc2db1d7b93291c65ca4e","tests/ui-stable/invalid-impls/invalid-impls.rs":"d135ef15bca8d0e7b2c3bf1596c57dbf4b5a98923089b4e5c060a830dd76ff3e","tests/ui-stable/invalid-impls/invalid-impls.stderr":"b686b789a657c0cdf0e1b3223234811337b4f3485a654e195afccd4fa6165161","tests/ui-stable/max-align.rs":"cdca9a14834aa08b1dea1a59baddd126a77cb7dffe9b90c9f9feb6b490c31594","tests/ui-stable/max-align.stderr":"19d3f22fa84379f9ac3a66f5133f429dbacd6e484f844546a5cf90f9141df52a","tests/ui-stable/transmute-dst-not-frombytes.rs":"532de6fb9bb6df56a8621a5f1abb4c58d957650461d266a59581deb36ee77316","tests/ui-stable/transmute-dst-not-frombytes.stderr":"2dfb06fcf3f62d9450dd3838abec66207f3affc63b0ec5d69a9dda3a87b5d764","tests/ui-stable/transmute-mut-alignment-increase.rs":"4c898b19c904440672c87b7b9ee5b15d996eb312e65b595abfdfcb03cff53345","tests/ui-stable/transmute-mut-alignment-increase.stderr":"73d0e4eaacca1da4ba0986164ec4ea8a16231bc28501b890e55ccac6a418bfc5","tests/ui-stable/transmute-mut-const.rs":"726368515b62c5a4e8c54c91239f28f77ccee01eb384893ac7797e7f47189455","tests/ui-stable/transmute-mut-const.stderr":"2d4dc99784abe6e6aa94adb1db2863387997893a92504f8a74a7f940e27654a4","tests/ui-stable/transmute-mut-dst-generic.rs":"41e6addb7da9fde8c3f93182b3cc484d3a2b5c1cfc077ecc66c0a6f27e22f647","tests/ui-stable/transmute-mut-dst-generic.stderr":"bd6e980582dbdacc490fbe7fa43c388b6fa6a6da60d911f08b77c316295f665d","tests/ui-stable/transmute-mut-dst-not-a-reference.rs":"6c0fecf8e2bfb51f2d5b46f0b6d6c454b235b26bf63a09e95e01d874125053cd","tests/ui-stable/transmute-mut-dst-not-a-reference.stderr":"ccabfdc69e4b2c5224050a9b5520b2bdc9d6652dc1b78de61d07cad3edb82daa","tests/ui-stable/transmute-mut-dst-not-frombytes.rs":"f51acc153ec92e2ac81b383e8ae662dd8ab253c0a62cd9d846f6d1e2ed76f5a2","tests/ui-stable/transmute-mut-dst-not-frombytes.stderr":"c99505cca64e65a8dc87b390cf85d94cd953de0e1d775821029a7ceb004ebfb9","tests/ui-stable/transmute-mut-dst-not-intobytes.rs":"b9ab140926cae46e0f253eddfa332a0845b25b49ffbe60a17694d06580235066","tests/ui-stable/transmute-mut-dst-not-intobytes.stderr":"81ab8da4af0b9c234bdc35062f8ba5864846c3690970acb31857d8bd44fa4065","tests/ui-stable/transmute-mut-dst-unsized.rs":"5c040c3eec4b360b4b65a948bcfe1220567cf5bb1939eeefd5bf200cd73d3b96","tests/ui-stable/transmute-mut-dst-unsized.stderr":"64084a80c8bcb1864c611a6186ebf6d02006aea18d5fbc8ab3020c77f23ad889","tests/ui-stable/transmute-mut-illegal-lifetime.rs":"cd95f98b5a7f43c9b9f20d53bedbfa0cc3d8b6ba2af182abf6a2098b31dc6c6e","tests/ui-stable/transmute-mut-illegal-lifetime.stderr":"030e0a765ec0b8c8b0a928451ec1c783ca395c65c8e445684a22a432cbd7af9a","tests/ui-stable/transmute-mut-size-decrease.rs":"9ab9c03ccf1546957e3412911564a9dad6f0940d55c5285945548f76186fec56","tests/ui-stable/transmute-mut-size-decrease.stderr":"991baa632937d8acbfc9caa58a9ec659f2dcaa412e2b92ea57a1df9edf977099","tests/ui-stable/transmute-mut-size-increase.rs":"70fa56ad32004364710f2c711859bf601aef0ab61ff5264b8f071d9d06769a63","tests/ui-stable/transmute-mut-size-increase.stderr":"b099797a8b28ac074ba077f06ccb5b1f8d155ea34d2ccb9821b8aaf7f74cbc49","tests/ui-stable/transmute-mut-src-dst-generic.rs":"880430db77b417304756e0244ac8187c4392a9b1887bdb9683246376a7a557a0","tests/ui-stable/transmute-mut-src-dst-generic.stderr":"13cf4024744134f35e2dbd75921023a0d9f89b7ba16005b4b2b15ac35d9b7003","tests/ui-stable/transmute-mut-src-dst-not-references.rs":"cbb01caa49218ce6e4914b03ad1b8bb99a648d7867152577add772de9f0a705e","tests/ui-stable/transmute-mut-src-dst-not-references.stderr":"a584f368fa4929a88f51cb67003cb2b15fdbe109e393606eea70cf1e0b878e32","tests/ui-stable/transmute-mut-src-dst-unsized.rs":"d52aec2bc815fac314a4ca5819d730a0d1dbac13b51bf2b844701d77ce969a8e","tests/ui-stable/transmute-mut-src-dst-unsized.stderr":"ce6a6fc09bf90254871bae8f67e008031ef46c2d3ea81b38c140ab6fd6c8b1df","tests/ui-stable/transmute-mut-src-generic.rs":"a013a66dfe3ca9fbf349c85794ec8a68a980929a56520df305e7a5a4f9922202","tests/ui-stable/transmute-mut-src-generic.stderr":"b8dbf4dc993b9204b9e532f8ceb63cb655ac0ed99e95cfe6ba206cbd68fae94d","tests/ui-stable/transmute-mut-src-immutable.rs":"1cb591944d85bb526f182fdc476a0ba965dade3dfbaac8a29a648045d9ac5a21","tests/ui-stable/transmute-mut-src-immutable.stderr":"c8a0e3107e1805329d83ad742067dbe9a794a7fdbec7da30e8a0622d6398e719","tests/ui-stable/transmute-mut-src-not-a-reference.rs":"a854a05999caebc97a08e37d037c4905a859e3a1f4f6d5e5803ff03af0bb5470","tests/ui-stable/transmute-mut-src-not-a-reference.stderr":"9e1ec4f9523ba33500f6d7cc6ceb754f0ff171c266239790397d143ea2490d16","tests/ui-stable/transmute-mut-src-not-frombytes.rs":"049b386c8bf296d45e8a1a1f020a763df4ea480a3e1027ccc8f6c31b05889c79","tests/ui-stable/transmute-mut-src-not-frombytes.stderr":"9fb887dab214fd94560f2031f626663f73ec6984079bca5fccb3b0e775626a6f","tests/ui-stable/transmute-mut-src-not-intobytes.rs":"12adc96a6bce75e01456c50e5fa08a93290a0b48ed13ef8571b0cad1211cbc8f","tests/ui-stable/transmute-mut-src-not-intobytes.stderr":"2190c114527bb2891ed924173d1cef491189c8b7d6837705eaa69c83d30fcd47","tests/ui-stable/transmute-mut-src-unsized.rs":"128a9f55a7b83c98e3bfafdd6a714e60ff545a322cecdef81f8702da3b1e3eb9","tests/ui-stable/transmute-mut-src-unsized.stderr":"55c8d44cf3104779738bc7b7d8ee177582ecb07435f44c0bd4376b22f00f5c4f","tests/ui-stable/transmute-ptr-to-usize.rs":"d8aabb58133988be7c282ec9771906b8f199418e69762c92ffc167305890d353","tests/ui-stable/transmute-ptr-to-usize.stderr":"5b2df5a1e61b169b7fa627963fc5a9801e33f05553bc15a827b2af19067c8d63","tests/ui-stable/transmute-ref-alignment-increase.rs":"adea0a036330e7d60a2fa663ca873dc24596fd81383545ef945d76adcca1c2ab","tests/ui-stable/transmute-ref-alignment-increase.stderr":"0c60d8a409adead884cf475502bd38e8b364ac4de5d4fb340538b82c143ba3ad","tests/ui-stable/transmute-ref-dst-generic.rs":"fceea5349611147b46a0d897ff4df4353ef2d2550c45a5ee14a74bba9fa272c1","tests/ui-stable/transmute-ref-dst-generic.stderr":"f710dfa3c427743804369b1003ae63ce28ce29dc99265e24a8d77efbfbfad590","tests/ui-stable/transmute-ref-dst-mutable.rs":"4283c537172971fda2c3c529c0971bbac66a4ac844bb6f0356f24284d4084b77","tests/ui-stable/transmute-ref-dst-mutable.stderr":"feb9f6b46c17d408830fda2f2a9a2498e55cac8f2f29c024704e9ab438de3aad","tests/ui-stable/transmute-ref-dst-not-a-reference.rs":"6829c16de2e2dcae944f846235e2f76fca742a24c6970559fc4d10bbf214f96b","tests/ui-stable/transmute-ref-dst-not-a-reference.stderr":"155e4b584557ec874e926e64ebe136ee7702b35b6f54a21338f96c481d34ee02","tests/ui-stable/transmute-ref-dst-not-frombytes.rs":"a989f7f680cd3072ee1a0dd631fab02caa30c64c53ced9b5719d79dbcfbcf97f","tests/ui-stable/transmute-ref-dst-not-frombytes.stderr":"dd1f3d8b3297f488212b9207eabfb08ad16b04e970db298307097b8517575e7c","tests/ui-stable/transmute-ref-dst-not-nocell.rs":"51ecd363ef66bbcf0d8daa3376667b8a9ad35b61d78765d502644c1183cbdf1c","tests/ui-stable/transmute-ref-dst-not-nocell.stderr":"0dd070ab85aa2fe6787ac95dcaac5c31f5984d76394ef50898e42900cbeb3ae3","tests/ui-stable/transmute-ref-dst-unsized.rs":"e3beead5f1b51a62ad8974c024fb0db3ed0611c05e5ab05a65ee284e150b3ff8","tests/ui-stable/transmute-ref-dst-unsized.stderr":"4464ba575fdef73a3e673f45f290bff488fc393703074cee4d47ebbc01c164d7","tests/ui-stable/transmute-ref-illegal-lifetime.rs":"771b734779b00309b7ab112891e5fa76af2d7b5a822b4db2f34b3edebf1f7b9d","tests/ui-stable/transmute-ref-illegal-lifetime.stderr":"541cbc3da9e96328ede88f6cbf6793a9bfeaa3b69a3adfc67aa1d401779b74bb","tests/ui-stable/transmute-ref-size-decrease.rs":"318b336f688eaeb7ddcb574cf750b7e1cc728b1db3ae97b5d025a325bcc95747","tests/ui-stable/transmute-ref-size-decrease.stderr":"433f5558c024581efb54991e8ebee97aedbff06b9b6f2c8581d34039ff671ed4","tests/ui-stable/transmute-ref-size-increase.rs":"7f3a5897b73dd9272eac08c4a43e3946fdf527761c3fb376a266e945ddb96448","tests/ui-stable/transmute-ref-size-increase.stderr":"f23c4fcaa3f1b97338d9c46a51e046bafd8d025a0049984995f75c5f7de0169d","tests/ui-stable/transmute-ref-src-dst-generic.rs":"2d25888552996fd964461247b07cf1a5974e6fc0dffed2464b795bdf56e7e518","tests/ui-stable/transmute-ref-src-dst-generic.stderr":"8053da1dc7d7d4cc9cdf1deeb9218aeb876794df5cf69df4d62cfd1b78613059","tests/ui-stable/transmute-ref-src-dst-not-references.rs":"b44e925cca270c67fc7f9c4dc18207acd90f77231f8cf79ec965b592586a890f","tests/ui-stable/transmute-ref-src-dst-not-references.stderr":"32a5ecd8509eebcc08ea529cade80ebef706b3c1a5c6f8c498c997b426b5d6a6","tests/ui-stable/transmute-ref-src-dst-unsized.rs":"902e8182ea6b3de7b6e548ae03abc54b5bb8b8a01057e25d1c5e12838876349d","tests/ui-stable/transmute-ref-src-dst-unsized.stderr":"00b9db39d0d09378a0c97a13b3afa1aa9e5e49a3b5ffaf2b8423d195d176c334","tests/ui-stable/transmute-ref-src-generic.rs":"57c4bbd0ec820778dcfdd40645741e2251f981ca4e98de9ac344c7dbb5381e16","tests/ui-stable/transmute-ref-src-generic.stderr":"3c5348f553baf2161a48edce631097e21cf7ad79e5c3d5482b175101dc877c5c","tests/ui-stable/transmute-ref-src-not-a-reference.rs":"69dc6327b77a6cfe806b3493a4287bdfa88d8b353256673ff1e4bc2e28c8eb28","tests/ui-stable/transmute-ref-src-not-a-reference.stderr":"f1fac4e3ca8cf71fcc05d3cb4780b7a1084615d6f1bc763a99fa18c06615c9d8","tests/ui-stable/transmute-ref-src-not-intobytes.rs":"dd932cdde770d1ad0c0e5c147cb53aebdbfe6a023a6873e807f2429a14bc654d","tests/ui-stable/transmute-ref-src-not-intobytes.stderr":"18fe85f152de5f32f96380e83d770879304585a3add66022e59efb1a17ae8017","tests/ui-stable/transmute-ref-src-not-nocell.rs":"cdd5eeb40f42963e7bec7b45283a53f4322df4a7068398089d0ddc18402ec0a9","tests/ui-stable/transmute-ref-src-not-nocell.stderr":"9179263979f422b52d1f9c999328464b7e4cee3be49f3f358d4783082544a34a","tests/ui-stable/transmute-ref-src-unsized.rs":"cbb75ec9eb3729442f57afc55758f4b638687ed0677e58a5e784b5f53e6a82ee","tests/ui-stable/transmute-ref-src-unsized.stderr":"09fab516d92566d8f8f4a288a692bc67899ed9dad25df226e6ddf0b5253dd5bb","tests/ui-stable/transmute-size-decrease.rs":"ef04ab5d6ed074c0d0ab0f979fba4b5a580e1ebeab431b7a432a4348194a67b9","tests/ui-stable/transmute-size-decrease.stderr":"d3853ca2545ca6e68315f1282aca6949d98d65a932789ad25feac2b827712bff","tests/ui-stable/transmute-size-increase.rs":"d57c9f23ba23313236a84809b6a1e1d0fdfc67c1d64db8143f5762671eb68ca9","tests/ui-stable/transmute-size-increase.stderr":"b94a3c90f34369921022a8018730a3cd79f8bd32cd6a2e2fb8afb0417a7011d4","tests/ui-stable/transmute-src-not-intobytes.rs":"e39129733ec5406376c1cd79a0eb2b66d89ee89e0cd629cf8ba5c8c6fe0c0cd1","tests/ui-stable/transmute-src-not-intobytes.stderr":"274484264462420d063df81263b57454c140dd36ac9a8f1362dc4f34f834b964","tests/ui-stable/try_transmute-dst-not-tryfrombytes.rs":"9b4b6b062a4f1a0f29df9754c87b0ec0dfc75cc026ecbf57f67e48acf8ed3b0e","tests/ui-stable/try_transmute-dst-not-tryfrombytes.stderr":"ce765b88e96411278c1a724c24bee01620b82b8b0e3473a3be4fe3583167ae88","tests/ui-stable/try_transmute-size-decrease.rs":"7ec7d4c829f2a2df74149b880686371c2a64e293dcb6f5ec10a0c09c4f8229c0","tests/ui-stable/try_transmute-size-decrease.stderr":"41e44f6ad37677ef271540c0095f18273ae97c87302e49fb6aa821b19bbffd33","tests/ui-stable/try_transmute-size-increase.rs":"5b085b4eb85a46d70ce03799652ba49bc4d51e861e821eddebd94919bcb0ad30","tests/ui-stable/try_transmute-size-increase.stderr":"abfe4c810d8997fd3a38d1045d77f508a5ff160621fb02648afd67d9947c0479","tests/ui-stable/try_transmute-src-not-intobytes.rs":"83ab8176279f90930b9548592114343d724b5af57999ed04cb5b5c32f56f5aad","tests/ui-stable/try_transmute-src-not-intobytes.stderr":"c6c8bcd7e21daa541e99d1706d1dcbe5ffa4d6cfc9a7c1dfac1ef9b49932dbb8","tests/ui-stable/try_transmute_mut-alignment-increase.rs":"6f16a7e4753153e84581902d3d42fc4f0cb2d7ef4b01b71bcaccb0d434dc0f9c","tests/ui-stable/try_transmute_mut-alignment-increase.stderr":"4e70576de4934ae1243020cd94c012e6a875d8f6f41f0683495cf780e74ba270","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.rs":"aeb4371e28787b0a2e75e616441a55129cd299d9681a81095c72e6e7f7b9512a","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.stderr":"73bac4be5a9f3e15ee5ffa07b506d39bc06b91cb025e74cf89bd8c9a32d879d5","tests/ui-stable/try_transmute_mut-size-decrease.rs":"35886c88a716734e77c05775d5a0766e9b637b9ed4cc76a9cfbba2aa262e1d13","tests/ui-stable/try_transmute_mut-size-decrease.stderr":"cfe3243c374b7acd446add73a94cda56f83c1a3e22ce6b6fb932e2020037f68b","tests/ui-stable/try_transmute_mut-size-increase.rs":"56fbb3134ebc173dc2d959515400b3a9cb9341835337ef3f554f350e316abdb2","tests/ui-stable/try_transmute_mut-size-increase.stderr":"92f8a071e9d6c5bfc7efd38f85cc23d8dc69f810e42d6e95855162f5d6d89e42","tests/ui-stable/try_transmute_mut-src-not-intobytes.rs":"6d426e7cd765e9b633e6bb0585db7cad22c90ddb7ba403d7894d8bf6848395ed","tests/ui-stable/try_transmute_mut-src-not-intobytes.stderr":"654aff1409a747300684b85bcb36f3c88b06afaab5e01d7f8c5cf71ca42d7356","tests/ui-stable/try_transmute_ref-alignment-increase.rs":"4401c8ae85558b388627f60a60960b33bf4df8eae28437ffa4d20bb668f47036","tests/ui-stable/try_transmute_ref-alignment-increase.stderr":"8fddf60d179378ce74bf4b885627ecdf916c00e13f1eeedee463a428123e6da0","tests/ui-stable/try_transmute_ref-dst-mutable.rs":"cc0497f618bc155ea07bb7538dc570c7e3bba708ad8e52189ea6e10fd63e40bf","tests/ui-stable/try_transmute_ref-dst-mutable.stderr":"d29cc786d1994b6aebac2258aeeaa3bbf03723ab2f21e855d18c63ecc5980f28","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"9308e38dd814b2bab53b5912207cc7621635a5c547e621f947ba0d66e2601730","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"411bdc19ef5c4690a70eadecb2991590370bca6df61891b0cf861f5173e4ebf6","tests/ui-stable/try_transmute_ref-size-decrease.rs":"084d0983a7855e3d1eb8a08b0ca9838b1e0b8a07fc88d867a2a7b4519f1057ab","tests/ui-stable/try_transmute_ref-size-decrease.stderr":"7c5f55445dc2e4dda5230b54103fc0abca4b9bf626c0a846a5a0f5c60b95d441","tests/ui-stable/try_transmute_ref-size-increase.rs":"4d0fea16788077a938b14852a93c110b7791aa0013bfa12c1cfb4c6689b8eb24","tests/ui-stable/try_transmute_ref-size-increase.stderr":"b06ee4233f86ee4de04d85b04fb7c31dce84bb328b727a3c5bb36389b5325584","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.rs":"da8b40f0ffb13a891a0a3a76217532da81e7b71d5c6f9c1ebe78cff5c9fcc177","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.stderr":"c39785a948572187b7202282400095230656c1cccace9da3219184f20e3a6b8c","win-cargo.bat":"cb0d4c835875e854253a11ae8d28ab0e00070096dcc4bfba6d7ab06c6790a759"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"ede4d1a0e948ee8f0f54a6e9e6fed9d2a5ba806bb1d600702aa789b77a706fc0","Android.bp":"f29d46801bd05d8e784a7d3033a91314b4bcde9ab7116764aad010d87db7e0d8","CHANGELOG.md":"e2b2be60932270ea30707700e553a050b044ffbb6303df84feaad6a729aebc07","CONTRIBUTING.md":"85209a827d866e207cdc1ed0110192a41c8371af86cbd6d1f2010dce88ae7a49","Cargo.toml":"bb7d5b9deb150783cb5e3b29b31e3857802611d767ac5d5d7296d3e72b702921","LICENSE":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-APACHE":"06f9864e3037a400a7f71dc1aa0f21e02424bc6a1e64830f099968dd03829208","LICENSE-BSD":"d28a77dc4dd456fe1000194260fb4bdf9b97c02e58ff3202c24b1abfdf858f06","LICENSE-MIT":"3e24ce9879b9a289b7413493fe10221df3551f197741ceeef6c38680dd1bf44f","METADATA":"d48679e111589d64bc396b8ca4e5f6db23d349245cf8b4e373ad3aa3d6303d8b","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","POLICIES.md":"2c88a1c9779bd76926e57478ecb54f633f7ed71b5dceb95a8aff1168e3cd708a","README.md":"11b7d40320fe792a2a9e536116032a23cdd3a38c8508834a0fe85c5dd72b08be","TEST_MAPPING":"20cde0a7b53544a9f3a65e3d60b64b01ae54892de9762cc8e51d38a5f8ceea4d","build.rs":"fdbbfba1fb64dadc4a4e0fc89c8eb2bcb71889ff737290c042be1ab14d447180","cargo.sh":"dac54d3a35b77498b165a902b948ab1a4e61ce6d80cdb4fb1cb99b061554f9b1","cargo_embargo.json":"8dadca62fb893eebf3315c2bd5c6faf68509954c1dae3d43fbb4b7ba3a9adc52","ci/check_all_toolchains_tested.sh":"65277017a3b96017036eab505921c30b789cff519fc10fa20ce1b00fe068eab8","ci/check_fmt.sh":"65a2a98c251f61d5804a0c2f3bfd16551eefef9c703324c603a14683c5a9baf2","ci/check_job_dependencies.sh":"7a48930c53d0c4500fcd6ddadbd2bcbed217c91de1a697ff9eae6012ad1cf85f","ci/check_readme.sh":"7360da9fef9a0b97d81badb52016f78c2e0e5e2960229e0696956ef566626e54","ci/check_versions.sh":"12c44efae36aeed4e4fc655d8f99a0b17194eba8716e589d81f8063fceb4d721","ci/release_crate_version.sh":"eead8dd30d3b86dc2a0821deedaa99e32d25373cd6e7f935ac7f9de6c1938c84","clippy.toml":"24577ed72d5ec356b0bd79a5ae1d38a79e8b15ae7b6e5b187cf0ef87ac2ef7f2","githooks/pre-push":"8f58f384a52f14baaae2cb06b687a0feccfc5df24d0ae817823b1bbc4d78dbf5","patches/LICENSE.patch":"fcafb83042215e4a906214694a50d4a76f333aadb3fcd6bee8547f3831c0b1a4","rustfmt.toml":"5c169706acf81062608764052838eafc68fe950d12d8ccda6013af5b446d63fe","src/byte_slice.rs":"3e5dd3a8dbc6556c8d9a035c7cf8ce4127b81d45d12a21e8e3e28587d7aa2a50","src/byteorder.rs":"6dff8fb8c04fb054431eee5a9ae1fce1746b840edd26a3bd98e59988b85b823a","src/deprecated.rs":"9361d398426a3e834b065fe188e592c7504f1335552d7863918a8f75a793db8e","src/error.rs":"15ad121a811b4111d10e6fac9e12152cc6ff8d7a1f2149377feba4fb49d60d00","src/impls.rs":"6f87145ff343afb93b947782d1ed9954905723074c88c152b95635397ac871b2","src/layout.rs":"21a840004a6919ad6c74a721af1edc59bc0558b0853ffcc110c20252136a23f6","src/lib.rs":"b8c459c1d19727eb307e3f62ddedf1620ee85e1881d39975a295175c393c6a6a","src/macros.rs":"9fb37d94e970ed890bbeab98ef7e234b9e33704f7a2dc3413ee204b394200d00","src/pointer/aliasing_safety.rs":"483198df1f9b2bca14a1630954e9ea0e1275963ff383afedfaf8d87a397f2740","src/pointer/mod.rs":"425bf5082767fe98d041e2dd95e705eec7629d94dcd36a3ed5dc6523d7f0400d","src/pointer/ptr.rs":"51ae8675f62b8b59e375f5910a36578e2e31a67fbea8b1ece961961930e6de73","src/ref.rs":"8b39604079965342da67c8727ca57fe078f0b95d2c02c9aec4183790a4ad68a8","src/util/macro_util.rs":"10df86d960f9f051200c4b05d70fda5eab07a312b28e90634bf455875b7d02d6","src/util/macros.rs":"28b6b8da66bed57374e874511e5b3497c53d58ea85e82bd502bdee360cb89e66","src/util/mod.rs":"d5e69ec37a8414ce237fd1aa7ade4f709382c12bf12c161fef0109d6b93a371a","src/wrappers.rs":"d6f5fea4cb462e0208bdbe82abc3191f268ee7d24f3737937270ec84cdb6e5a3","testdata/include_value/data":"87c24be7c86405fd019739c0e6362147a7e45b70d4a704282719ff9a4b62dd36","tests/trybuild.rs":"921ec22964a75a8354b4c94f95093b8f854655b71251d7858f583708511f7d77","tests/ui-msrv/diagnostic-not-implemented-from-bytes.rs":"4bb5386f54737e163bc7240f1c06b43e82e943e42745fe7de14bca9ef0ea50c1","tests/ui-msrv/diagnostic-not-implemented-from-bytes.stderr":"4089215b1df5a3c6bb2614000378bc4b4555d5e9b09008eb4f5a3d89deabdbb3","tests/ui-msrv/diagnostic-not-implemented-from-zeros.rs":"504fdc193b662116cad680d8354433aae2afd12650b7ce149c5d6c1b280ff650","tests/ui-msrv/diagnostic-not-implemented-from-zeros.stderr":"7fee78190af015710d94d5c3534bc8dc75157c462a32c4a89a2f4b932d4cb7f4","tests/ui-msrv/diagnostic-not-implemented-immutable.rs":"df176f71d385efe46108dfc2d676c7fedddb48f0a9f53ec5fa903e6b7761cf92","tests/ui-msrv/diagnostic-not-implemented-immutable.stderr":"4bcf0cba8c816a7a5e7f13256b273e0b83c4da317a7fe6b8e61e4909b509af02","tests/ui-msrv/diagnostic-not-implemented-into-bytes.rs":"5edc2bf1c76f28376eb17613d79025624efbb3465b471b317edb7d399c110e6e","tests/ui-msrv/diagnostic-not-implemented-into-bytes.stderr":"2ee6d51b0355f8387542230e22aa748dc9bec684c285d448189afc66f2da01ed","tests/ui-msrv/diagnostic-not-implemented-issue-1296.rs":"2f603de3cd80439cf2d50bb36fcc5b9d40c3bd06475273e6f135d9da335866d9","tests/ui-msrv/diagnostic-not-implemented-issue-1296.stderr":"2d7be324e42e09c9e6fce03d2b66cce55a2ee69e5a0aa07de0f71ec18baed1ba","tests/ui-msrv/diagnostic-not-implemented-known-layout.rs":"fa78a576df6c568a5ad8517efac60f5953a4d58b233e33e135638bcdfff43ae2","tests/ui-msrv/diagnostic-not-implemented-known-layout.stderr":"b4ff1049ca82c188053454f208c3003014a5bedd782fd03d7aa748dcdbf656ab","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.rs":"272d0a53001ba1145b6389077fa9d4b494d56651088ed1e929b7591ca4d76048","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.stderr":"a62b9bd963ca08819e43c531340f7b7bdc289041b653335879a23cb78289eaba","tests/ui-msrv/diagnostic-not-implemented-unaligned.rs":"2966d1c424ddade377afc988dbf2bbc323011d222784a0869c6f804eba4d6cbc","tests/ui-msrv/diagnostic-not-implemented-unaligned.stderr":"c8e633af41e48e2d7d2c89629b01a00a8019bc15726b03e2202065484a82b55e","tests/ui-msrv/include_value_not_from_bytes.rs":"a08295e6ec9c4fc6fe0f6a90d7227acb444ce4680e64efb2c53c4ffbd7029dba","tests/ui-msrv/include_value_not_from_bytes.stderr":"04cbcdc040f649d03cd9ebce8a1e6158645f836f44a72195bb153b9043ac34a8","tests/ui-msrv/include_value_wrong_size.rs":"4993458b5a5df4dabf7668203d30f01b756dbce7b27e2bd3fc6998987d673fcd","tests/ui-msrv/include_value_wrong_size.stderr":"7f501791ea006e3df03d9b3e0dcccc46f5d9bdbb5c64fcaaa31d126311318bb4","tests/ui-msrv/invalid-impls/invalid-impls.rs":"d135ef15bca8d0e7b2c3bf1596c57dbf4b5a98923089b4e5c060a830dd76ff3e","tests/ui-msrv/invalid-impls/invalid-impls.stderr":"ff24c7a5c75cdbbd9cd8919934cb922efb295104dae41490987e6f129977ab05","tests/ui-msrv/max-align.rs":"cdca9a14834aa08b1dea1a59baddd126a77cb7dffe9b90c9f9feb6b490c31594","tests/ui-msrv/max-align.stderr":"eef0eaf82a223fe5b406e2b507478474b47d323cd8cab32a730dcc230dfa4969","tests/ui-msrv/transmute-dst-not-frombytes.rs":"532de6fb9bb6df56a8621a5f1abb4c58d957650461d266a59581deb36ee77316","tests/ui-msrv/transmute-dst-not-frombytes.stderr":"84e2b67c3c9f73b7d561c97a91048ae9eb91f5e2737b1723bbe6ae1ba05cd9d4","tests/ui-msrv/transmute-mut-alignment-increase.rs":"4c898b19c904440672c87b7b9ee5b15d996eb312e65b595abfdfcb03cff53345","tests/ui-msrv/transmute-mut-alignment-increase.stderr":"9714d77cb5dad09b24f116c4018e8179d1c4fe7a130147cb6838b8d06b905f9c","tests/ui-msrv/transmute-mut-const.rs":"726368515b62c5a4e8c54c91239f28f77ccee01eb384893ac7797e7f47189455","tests/ui-msrv/transmute-mut-const.stderr":"d08ac7260d7d425e66fb273dc61f01dc7726b475d2912caabd62cffa912d48ba","tests/ui-msrv/transmute-mut-dst-generic.rs":"41e6addb7da9fde8c3f93182b3cc484d3a2b5c1cfc077ecc66c0a6f27e22f647","tests/ui-msrv/transmute-mut-dst-generic.stderr":"4f1d49ba0b043741e8881e6f53922e5b0b60dcadf8148a141395e471766a7679","tests/ui-msrv/transmute-mut-dst-not-a-reference.rs":"6c0fecf8e2bfb51f2d5b46f0b6d6c454b235b26bf63a09e95e01d874125053cd","tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr":"b10e6b76150168288a9ad5a494a93d2c92e31b74cfb9517d93ed82e9d06f1abb","tests/ui-msrv/transmute-mut-dst-not-frombytes.rs":"f51acc153ec92e2ac81b383e8ae662dd8ab253c0a62cd9d846f6d1e2ed76f5a2","tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr":"05000ba72ea1747a1c12806404dbb124edb068a39d85904d314acfdf412cdee1","tests/ui-msrv/transmute-mut-dst-not-intobytes.rs":"b9ab140926cae46e0f253eddfa332a0845b25b49ffbe60a17694d06580235066","tests/ui-msrv/transmute-mut-dst-not-intobytes.stderr":"6e170000866643500d9711b7002779d2d8fffbe06a3bc8632e6e9a4a8bdc1979","tests/ui-msrv/transmute-mut-dst-unsized.rs":"5c040c3eec4b360b4b65a948bcfe1220567cf5bb1939eeefd5bf200cd73d3b96","tests/ui-msrv/transmute-mut-dst-unsized.stderr":"73ccc44398fa6320a8e830313c812619072cfbc9e1a694c6f88a5fa06d7e0124","tests/ui-msrv/transmute-mut-illegal-lifetime.rs":"cd95f98b5a7f43c9b9f20d53bedbfa0cc3d8b6ba2af182abf6a2098b31dc6c6e","tests/ui-msrv/transmute-mut-illegal-lifetime.stderr":"914c16f19c5ad3418e08e3701fb693f4dae1ed844dd2d357a4d861d3df8704c3","tests/ui-msrv/transmute-mut-size-decrease.rs":"9ab9c03ccf1546957e3412911564a9dad6f0940d55c5285945548f76186fec56","tests/ui-msrv/transmute-mut-size-decrease.stderr":"b7ee92e76faa4129d75d9f986ce2e5ef50f8924fef485ace3e0ad732062e28cd","tests/ui-msrv/transmute-mut-size-increase.rs":"70fa56ad32004364710f2c711859bf601aef0ab61ff5264b8f071d9d06769a63","tests/ui-msrv/transmute-mut-size-increase.stderr":"79ffa82f2d0c53fe5b2e55f0f358c7d20f8452cf892f3866716e08b4ea6322bd","tests/ui-msrv/transmute-mut-src-dst-generic.rs":"880430db77b417304756e0244ac8187c4392a9b1887bdb9683246376a7a557a0","tests/ui-msrv/transmute-mut-src-dst-generic.stderr":"369d3e3947e81de8f3e2fa49ade8e8263e7b493bc4e7d5560e44796a960fe87b","tests/ui-msrv/transmute-mut-src-dst-not-references.rs":"cbb01caa49218ce6e4914b03ad1b8bb99a648d7867152577add772de9f0a705e","tests/ui-msrv/transmute-mut-src-dst-not-references.stderr":"93584326ab2fd8dd8e4ebef465bc3541761ea43ff5aac3a7794aa4ee52eaca2f","tests/ui-msrv/transmute-mut-src-dst-unsized.rs":"d52aec2bc815fac314a4ca5819d730a0d1dbac13b51bf2b844701d77ce969a8e","tests/ui-msrv/transmute-mut-src-dst-unsized.stderr":"881f46cb6943f842351be5c0c76ef2ddc87e4a194dac8959d280b68cd7250fe2","tests/ui-msrv/transmute-mut-src-generic.rs":"a013a66dfe3ca9fbf349c85794ec8a68a980929a56520df305e7a5a4f9922202","tests/ui-msrv/transmute-mut-src-generic.stderr":"2978625f4a64e19ab7c90daa94053ea3e57012e4e42de1aed645c8dfe1ad9221","tests/ui-msrv/transmute-mut-src-immutable.rs":"1cb591944d85bb526f182fdc476a0ba965dade3dfbaac8a29a648045d9ac5a21","tests/ui-msrv/transmute-mut-src-immutable.stderr":"48ddd05834acde5456f6b6e9e389098995a837562dbde288d813b0c9233900b0","tests/ui-msrv/transmute-mut-src-not-a-reference.rs":"a854a05999caebc97a08e37d037c4905a859e3a1f4f6d5e5803ff03af0bb5470","tests/ui-msrv/transmute-mut-src-not-a-reference.stderr":"10a77e576756bdeb3867c5f8b54687c8ef68660b3ebc15265acc2d0c4234577c","tests/ui-msrv/transmute-mut-src-not-frombytes.rs":"049b386c8bf296d45e8a1a1f020a763df4ea480a3e1027ccc8f6c31b05889c79","tests/ui-msrv/transmute-mut-src-not-frombytes.stderr":"034da485616c2a7430868b6827bcef2e5c9c39fe4c89ac577eb58f4dc63091d9","tests/ui-msrv/transmute-mut-src-not-intobytes.rs":"12adc96a6bce75e01456c50e5fa08a93290a0b48ed13ef8571b0cad1211cbc8f","tests/ui-msrv/transmute-mut-src-not-intobytes.stderr":"b693b1af440fc684c9cbebe580d58ba3f1909e8ee52a7b27234e2b3d6fb9b2e1","tests/ui-msrv/transmute-mut-src-unsized.rs":"128a9f55a7b83c98e3bfafdd6a714e60ff545a322cecdef81f8702da3b1e3eb9","tests/ui-msrv/transmute-mut-src-unsized.stderr":"8bbcb2bde1a1257a087a7fc240ad897508c371b90478586a6b8cadb0e8594218","tests/ui-msrv/transmute-ptr-to-usize.rs":"d8aabb58133988be7c282ec9771906b8f199418e69762c92ffc167305890d353","tests/ui-msrv/transmute-ptr-to-usize.stderr":"80764029a66325c51dffca8961dfaae3b0c9b3723d8c1d53933942ffac6deb2f","tests/ui-msrv/transmute-ref-alignment-increase.rs":"adea0a036330e7d60a2fa663ca873dc24596fd81383545ef945d76adcca1c2ab","tests/ui-msrv/transmute-ref-alignment-increase.stderr":"396fd42941a0259a13d868554e6bf7e9a72753ebf3198d13eb3faa6efcc3f81c","tests/ui-msrv/transmute-ref-dst-generic.rs":"fceea5349611147b46a0d897ff4df4353ef2d2550c45a5ee14a74bba9fa272c1","tests/ui-msrv/transmute-ref-dst-generic.stderr":"1e4429d9600ff4cb5f729779c32cd239cc39e6cd7a1b20bb2e52824bc0d7c804","tests/ui-msrv/transmute-ref-dst-mutable.rs":"4283c537172971fda2c3c529c0971bbac66a4ac844bb6f0356f24284d4084b77","tests/ui-msrv/transmute-ref-dst-mutable.stderr":"bce1331bebdebfbc253e8945f68897d9f0abd1a2eff9259e6657daba1bdae9fd","tests/ui-msrv/transmute-ref-dst-not-a-reference.rs":"6829c16de2e2dcae944f846235e2f76fca742a24c6970559fc4d10bbf214f96b","tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr":"b94916f2a4fddd7280cfc4114be176479ecefd8030891791d38760a475e688f7","tests/ui-msrv/transmute-ref-dst-not-frombytes.rs":"a989f7f680cd3072ee1a0dd631fab02caa30c64c53ced9b5719d79dbcfbcf97f","tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr":"aef30d5527db0585fcc4cd9ceef91a49b31ebff3c3e6c8d385616fde1dac2b0f","tests/ui-msrv/transmute-ref-dst-not-nocell.rs":"51ecd363ef66bbcf0d8daa3376667b8a9ad35b61d78765d502644c1183cbdf1c","tests/ui-msrv/transmute-ref-dst-not-nocell.stderr":"7626fce7a73436c76c9fedb695a35cf05a749b131ec39ff6e664b80c5f47506a","tests/ui-msrv/transmute-ref-dst-unsized.rs":"e3beead5f1b51a62ad8974c024fb0db3ed0611c05e5ab05a65ee284e150b3ff8","tests/ui-msrv/transmute-ref-dst-unsized.stderr":"c1c57f34ec8166ce885fd244afce0a70898563e9b4966d07f1c0e4713c8ed906","tests/ui-msrv/transmute-ref-illegal-lifetime.rs":"771b734779b00309b7ab112891e5fa76af2d7b5a822b4db2f34b3edebf1f7b9d","tests/ui-msrv/transmute-ref-illegal-lifetime.stderr":"6fee6a359ec36d57358d73a87af9ed45b380f10a6a07212fc711c7671828ec82","tests/ui-msrv/transmute-ref-size-decrease.rs":"318b336f688eaeb7ddcb574cf750b7e1cc728b1db3ae97b5d025a325bcc95747","tests/ui-msrv/transmute-ref-size-decrease.stderr":"76f3e04b668db7118c8914877d57e6d79d8812d50fc98e651252de6319309e25","tests/ui-msrv/transmute-ref-size-increase.rs":"7f3a5897b73dd9272eac08c4a43e3946fdf527761c3fb376a266e945ddb96448","tests/ui-msrv/transmute-ref-size-increase.stderr":"809749bdc3acfb0d0575962659aff3f15e1c464a6d9e421448d674c2230b3c49","tests/ui-msrv/transmute-ref-src-dst-generic.rs":"2d25888552996fd964461247b07cf1a5974e6fc0dffed2464b795bdf56e7e518","tests/ui-msrv/transmute-ref-src-dst-generic.stderr":"199483e82b59ad8724485d64062c623124714a31a4a4aa38fd2808521d7f9eb4","tests/ui-msrv/transmute-ref-src-dst-not-references.rs":"b44e925cca270c67fc7f9c4dc18207acd90f77231f8cf79ec965b592586a890f","tests/ui-msrv/transmute-ref-src-dst-not-references.stderr":"b58f31a729ee4a90f8c30ff950c02d49d6ca340d882b431f7764120b0ff8d829","tests/ui-msrv/transmute-ref-src-dst-unsized.rs":"902e8182ea6b3de7b6e548ae03abc54b5bb8b8a01057e25d1c5e12838876349d","tests/ui-msrv/transmute-ref-src-dst-unsized.stderr":"e419f9725cf4a4dd8df13335ede12fff4b8eaba1ae0537831df8e39e46992c29","tests/ui-msrv/transmute-ref-src-generic.rs":"57c4bbd0ec820778dcfdd40645741e2251f981ca4e98de9ac344c7dbb5381e16","tests/ui-msrv/transmute-ref-src-generic.stderr":"06042e71a9b709923edd9ea77ba9c71d1d1564445a15a7971fdaf284abe552a0","tests/ui-msrv/transmute-ref-src-not-a-reference.rs":"69dc6327b77a6cfe806b3493a4287bdfa88d8b353256673ff1e4bc2e28c8eb28","tests/ui-msrv/transmute-ref-src-not-a-reference.stderr":"da596f7aa5e826b171e3bea5b39cc7c5c19d232d9b575095943e83af802dee08","tests/ui-msrv/transmute-ref-src-not-intobytes.rs":"dd932cdde770d1ad0c0e5c147cb53aebdbfe6a023a6873e807f2429a14bc654d","tests/ui-msrv/transmute-ref-src-not-intobytes.stderr":"b6837722a77618c0a5e3adf04250a381eb0fe45563e231c658a306ca3e373847","tests/ui-msrv/transmute-ref-src-not-nocell.rs":"cdd5eeb40f42963e7bec7b45283a53f4322df4a7068398089d0ddc18402ec0a9","tests/ui-msrv/transmute-ref-src-not-nocell.stderr":"2c3929245c9435c725724839cec07e38dfd1e77927931005bf9f14e3aad794b3","tests/ui-msrv/transmute-ref-src-unsized.rs":"cbb75ec9eb3729442f57afc55758f4b638687ed0677e58a5e784b5f53e6a82ee","tests/ui-msrv/transmute-ref-src-unsized.stderr":"c0c284ae12d1e66006238c401ebc695b3b6c53dfc4ea203c5634a397c4e9f499","tests/ui-msrv/transmute-size-decrease.rs":"ef04ab5d6ed074c0d0ab0f979fba4b5a580e1ebeab431b7a432a4348194a67b9","tests/ui-msrv/transmute-size-decrease.stderr":"bb3ba97e5f733b67714bc2502be26096eecdc1aada43ade0e1bb5baaebbc1be0","tests/ui-msrv/transmute-size-increase.rs":"d57c9f23ba23313236a84809b6a1e1d0fdfc67c1d64db8143f5762671eb68ca9","tests/ui-msrv/transmute-size-increase.stderr":"73a98194a0dcf4af4eb3f5b3e06ff9c1fc3710f4a629e1c51abff165642e12aa","tests/ui-msrv/transmute-src-not-intobytes.rs":"e39129733ec5406376c1cd79a0eb2b66d89ee89e0cd629cf8ba5c8c6fe0c0cd1","tests/ui-msrv/transmute-src-not-intobytes.stderr":"a92c335cdf37ad91e524b31ba674e8ac60f7a46934d14da39ba8ce05fbe134a2","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.rs":"9b4b6b062a4f1a0f29df9754c87b0ec0dfc75cc026ecbf57f67e48acf8ed3b0e","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.stderr":"2bec587fd16b99c1d3e4cc42031f00fd7b6381ff4baba56c937c3d819eff1ac4","tests/ui-msrv/try_transmute-size-decrease.rs":"7ec7d4c829f2a2df74149b880686371c2a64e293dcb6f5ec10a0c09c4f8229c0","tests/ui-msrv/try_transmute-size-decrease.stderr":"d42b2c8fdd44d6b5172d5bb507b8c45bf44b3feb98501940d7e37d16b07aebca","tests/ui-msrv/try_transmute-size-increase.rs":"5b085b4eb85a46d70ce03799652ba49bc4d51e861e821eddebd94919bcb0ad30","tests/ui-msrv/try_transmute-size-increase.stderr":"0ef17b0ea081da61831dfccfdc47532278955eaffc1ba2981cec7333d93b8f93","tests/ui-msrv/try_transmute-src-not-intobytes.rs":"83ab8176279f90930b9548592114343d724b5af57999ed04cb5b5c32f56f5aad","tests/ui-msrv/try_transmute-src-not-intobytes.stderr":"20985ea4dbaa60825db12cb0db36d3919175ed046c8dd786ab08612bec91e24a","tests/ui-msrv/try_transmute_mut-alignment-increase.rs":"6f16a7e4753153e84581902d3d42fc4f0cb2d7ef4b01b71bcaccb0d434dc0f9c","tests/ui-msrv/try_transmute_mut-alignment-increase.stderr":"f9f50bf211cd30ac6eb653dea5b654a747ce2af13c5e84535c0db078bbf5f09f","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.rs":"aeb4371e28787b0a2e75e616441a55129cd299d9681a81095c72e6e7f7b9512a","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.stderr":"14ff79216efe8ec2c47daa4799f6aa4bdb8757556b9582492034b75cec5bf766","tests/ui-msrv/try_transmute_mut-size-decrease.rs":"35886c88a716734e77c05775d5a0766e9b637b9ed4cc76a9cfbba2aa262e1d13","tests/ui-msrv/try_transmute_mut-size-decrease.stderr":"60c65a6a4062ddf51aa878d60ed048d2580bc0da0085281c4cf1d7b0bafd451c","tests/ui-msrv/try_transmute_mut-size-increase.rs":"56fbb3134ebc173dc2d959515400b3a9cb9341835337ef3f554f350e316abdb2","tests/ui-msrv/try_transmute_mut-size-increase.stderr":"4eda49b143d847bc6679d478edd985bfc470b1f7a81b443aa7f4cc60087cf524","tests/ui-msrv/try_transmute_mut-src-not-intobytes.rs":"6d426e7cd765e9b633e6bb0585db7cad22c90ddb7ba403d7894d8bf6848395ed","tests/ui-msrv/try_transmute_mut-src-not-intobytes.stderr":"13aed6a3078e732fc281710798e0f5440bfc2f3516f237d8e1164904f756a977","tests/ui-msrv/try_transmute_ref-alignment-increase.rs":"4401c8ae85558b388627f60a60960b33bf4df8eae28437ffa4d20bb668f47036","tests/ui-msrv/try_transmute_ref-alignment-increase.stderr":"94c5c47b77019bf307e009b38589317eb3308ba8b6706b920d5fcadf550a3b8e","tests/ui-msrv/try_transmute_ref-dst-mutable.rs":"cc0497f618bc155ea07bb7538dc570c7e3bba708ad8e52189ea6e10fd63e40bf","tests/ui-msrv/try_transmute_ref-dst-mutable.stderr":"598902a4e5023ffe5758c362abfedad411e027b4473c76e894a361d2c2f22ec6","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"9308e38dd814b2bab53b5912207cc7621635a5c547e621f947ba0d66e2601730","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"9a3b289fff477333baf68bb61bec4e167d02cb177be3803b42001dc256f3f453","tests/ui-msrv/try_transmute_ref-size-decrease.rs":"084d0983a7855e3d1eb8a08b0ca9838b1e0b8a07fc88d867a2a7b4519f1057ab","tests/ui-msrv/try_transmute_ref-size-decrease.stderr":"bf5148e7b5bcbb3fbbf83ada9b3f79e4ea0c40105b21720f9d1115773e371ee7","tests/ui-msrv/try_transmute_ref-size-increase.rs":"4d0fea16788077a938b14852a93c110b7791aa0013bfa12c1cfb4c6689b8eb24","tests/ui-msrv/try_transmute_ref-size-increase.stderr":"6898694893e788813173aeade8233ee48ad3b8eda57cc9b412ebc06af586d129","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.rs":"da8b40f0ffb13a891a0a3a76217532da81e7b71d5c6f9c1ebe78cff5c9fcc177","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.stderr":"e59012471cdd2b69bc96b5d9e146058ab30e6bbbe0e432b22158d3a45caacb03","tests/ui-nightly/diagnostic-not-implemented-from-bytes.rs":"4bb5386f54737e163bc7240f1c06b43e82e943e42745fe7de14bca9ef0ea50c1","tests/ui-nightly/diagnostic-not-implemented-from-bytes.stderr":"d0e6bf4707a48c1f8c75527edd27735f0bfe04b562c00c88c6e43b43af029e8b","tests/ui-nightly/diagnostic-not-implemented-from-zeros.rs":"504fdc193b662116cad680d8354433aae2afd12650b7ce149c5d6c1b280ff650","tests/ui-nightly/diagnostic-not-implemented-from-zeros.stderr":"b09ff91579e1b467aca6c217251ee0f197257838923ad4e832d0ecd71fb9a283","tests/ui-nightly/diagnostic-not-implemented-immutable.rs":"df176f71d385efe46108dfc2d676c7fedddb48f0a9f53ec5fa903e6b7761cf92","tests/ui-nightly/diagnostic-not-implemented-immutable.stderr":"ce7e567bd10fedfdf7d33e088805d955a66d8388ee65988a3e574e12eac6270a","tests/ui-nightly/diagnostic-not-implemented-into-bytes.rs":"5edc2bf1c76f28376eb17613d79025624efbb3465b471b317edb7d399c110e6e","tests/ui-nightly/diagnostic-not-implemented-into-bytes.stderr":"a0a9e604da0412a7cea16c649196a045b6a2f0cb69f43c961b5a08eea76fe74c","tests/ui-nightly/diagnostic-not-implemented-issue-1296.rs":"2f603de3cd80439cf2d50bb36fcc5b9d40c3bd06475273e6f135d9da335866d9","tests/ui-nightly/diagnostic-not-implemented-issue-1296.stderr":"668d4470b770ebb67f3afa1faadff16234a6fd68961aa4732eb60d3e24a5d845","tests/ui-nightly/diagnostic-not-implemented-known-layout.rs":"fa78a576df6c568a5ad8517efac60f5953a4d58b233e33e135638bcdfff43ae2","tests/ui-nightly/diagnostic-not-implemented-known-layout.stderr":"fe85103ea5bed6073f5f9be9f96e99be91af4a0d1665e1929c21c57d631180ef","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.rs":"272d0a53001ba1145b6389077fa9d4b494d56651088ed1e929b7591ca4d76048","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.stderr":"ccf8320bbd97bd44406934ee837a84790ab8f05822f87f5f3ed816d047cdf9c8","tests/ui-nightly/diagnostic-not-implemented-unaligned.rs":"2966d1c424ddade377afc988dbf2bbc323011d222784a0869c6f804eba4d6cbc","tests/ui-nightly/diagnostic-not-implemented-unaligned.stderr":"74b52b9885291dc3268a07006abd52dbb08ee4bb81342753a87afe0150f3662a","tests/ui-nightly/include_value_not_from_bytes.rs":"a08295e6ec9c4fc6fe0f6a90d7227acb444ce4680e64efb2c53c4ffbd7029dba","tests/ui-nightly/include_value_not_from_bytes.stderr":"b9f9fcd0eb2d39704970c8f86bd3ce4eaf33b4c4a9eda58d0414cc5408c6b61c","tests/ui-nightly/include_value_wrong_size.rs":"4993458b5a5df4dabf7668203d30f01b756dbce7b27e2bd3fc6998987d673fcd","tests/ui-nightly/include_value_wrong_size.stderr":"cf7ab76adbdcde63f4b12b7f97724d5a929788afde3dfe27afcc06841cacd364","tests/ui-nightly/invalid-impls/invalid-impls.rs":"d135ef15bca8d0e7b2c3bf1596c57dbf4b5a98923089b4e5c060a830dd76ff3e","tests/ui-nightly/invalid-impls/invalid-impls.stderr":"78696f82238459ae50851e30a89bd8bcf6c2a07edb09e79055cd92561c494949","tests/ui-nightly/max-align.rs":"cdca9a14834aa08b1dea1a59baddd126a77cb7dffe9b90c9f9feb6b490c31594","tests/ui-nightly/max-align.stderr":"0382389bea42134ee3fb73e79cdde8821264fd21c9f8da91dd98b240d4e592a4","tests/ui-nightly/transmute-dst-not-frombytes.rs":"532de6fb9bb6df56a8621a5f1abb4c58d957650461d266a59581deb36ee77316","tests/ui-nightly/transmute-dst-not-frombytes.stderr":"27131268c9a6d1908bd399e7c02b0e54e12f00f56ef6f45e4fb007a2e2f814d4","tests/ui-nightly/transmute-mut-alignment-increase.rs":"4c898b19c904440672c87b7b9ee5b15d996eb312e65b595abfdfcb03cff53345","tests/ui-nightly/transmute-mut-alignment-increase.stderr":"6953ae0f33bcd9e911b263d56c3a82702ac22deee81c854e23d79b5edf26db4c","tests/ui-nightly/transmute-mut-const.rs":"726368515b62c5a4e8c54c91239f28f77ccee01eb384893ac7797e7f47189455","tests/ui-nightly/transmute-mut-const.stderr":"173ffdf5487393ba533c3c3e939c2b86738b6203d1718e9f7a8ff2a68cd4d50c","tests/ui-nightly/transmute-mut-dst-generic.rs":"41e6addb7da9fde8c3f93182b3cc484d3a2b5c1cfc077ecc66c0a6f27e22f647","tests/ui-nightly/transmute-mut-dst-generic.stderr":"4c57933cb9db077d9be42b1c52f7371d13a04d1a385a297e63f543477961a00c","tests/ui-nightly/transmute-mut-dst-not-a-reference.rs":"6c0fecf8e2bfb51f2d5b46f0b6d6c454b235b26bf63a09e95e01d874125053cd","tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr":"39a9aa400068c67a5121d594ccbf775161328e2d96703ec557259a0967a873f3","tests/ui-nightly/transmute-mut-dst-not-frombytes.rs":"f51acc153ec92e2ac81b383e8ae662dd8ab253c0a62cd9d846f6d1e2ed76f5a2","tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr":"ac49fe2fd04c795f75791d6456fbd8d96b1ff81161c05fc587e24e29f8aa2647","tests/ui-nightly/transmute-mut-dst-not-intobytes.rs":"b9ab140926cae46e0f253eddfa332a0845b25b49ffbe60a17694d06580235066","tests/ui-nightly/transmute-mut-dst-not-intobytes.stderr":"5f4b571e0531c8b00a1eefa31553f7b21fb6efe26929393b96af6a14dc79daae","tests/ui-nightly/transmute-mut-dst-unsized.rs":"5c040c3eec4b360b4b65a948bcfe1220567cf5bb1939eeefd5bf200cd73d3b96","tests/ui-nightly/transmute-mut-dst-unsized.stderr":"896a128d004daf46732047d051e3240a6449f863b151027f3733626bd9336c75","tests/ui-nightly/transmute-mut-illegal-lifetime.rs":"cd95f98b5a7f43c9b9f20d53bedbfa0cc3d8b6ba2af182abf6a2098b31dc6c6e","tests/ui-nightly/transmute-mut-illegal-lifetime.stderr":"4a0979b14505f84ef7c6a701bb0134251c720ae78d398e0e467ac5c3f4dbbd4e","tests/ui-nightly/transmute-mut-size-decrease.rs":"9ab9c03ccf1546957e3412911564a9dad6f0940d55c5285945548f76186fec56","tests/ui-nightly/transmute-mut-size-decrease.stderr":"d2b080797a83dfb2168e2641483bac5672a033d3a8a90bbc8732d2f062bad7a9","tests/ui-nightly/transmute-mut-size-increase.rs":"70fa56ad32004364710f2c711859bf601aef0ab61ff5264b8f071d9d06769a63","tests/ui-nightly/transmute-mut-size-increase.stderr":"f884f89285f7b4fdbf97ac8af67a47d3b3f14da8d4effde160f6fa34ccbd9077","tests/ui-nightly/transmute-mut-src-dst-generic.rs":"880430db77b417304756e0244ac8187c4392a9b1887bdb9683246376a7a557a0","tests/ui-nightly/transmute-mut-src-dst-generic.stderr":"822747c6985827da75680660c52db65a28c8ebd97ffabda1060d7c04e61ef1ef","tests/ui-nightly/transmute-mut-src-dst-not-references.rs":"cbb01caa49218ce6e4914b03ad1b8bb99a648d7867152577add772de9f0a705e","tests/ui-nightly/transmute-mut-src-dst-not-references.stderr":"107640628a6e6c0cd9358de8d1841a1442409cd39ce789870d07cd62eb825e02","tests/ui-nightly/transmute-mut-src-dst-unsized.rs":"d52aec2bc815fac314a4ca5819d730a0d1dbac13b51bf2b844701d77ce969a8e","tests/ui-nightly/transmute-mut-src-dst-unsized.stderr":"5e2f582c22507e8ee21947b3f6fde213e3c282c700a9b9fb52662ce5f7d2ac7b","tests/ui-nightly/transmute-mut-src-generic.rs":"a013a66dfe3ca9fbf349c85794ec8a68a980929a56520df305e7a5a4f9922202","tests/ui-nightly/transmute-mut-src-generic.stderr":"d34b17cc3c86a3b9ade3f48979091690f7628ac1c5a741d52cfe751db0809abb","tests/ui-nightly/transmute-mut-src-immutable.rs":"1cb591944d85bb526f182fdc476a0ba965dade3dfbaac8a29a648045d9ac5a21","tests/ui-nightly/transmute-mut-src-immutable.stderr":"39535092fe08383c4c3402e45d1a77f375dd023a2d8a751a902bed545534a55f","tests/ui-nightly/transmute-mut-src-not-a-reference.rs":"a854a05999caebc97a08e37d037c4905a859e3a1f4f6d5e5803ff03af0bb5470","tests/ui-nightly/transmute-mut-src-not-a-reference.stderr":"d17b2875a1dc1d904f8dbb6001dad080100b653673f5cc6ee192825666400fe9","tests/ui-nightly/transmute-mut-src-not-frombytes.rs":"049b386c8bf296d45e8a1a1f020a763df4ea480a3e1027ccc8f6c31b05889c79","tests/ui-nightly/transmute-mut-src-not-frombytes.stderr":"8ec2e28872ba7d08e597ecbc5bea5ba4875846c4e0bef3583f67beebeba8b470","tests/ui-nightly/transmute-mut-src-not-intobytes.rs":"12adc96a6bce75e01456c50e5fa08a93290a0b48ed13ef8571b0cad1211cbc8f","tests/ui-nightly/transmute-mut-src-not-intobytes.stderr":"77e790c7036ea63560945d06816232c6e04b864a5d16b6a19418dd984bd099b9","tests/ui-nightly/transmute-mut-src-unsized.rs":"128a9f55a7b83c98e3bfafdd6a714e60ff545a322cecdef81f8702da3b1e3eb9","tests/ui-nightly/transmute-mut-src-unsized.stderr":"5918d349eb2d8ec0452728ec16440bb9a3ee8fe2c45ddb8efa08e36b7a38b62d","tests/ui-nightly/transmute-ptr-to-usize.rs":"d8aabb58133988be7c282ec9771906b8f199418e69762c92ffc167305890d353","tests/ui-nightly/transmute-ptr-to-usize.stderr":"52244e5fdd1f8c620c745cca54f594eebea3408101ac77def8b2889e4a86c8de","tests/ui-nightly/transmute-ref-alignment-increase.rs":"adea0a036330e7d60a2fa663ca873dc24596fd81383545ef945d76adcca1c2ab","tests/ui-nightly/transmute-ref-alignment-increase.stderr":"db8bc6a0ac55ed87f35ddeb22965c7259b6a076d7616b56fe4fa0db4e201cd1b","tests/ui-nightly/transmute-ref-dst-generic.rs":"fceea5349611147b46a0d897ff4df4353ef2d2550c45a5ee14a74bba9fa272c1","tests/ui-nightly/transmute-ref-dst-generic.stderr":"9d5f318f064a2f5f4a23d27ace8757b38db048badfde9f3a8ec8a45b2c272506","tests/ui-nightly/transmute-ref-dst-mutable.rs":"4283c537172971fda2c3c529c0971bbac66a4ac844bb6f0356f24284d4084b77","tests/ui-nightly/transmute-ref-dst-mutable.stderr":"0c11986772b58a910ac8a7d601002afc02cd378f45382827ce21b25ed64e7ab9","tests/ui-nightly/transmute-ref-dst-not-a-reference.rs":"6829c16de2e2dcae944f846235e2f76fca742a24c6970559fc4d10bbf214f96b","tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr":"718ffdabf82ebe3f12e6f592efe4016cadf2c1da3d749c2701ab8a32438f1837","tests/ui-nightly/transmute-ref-dst-not-frombytes.rs":"a989f7f680cd3072ee1a0dd631fab02caa30c64c53ced9b5719d79dbcfbcf97f","tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr":"569b2104c13b482bab2733aab462e05d0b7c59b5daae2fefdb8a4a1aa32a6a11","tests/ui-nightly/transmute-ref-dst-not-nocell.rs":"51ecd363ef66bbcf0d8daa3376667b8a9ad35b61d78765d502644c1183cbdf1c","tests/ui-nightly/transmute-ref-dst-not-nocell.stderr":"962c54606c4b7f7e3c96b88efeb713c31881d43e8bf92be4fcd6e6c17df1ea05","tests/ui-nightly/transmute-ref-dst-unsized.rs":"e3beead5f1b51a62ad8974c024fb0db3ed0611c05e5ab05a65ee284e150b3ff8","tests/ui-nightly/transmute-ref-dst-unsized.stderr":"1de78a9ba5821e82f4a18a8a846cfcd24ea66c78d0b4c54e25da3ad40c1f99a0","tests/ui-nightly/transmute-ref-illegal-lifetime.rs":"771b734779b00309b7ab112891e5fa76af2d7b5a822b4db2f34b3edebf1f7b9d","tests/ui-nightly/transmute-ref-illegal-lifetime.stderr":"fe0f7131d3d794f5ffaee93c324e29c73f2f6bf82cfa1f9105bd999af81bf497","tests/ui-nightly/transmute-ref-size-decrease.rs":"318b336f688eaeb7ddcb574cf750b7e1cc728b1db3ae97b5d025a325bcc95747","tests/ui-nightly/transmute-ref-size-decrease.stderr":"ed1304243850ab7a06427cff1d1216f306be94d389bad35f9d048129640d3586","tests/ui-nightly/transmute-ref-size-increase.rs":"7f3a5897b73dd9272eac08c4a43e3946fdf527761c3fb376a266e945ddb96448","tests/ui-nightly/transmute-ref-size-increase.stderr":"744c7b543f417246d7fde6dd5680c4f293e577a6ce7b005742ece6ecba98d552","tests/ui-nightly/transmute-ref-src-dst-generic.rs":"2d25888552996fd964461247b07cf1a5974e6fc0dffed2464b795bdf56e7e518","tests/ui-nightly/transmute-ref-src-dst-generic.stderr":"4b8d7f7106f4c0a1e527d3bbf6879104d87aa9d17e53c7304b6c27b3480fbd7d","tests/ui-nightly/transmute-ref-src-dst-not-references.rs":"b44e925cca270c67fc7f9c4dc18207acd90f77231f8cf79ec965b592586a890f","tests/ui-nightly/transmute-ref-src-dst-not-references.stderr":"4ee1f130bdc0e185d1cd0a180976bd099db162a11ad51e6eb8730353c253ea44","tests/ui-nightly/transmute-ref-src-dst-unsized.rs":"902e8182ea6b3de7b6e548ae03abc54b5bb8b8a01057e25d1c5e12838876349d","tests/ui-nightly/transmute-ref-src-dst-unsized.stderr":"f9db33200fe5eb498ae50246b685334126a52c856f1ca17929bc15a766468469","tests/ui-nightly/transmute-ref-src-generic.rs":"57c4bbd0ec820778dcfdd40645741e2251f981ca4e98de9ac344c7dbb5381e16","tests/ui-nightly/transmute-ref-src-generic.stderr":"6df8948f70d9677198b6065cd8f62d5cd652f00bda556a9d88ed0d22fd24f772","tests/ui-nightly/transmute-ref-src-not-a-reference.rs":"69dc6327b77a6cfe806b3493a4287bdfa88d8b353256673ff1e4bc2e28c8eb28","tests/ui-nightly/transmute-ref-src-not-a-reference.stderr":"0018c74a5285cafdfd06d4453abec66692bd39f5926b4e8e25f9592c8c3adc12","tests/ui-nightly/transmute-ref-src-not-intobytes.rs":"dd932cdde770d1ad0c0e5c147cb53aebdbfe6a023a6873e807f2429a14bc654d","tests/ui-nightly/transmute-ref-src-not-intobytes.stderr":"b551efcfe51676842fbcdfa9cbc7044470cbe1289adcd731f486ebaadf4d47aa","tests/ui-nightly/transmute-ref-src-not-nocell.rs":"cdd5eeb40f42963e7bec7b45283a53f4322df4a7068398089d0ddc18402ec0a9","tests/ui-nightly/transmute-ref-src-not-nocell.stderr":"1bbe3c1eef6b73c67a08299825451071dafbc8e73de3807624a635c4233b2dd3","tests/ui-nightly/transmute-ref-src-unsized.rs":"cbb75ec9eb3729442f57afc55758f4b638687ed0677e58a5e784b5f53e6a82ee","tests/ui-nightly/transmute-ref-src-unsized.stderr":"0095536d93fd5e48b95ce51beeb90e7d5ba595e9d1d39a0baff4352ea4e29f58","tests/ui-nightly/transmute-size-decrease.rs":"ef04ab5d6ed074c0d0ab0f979fba4b5a580e1ebeab431b7a432a4348194a67b9","tests/ui-nightly/transmute-size-decrease.stderr":"daa5aa155c5018eb91ec289c1675fc253140607c36922393668f4ab0d0b4401e","tests/ui-nightly/transmute-size-increase.rs":"d57c9f23ba23313236a84809b6a1e1d0fdfc67c1d64db8143f5762671eb68ca9","tests/ui-nightly/transmute-size-increase.stderr":"3c2cf176db54b8e9f0a8c2a6d0764454a9504e6ff95fdc9acc12f71a7b57a280","tests/ui-nightly/transmute-src-not-intobytes.rs":"e39129733ec5406376c1cd79a0eb2b66d89ee89e0cd629cf8ba5c8c6fe0c0cd1","tests/ui-nightly/transmute-src-not-intobytes.stderr":"bd9283266ac9c30cfea3d1a6f91e52a5972ed3bf83d8421a7c64f2911b805a92","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.rs":"9b4b6b062a4f1a0f29df9754c87b0ec0dfc75cc026ecbf57f67e48acf8ed3b0e","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.stderr":"93f81521554ae4ca5f38a5448834c3cb9fd33e7038e44cee5fa8dc78fa095288","tests/ui-nightly/try_transmute-size-decrease.rs":"7ec7d4c829f2a2df74149b880686371c2a64e293dcb6f5ec10a0c09c4f8229c0","tests/ui-nightly/try_transmute-size-decrease.stderr":"1ad2968f1243db577e85892b652bbc151f3602828c3a4e68b860cbf178d1e694","tests/ui-nightly/try_transmute-size-increase.rs":"5b085b4eb85a46d70ce03799652ba49bc4d51e861e821eddebd94919bcb0ad30","tests/ui-nightly/try_transmute-size-increase.stderr":"3e21640a804b7ab375eff3c3b8f9d802b2a4da4551b29dd83489faedb021b54a","tests/ui-nightly/try_transmute-src-not-intobytes.rs":"83ab8176279f90930b9548592114343d724b5af57999ed04cb5b5c32f56f5aad","tests/ui-nightly/try_transmute-src-not-intobytes.stderr":"cae4cec519a3b8067f5fc75288cbc850283123c577b37ed726de0a1b8b6e2655","tests/ui-nightly/try_transmute_mut-alignment-increase.rs":"6f16a7e4753153e84581902d3d42fc4f0cb2d7ef4b01b71bcaccb0d434dc0f9c","tests/ui-nightly/try_transmute_mut-alignment-increase.stderr":"74a715b6f48e41a43d74e2a6645cf42957a2201d15d91e00f7778fe390af7504","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.rs":"aeb4371e28787b0a2e75e616441a55129cd299d9681a81095c72e6e7f7b9512a","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.stderr":"321e83acf340e4ec84f3558b962c8ceed1cbc90d9587e755989023b613c30d8a","tests/ui-nightly/try_transmute_mut-size-decrease.rs":"35886c88a716734e77c05775d5a0766e9b637b9ed4cc76a9cfbba2aa262e1d13","tests/ui-nightly/try_transmute_mut-size-decrease.stderr":"02ba457b8a97a46a75af4fd26a621c6387fd020c42e4123dff4e072bf068ccdb","tests/ui-nightly/try_transmute_mut-size-increase.rs":"56fbb3134ebc173dc2d959515400b3a9cb9341835337ef3f554f350e316abdb2","tests/ui-nightly/try_transmute_mut-size-increase.stderr":"855253b0ca5e6e0a46b88077f1c4d43938b07c42d71f3c09d94cae3d83730a04","tests/ui-nightly/try_transmute_mut-src-not-intobytes.rs":"6d426e7cd765e9b633e6bb0585db7cad22c90ddb7ba403d7894d8bf6848395ed","tests/ui-nightly/try_transmute_mut-src-not-intobytes.stderr":"1ee8ee3b5baf3992d671dd4f07d3eab31ac1b48e7b012f8b5ad83070651c01d1","tests/ui-nightly/try_transmute_ref-alignment-increase.rs":"4401c8ae85558b388627f60a60960b33bf4df8eae28437ffa4d20bb668f47036","tests/ui-nightly/try_transmute_ref-alignment-increase.stderr":"7e5091f376fa99eeb8240dfdee4a18f73101e54ffd85c058900ce46906b36ac4","tests/ui-nightly/try_transmute_ref-dst-mutable.rs":"cc0497f618bc155ea07bb7538dc570c7e3bba708ad8e52189ea6e10fd63e40bf","tests/ui-nightly/try_transmute_ref-dst-mutable.stderr":"3ecd55adfd0ebd1d1f91444cd41776e052e1bf85d0f17dca454fd1b5889f03d5","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"9308e38dd814b2bab53b5912207cc7621635a5c547e621f947ba0d66e2601730","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"b59f2818bb1e3b145a86bf05c5c780153bf5e3cb30e25b2f39563bafd85f7af1","tests/ui-nightly/try_transmute_ref-size-decrease.rs":"084d0983a7855e3d1eb8a08b0ca9838b1e0b8a07fc88d867a2a7b4519f1057ab","tests/ui-nightly/try_transmute_ref-size-decrease.stderr":"b9b37df32c91aa8574ffcac50f3bccf12747af3c823a71f6df9f2c1bf912a40b","tests/ui-nightly/try_transmute_ref-size-increase.rs":"4d0fea16788077a938b14852a93c110b7791aa0013bfa12c1cfb4c6689b8eb24","tests/ui-nightly/try_transmute_ref-size-increase.stderr":"72391b2609791208e4ad07cf50aadf25ec86413027563c91890c2b4aba7bce0a","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.rs":"da8b40f0ffb13a891a0a3a76217532da81e7b71d5c6f9c1ebe78cff5c9fcc177","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.stderr":"0fd957d785b6fa2c9084c09aeef120f5b0dbb4ec6c4aa1f810b54a3efbdb1bca","tests/ui-stable/diagnostic-not-implemented-from-bytes.rs":"4bb5386f54737e163bc7240f1c06b43e82e943e42745fe7de14bca9ef0ea50c1","tests/ui-stable/diagnostic-not-implemented-from-bytes.stderr":"00d55d5070a77d60947a488bc88be730d16ec1f0f14f5b01ac8bbd69d1a1d4dc","tests/ui-stable/diagnostic-not-implemented-from-zeros.rs":"504fdc193b662116cad680d8354433aae2afd12650b7ce149c5d6c1b280ff650","tests/ui-stable/diagnostic-not-implemented-from-zeros.stderr":"b1e6fe06699c7be7fc49f987e6b985905e44c26a547907b58d1867751b3c1c9e","tests/ui-stable/diagnostic-not-implemented-immutable.rs":"df176f71d385efe46108dfc2d676c7fedddb48f0a9f53ec5fa903e6b7761cf92","tests/ui-stable/diagnostic-not-implemented-immutable.stderr":"f518f79ce9ad326613859ad0c5abc5ed035e0e0a15ce2f3a643182d4ac20dc5b","tests/ui-stable/diagnostic-not-implemented-into-bytes.rs":"5edc2bf1c76f28376eb17613d79025624efbb3465b471b317edb7d399c110e6e","tests/ui-stable/diagnostic-not-implemented-into-bytes.stderr":"2e93a0ee06f0fa6552cc6addfb0d7432879cd77b6c480680e99ba225e9436db9","tests/ui-stable/diagnostic-not-implemented-issue-1296.rs":"2f603de3cd80439cf2d50bb36fcc5b9d40c3bd06475273e6f135d9da335866d9","tests/ui-stable/diagnostic-not-implemented-issue-1296.stderr":"fd05a6126ee99c97bf588bc1945dee217ec6b1ebd6c5f9bc2e86d1568db5f21c","tests/ui-stable/diagnostic-not-implemented-known-layout.rs":"fa78a576df6c568a5ad8517efac60f5953a4d58b233e33e135638bcdfff43ae2","tests/ui-stable/diagnostic-not-implemented-known-layout.stderr":"c6c580eb089d6b3e72f84be6af84727cc8db2f8d6e9cc18baa8542f31d89bd8d","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.rs":"272d0a53001ba1145b6389077fa9d4b494d56651088ed1e929b7591ca4d76048","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.stderr":"70d8c7ce6cf862f5859c6559b4dac7104d2cc7d852af6b7cc62ba6d20dc03882","tests/ui-stable/diagnostic-not-implemented-unaligned.rs":"2966d1c424ddade377afc988dbf2bbc323011d222784a0869c6f804eba4d6cbc","tests/ui-stable/diagnostic-not-implemented-unaligned.stderr":"7d0aba840e75ae397534090e22dddebcf6a2895e92acfa4ca3b122dd0894b37f","tests/ui-stable/include_value_not_from_bytes.rs":"a08295e6ec9c4fc6fe0f6a90d7227acb444ce4680e64efb2c53c4ffbd7029dba","tests/ui-stable/include_value_not_from_bytes.stderr":"e89055768f51ec6d74a2f2477795951759ea58f1b46442b14d8ef5e22bfbf3c5","tests/ui-stable/include_value_wrong_size.rs":"4993458b5a5df4dabf7668203d30f01b756dbce7b27e2bd3fc6998987d673fcd","tests/ui-stable/include_value_wrong_size.stderr":"69cb54abc7ee3df7a9ebd4606efc36bb714239b8a24dc2db1d7b93291c65ca4e","tests/ui-stable/invalid-impls/invalid-impls.rs":"d135ef15bca8d0e7b2c3bf1596c57dbf4b5a98923089b4e5c060a830dd76ff3e","tests/ui-stable/invalid-impls/invalid-impls.stderr":"b686b789a657c0cdf0e1b3223234811337b4f3485a654e195afccd4fa6165161","tests/ui-stable/max-align.rs":"cdca9a14834aa08b1dea1a59baddd126a77cb7dffe9b90c9f9feb6b490c31594","tests/ui-stable/max-align.stderr":"19d3f22fa84379f9ac3a66f5133f429dbacd6e484f844546a5cf90f9141df52a","tests/ui-stable/transmute-dst-not-frombytes.rs":"532de6fb9bb6df56a8621a5f1abb4c58d957650461d266a59581deb36ee77316","tests/ui-stable/transmute-dst-not-frombytes.stderr":"2dfb06fcf3f62d9450dd3838abec66207f3affc63b0ec5d69a9dda3a87b5d764","tests/ui-stable/transmute-mut-alignment-increase.rs":"4c898b19c904440672c87b7b9ee5b15d996eb312e65b595abfdfcb03cff53345","tests/ui-stable/transmute-mut-alignment-increase.stderr":"73d0e4eaacca1da4ba0986164ec4ea8a16231bc28501b890e55ccac6a418bfc5","tests/ui-stable/transmute-mut-const.rs":"726368515b62c5a4e8c54c91239f28f77ccee01eb384893ac7797e7f47189455","tests/ui-stable/transmute-mut-const.stderr":"2d4dc99784abe6e6aa94adb1db2863387997893a92504f8a74a7f940e27654a4","tests/ui-stable/transmute-mut-dst-generic.rs":"41e6addb7da9fde8c3f93182b3cc484d3a2b5c1cfc077ecc66c0a6f27e22f647","tests/ui-stable/transmute-mut-dst-generic.stderr":"bd6e980582dbdacc490fbe7fa43c388b6fa6a6da60d911f08b77c316295f665d","tests/ui-stable/transmute-mut-dst-not-a-reference.rs":"6c0fecf8e2bfb51f2d5b46f0b6d6c454b235b26bf63a09e95e01d874125053cd","tests/ui-stable/transmute-mut-dst-not-a-reference.stderr":"ccabfdc69e4b2c5224050a9b5520b2bdc9d6652dc1b78de61d07cad3edb82daa","tests/ui-stable/transmute-mut-dst-not-frombytes.rs":"f51acc153ec92e2ac81b383e8ae662dd8ab253c0a62cd9d846f6d1e2ed76f5a2","tests/ui-stable/transmute-mut-dst-not-frombytes.stderr":"c99505cca64e65a8dc87b390cf85d94cd953de0e1d775821029a7ceb004ebfb9","tests/ui-stable/transmute-mut-dst-not-intobytes.rs":"b9ab140926cae46e0f253eddfa332a0845b25b49ffbe60a17694d06580235066","tests/ui-stable/transmute-mut-dst-not-intobytes.stderr":"81ab8da4af0b9c234bdc35062f8ba5864846c3690970acb31857d8bd44fa4065","tests/ui-stable/transmute-mut-dst-unsized.rs":"5c040c3eec4b360b4b65a948bcfe1220567cf5bb1939eeefd5bf200cd73d3b96","tests/ui-stable/transmute-mut-dst-unsized.stderr":"64084a80c8bcb1864c611a6186ebf6d02006aea18d5fbc8ab3020c77f23ad889","tests/ui-stable/transmute-mut-illegal-lifetime.rs":"cd95f98b5a7f43c9b9f20d53bedbfa0cc3d8b6ba2af182abf6a2098b31dc6c6e","tests/ui-stable/transmute-mut-illegal-lifetime.stderr":"030e0a765ec0b8c8b0a928451ec1c783ca395c65c8e445684a22a432cbd7af9a","tests/ui-stable/transmute-mut-size-decrease.rs":"9ab9c03ccf1546957e3412911564a9dad6f0940d55c5285945548f76186fec56","tests/ui-stable/transmute-mut-size-decrease.stderr":"991baa632937d8acbfc9caa58a9ec659f2dcaa412e2b92ea57a1df9edf977099","tests/ui-stable/transmute-mut-size-increase.rs":"70fa56ad32004364710f2c711859bf601aef0ab61ff5264b8f071d9d06769a63","tests/ui-stable/transmute-mut-size-increase.stderr":"b099797a8b28ac074ba077f06ccb5b1f8d155ea34d2ccb9821b8aaf7f74cbc49","tests/ui-stable/transmute-mut-src-dst-generic.rs":"880430db77b417304756e0244ac8187c4392a9b1887bdb9683246376a7a557a0","tests/ui-stable/transmute-mut-src-dst-generic.stderr":"13cf4024744134f35e2dbd75921023a0d9f89b7ba16005b4b2b15ac35d9b7003","tests/ui-stable/transmute-mut-src-dst-not-references.rs":"cbb01caa49218ce6e4914b03ad1b8bb99a648d7867152577add772de9f0a705e","tests/ui-stable/transmute-mut-src-dst-not-references.stderr":"a584f368fa4929a88f51cb67003cb2b15fdbe109e393606eea70cf1e0b878e32","tests/ui-stable/transmute-mut-src-dst-unsized.rs":"d52aec2bc815fac314a4ca5819d730a0d1dbac13b51bf2b844701d77ce969a8e","tests/ui-stable/transmute-mut-src-dst-unsized.stderr":"ce6a6fc09bf90254871bae8f67e008031ef46c2d3ea81b38c140ab6fd6c8b1df","tests/ui-stable/transmute-mut-src-generic.rs":"a013a66dfe3ca9fbf349c85794ec8a68a980929a56520df305e7a5a4f9922202","tests/ui-stable/transmute-mut-src-generic.stderr":"b8dbf4dc993b9204b9e532f8ceb63cb655ac0ed99e95cfe6ba206cbd68fae94d","tests/ui-stable/transmute-mut-src-immutable.rs":"1cb591944d85bb526f182fdc476a0ba965dade3dfbaac8a29a648045d9ac5a21","tests/ui-stable/transmute-mut-src-immutable.stderr":"c8a0e3107e1805329d83ad742067dbe9a794a7fdbec7da30e8a0622d6398e719","tests/ui-stable/transmute-mut-src-not-a-reference.rs":"a854a05999caebc97a08e37d037c4905a859e3a1f4f6d5e5803ff03af0bb5470","tests/ui-stable/transmute-mut-src-not-a-reference.stderr":"9e1ec4f9523ba33500f6d7cc6ceb754f0ff171c266239790397d143ea2490d16","tests/ui-stable/transmute-mut-src-not-frombytes.rs":"049b386c8bf296d45e8a1a1f020a763df4ea480a3e1027ccc8f6c31b05889c79","tests/ui-stable/transmute-mut-src-not-frombytes.stderr":"9fb887dab214fd94560f2031f626663f73ec6984079bca5fccb3b0e775626a6f","tests/ui-stable/transmute-mut-src-not-intobytes.rs":"12adc96a6bce75e01456c50e5fa08a93290a0b48ed13ef8571b0cad1211cbc8f","tests/ui-stable/transmute-mut-src-not-intobytes.stderr":"2190c114527bb2891ed924173d1cef491189c8b7d6837705eaa69c83d30fcd47","tests/ui-stable/transmute-mut-src-unsized.rs":"128a9f55a7b83c98e3bfafdd6a714e60ff545a322cecdef81f8702da3b1e3eb9","tests/ui-stable/transmute-mut-src-unsized.stderr":"55c8d44cf3104779738bc7b7d8ee177582ecb07435f44c0bd4376b22f00f5c4f","tests/ui-stable/transmute-ptr-to-usize.rs":"d8aabb58133988be7c282ec9771906b8f199418e69762c92ffc167305890d353","tests/ui-stable/transmute-ptr-to-usize.stderr":"5b2df5a1e61b169b7fa627963fc5a9801e33f05553bc15a827b2af19067c8d63","tests/ui-stable/transmute-ref-alignment-increase.rs":"adea0a036330e7d60a2fa663ca873dc24596fd81383545ef945d76adcca1c2ab","tests/ui-stable/transmute-ref-alignment-increase.stderr":"0c60d8a409adead884cf475502bd38e8b364ac4de5d4fb340538b82c143ba3ad","tests/ui-stable/transmute-ref-dst-generic.rs":"fceea5349611147b46a0d897ff4df4353ef2d2550c45a5ee14a74bba9fa272c1","tests/ui-stable/transmute-ref-dst-generic.stderr":"f710dfa3c427743804369b1003ae63ce28ce29dc99265e24a8d77efbfbfad590","tests/ui-stable/transmute-ref-dst-mutable.rs":"4283c537172971fda2c3c529c0971bbac66a4ac844bb6f0356f24284d4084b77","tests/ui-stable/transmute-ref-dst-mutable.stderr":"feb9f6b46c17d408830fda2f2a9a2498e55cac8f2f29c024704e9ab438de3aad","tests/ui-stable/transmute-ref-dst-not-a-reference.rs":"6829c16de2e2dcae944f846235e2f76fca742a24c6970559fc4d10bbf214f96b","tests/ui-stable/transmute-ref-dst-not-a-reference.stderr":"155e4b584557ec874e926e64ebe136ee7702b35b6f54a21338f96c481d34ee02","tests/ui-stable/transmute-ref-dst-not-frombytes.rs":"a989f7f680cd3072ee1a0dd631fab02caa30c64c53ced9b5719d79dbcfbcf97f","tests/ui-stable/transmute-ref-dst-not-frombytes.stderr":"dd1f3d8b3297f488212b9207eabfb08ad16b04e970db298307097b8517575e7c","tests/ui-stable/transmute-ref-dst-not-nocell.rs":"51ecd363ef66bbcf0d8daa3376667b8a9ad35b61d78765d502644c1183cbdf1c","tests/ui-stable/transmute-ref-dst-not-nocell.stderr":"0dd070ab85aa2fe6787ac95dcaac5c31f5984d76394ef50898e42900cbeb3ae3","tests/ui-stable/transmute-ref-dst-unsized.rs":"e3beead5f1b51a62ad8974c024fb0db3ed0611c05e5ab05a65ee284e150b3ff8","tests/ui-stable/transmute-ref-dst-unsized.stderr":"4464ba575fdef73a3e673f45f290bff488fc393703074cee4d47ebbc01c164d7","tests/ui-stable/transmute-ref-illegal-lifetime.rs":"771b734779b00309b7ab112891e5fa76af2d7b5a822b4db2f34b3edebf1f7b9d","tests/ui-stable/transmute-ref-illegal-lifetime.stderr":"541cbc3da9e96328ede88f6cbf6793a9bfeaa3b69a3adfc67aa1d401779b74bb","tests/ui-stable/transmute-ref-size-decrease.rs":"318b336f688eaeb7ddcb574cf750b7e1cc728b1db3ae97b5d025a325bcc95747","tests/ui-stable/transmute-ref-size-decrease.stderr":"433f5558c024581efb54991e8ebee97aedbff06b9b6f2c8581d34039ff671ed4","tests/ui-stable/transmute-ref-size-increase.rs":"7f3a5897b73dd9272eac08c4a43e3946fdf527761c3fb376a266e945ddb96448","tests/ui-stable/transmute-ref-size-increase.stderr":"f23c4fcaa3f1b97338d9c46a51e046bafd8d025a0049984995f75c5f7de0169d","tests/ui-stable/transmute-ref-src-dst-generic.rs":"2d25888552996fd964461247b07cf1a5974e6fc0dffed2464b795bdf56e7e518","tests/ui-stable/transmute-ref-src-dst-generic.stderr":"8053da1dc7d7d4cc9cdf1deeb9218aeb876794df5cf69df4d62cfd1b78613059","tests/ui-stable/transmute-ref-src-dst-not-references.rs":"b44e925cca270c67fc7f9c4dc18207acd90f77231f8cf79ec965b592586a890f","tests/ui-stable/transmute-ref-src-dst-not-references.stderr":"32a5ecd8509eebcc08ea529cade80ebef706b3c1a5c6f8c498c997b426b5d6a6","tests/ui-stable/transmute-ref-src-dst-unsized.rs":"902e8182ea6b3de7b6e548ae03abc54b5bb8b8a01057e25d1c5e12838876349d","tests/ui-stable/transmute-ref-src-dst-unsized.stderr":"00b9db39d0d09378a0c97a13b3afa1aa9e5e49a3b5ffaf2b8423d195d176c334","tests/ui-stable/transmute-ref-src-generic.rs":"57c4bbd0ec820778dcfdd40645741e2251f981ca4e98de9ac344c7dbb5381e16","tests/ui-stable/transmute-ref-src-generic.stderr":"3c5348f553baf2161a48edce631097e21cf7ad79e5c3d5482b175101dc877c5c","tests/ui-stable/transmute-ref-src-not-a-reference.rs":"69dc6327b77a6cfe806b3493a4287bdfa88d8b353256673ff1e4bc2e28c8eb28","tests/ui-stable/transmute-ref-src-not-a-reference.stderr":"f1fac4e3ca8cf71fcc05d3cb4780b7a1084615d6f1bc763a99fa18c06615c9d8","tests/ui-stable/transmute-ref-src-not-intobytes.rs":"dd932cdde770d1ad0c0e5c147cb53aebdbfe6a023a6873e807f2429a14bc654d","tests/ui-stable/transmute-ref-src-not-intobytes.stderr":"18fe85f152de5f32f96380e83d770879304585a3add66022e59efb1a17ae8017","tests/ui-stable/transmute-ref-src-not-nocell.rs":"cdd5eeb40f42963e7bec7b45283a53f4322df4a7068398089d0ddc18402ec0a9","tests/ui-stable/transmute-ref-src-not-nocell.stderr":"9179263979f422b52d1f9c999328464b7e4cee3be49f3f358d4783082544a34a","tests/ui-stable/transmute-ref-src-unsized.rs":"cbb75ec9eb3729442f57afc55758f4b638687ed0677e58a5e784b5f53e6a82ee","tests/ui-stable/transmute-ref-src-unsized.stderr":"09fab516d92566d8f8f4a288a692bc67899ed9dad25df226e6ddf0b5253dd5bb","tests/ui-stable/transmute-size-decrease.rs":"ef04ab5d6ed074c0d0ab0f979fba4b5a580e1ebeab431b7a432a4348194a67b9","tests/ui-stable/transmute-size-decrease.stderr":"d3853ca2545ca6e68315f1282aca6949d98d65a932789ad25feac2b827712bff","tests/ui-stable/transmute-size-increase.rs":"d57c9f23ba23313236a84809b6a1e1d0fdfc67c1d64db8143f5762671eb68ca9","tests/ui-stable/transmute-size-increase.stderr":"b94a3c90f34369921022a8018730a3cd79f8bd32cd6a2e2fb8afb0417a7011d4","tests/ui-stable/transmute-src-not-intobytes.rs":"e39129733ec5406376c1cd79a0eb2b66d89ee89e0cd629cf8ba5c8c6fe0c0cd1","tests/ui-stable/transmute-src-not-intobytes.stderr":"274484264462420d063df81263b57454c140dd36ac9a8f1362dc4f34f834b964","tests/ui-stable/try_transmute-dst-not-tryfrombytes.rs":"9b4b6b062a4f1a0f29df9754c87b0ec0dfc75cc026ecbf57f67e48acf8ed3b0e","tests/ui-stable/try_transmute-dst-not-tryfrombytes.stderr":"ce765b88e96411278c1a724c24bee01620b82b8b0e3473a3be4fe3583167ae88","tests/ui-stable/try_transmute-size-decrease.rs":"7ec7d4c829f2a2df74149b880686371c2a64e293dcb6f5ec10a0c09c4f8229c0","tests/ui-stable/try_transmute-size-decrease.stderr":"41e44f6ad37677ef271540c0095f18273ae97c87302e49fb6aa821b19bbffd33","tests/ui-stable/try_transmute-size-increase.rs":"5b085b4eb85a46d70ce03799652ba49bc4d51e861e821eddebd94919bcb0ad30","tests/ui-stable/try_transmute-size-increase.stderr":"abfe4c810d8997fd3a38d1045d77f508a5ff160621fb02648afd67d9947c0479","tests/ui-stable/try_transmute-src-not-intobytes.rs":"83ab8176279f90930b9548592114343d724b5af57999ed04cb5b5c32f56f5aad","tests/ui-stable/try_transmute-src-not-intobytes.stderr":"c6c8bcd7e21daa541e99d1706d1dcbe5ffa4d6cfc9a7c1dfac1ef9b49932dbb8","tests/ui-stable/try_transmute_mut-alignment-increase.rs":"6f16a7e4753153e84581902d3d42fc4f0cb2d7ef4b01b71bcaccb0d434dc0f9c","tests/ui-stable/try_transmute_mut-alignment-increase.stderr":"4e70576de4934ae1243020cd94c012e6a875d8f6f41f0683495cf780e74ba270","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.rs":"aeb4371e28787b0a2e75e616441a55129cd299d9681a81095c72e6e7f7b9512a","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.stderr":"73bac4be5a9f3e15ee5ffa07b506d39bc06b91cb025e74cf89bd8c9a32d879d5","tests/ui-stable/try_transmute_mut-size-decrease.rs":"35886c88a716734e77c05775d5a0766e9b637b9ed4cc76a9cfbba2aa262e1d13","tests/ui-stable/try_transmute_mut-size-decrease.stderr":"cfe3243c374b7acd446add73a94cda56f83c1a3e22ce6b6fb932e2020037f68b","tests/ui-stable/try_transmute_mut-size-increase.rs":"56fbb3134ebc173dc2d959515400b3a9cb9341835337ef3f554f350e316abdb2","tests/ui-stable/try_transmute_mut-size-increase.stderr":"92f8a071e9d6c5bfc7efd38f85cc23d8dc69f810e42d6e95855162f5d6d89e42","tests/ui-stable/try_transmute_mut-src-not-intobytes.rs":"6d426e7cd765e9b633e6bb0585db7cad22c90ddb7ba403d7894d8bf6848395ed","tests/ui-stable/try_transmute_mut-src-not-intobytes.stderr":"654aff1409a747300684b85bcb36f3c88b06afaab5e01d7f8c5cf71ca42d7356","tests/ui-stable/try_transmute_ref-alignment-increase.rs":"4401c8ae85558b388627f60a60960b33bf4df8eae28437ffa4d20bb668f47036","tests/ui-stable/try_transmute_ref-alignment-increase.stderr":"8fddf60d179378ce74bf4b885627ecdf916c00e13f1eeedee463a428123e6da0","tests/ui-stable/try_transmute_ref-dst-mutable.rs":"cc0497f618bc155ea07bb7538dc570c7e3bba708ad8e52189ea6e10fd63e40bf","tests/ui-stable/try_transmute_ref-dst-mutable.stderr":"d29cc786d1994b6aebac2258aeeaa3bbf03723ab2f21e855d18c63ecc5980f28","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"9308e38dd814b2bab53b5912207cc7621635a5c547e621f947ba0d66e2601730","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"411bdc19ef5c4690a70eadecb2991590370bca6df61891b0cf861f5173e4ebf6","tests/ui-stable/try_transmute_ref-size-decrease.rs":"084d0983a7855e3d1eb8a08b0ca9838b1e0b8a07fc88d867a2a7b4519f1057ab","tests/ui-stable/try_transmute_ref-size-decrease.stderr":"7c5f55445dc2e4dda5230b54103fc0abca4b9bf626c0a846a5a0f5c60b95d441","tests/ui-stable/try_transmute_ref-size-increase.rs":"4d0fea16788077a938b14852a93c110b7791aa0013bfa12c1cfb4c6689b8eb24","tests/ui-stable/try_transmute_ref-size-increase.stderr":"b06ee4233f86ee4de04d85b04fb7c31dce84bb328b727a3c5bb36389b5325584","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.rs":"da8b40f0ffb13a891a0a3a76217532da81e7b71d5c6f9c1ebe78cff5c9fcc177","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.stderr":"c39785a948572187b7202282400095230656c1cccace9da3219184f20e3a6b8c","win-cargo.bat":"cb0d4c835875e854253a11ae8d28ab0e00070096dcc4bfba6d7ab06c6790a759"}}
\ No newline at end of file
diff --git a/crates/zerocopy/.cargo-checksum.json b/crates/zerocopy/.cargo-checksum.json
index 707301d..f3e065a 100644
--- a/crates/zerocopy/.cargo-checksum.json
+++ b/crates/zerocopy/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"876e5a74db78bdc53677ec4d489ce7b2fc87840f2dc094423cef406138082708","CONTRIBUTING.md":"a0980739c88a1b5fe71e487ec49ead40a33e96042d4cb2310240ac1a635c97d3","Cargo.toml":"81068c9a58bf3f1a1d0244754bfc71c354ce2ba5ea8e8df6270add5ebd684986","LICENSE-APACHE":"9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3","LICENSE-BSD":"83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32","LICENSE-MIT":"1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df","POLICIES.md":"43dbf7f7b6e003fe080099e51ea2b70b5d99fa2185ee54717a914202a42e1a82","README.md":"b83d5428b07edfde5ee7fd7f554157993b7fdbbfd9e9c9f14aeb591a3eef976b","build.rs":"184df57473e21eb609c8d105368c0f0b30df453f02234d0d1b4c71736cd35a29","cargo.sh":"f1899964e521b76e650470c508319a6738c4fe296e75908b628d35e965598f4a","ci/check_all_toolchains_tested.sh":"e67462dc8744126d54ecf15cbb3941147e3158953eed476af8e4cddf56dc352b","ci/check_fmt.sh":"553c004dcf45c5637ad3d4db37fadbf1a8c7cb0a3c9df15d890260d7d0e8786f","ci/check_job_dependencies.sh":"79291a5abd881f9151260af741aadc38d1c4df2e22593d60cc424723d201c265","ci/check_readme.sh":"00abb89eb4d94c26773f6a568faada404868c1be023e7048f970392a76ba4a31","ci/check_versions.sh":"04a0ae151dfbb5c26d8af5722ba312dab75733e08a1eefc0680e67b053730065","ci/release_crate_version.sh":"0048efe5c2eb256f79c93689359aba729929a46b389559697763b880354c8f4a","clippy.toml":"df67a6131fff2fe52309e797d2dfad080fc8cbdfcb1baa7f14415b3e397c291c","githooks/pre-push":"d64e096bc67a82e60b6427e96b6737000658a49cf982cc8ba337fd2a996a5294","rustfmt.toml":"33a21d11175200d203fcdb803c61a24fc461661bf8a2de7c9189af7ecee123c2","src/byte_slice.rs":"35ddecf2b022a8bb9ab0b88021b4975b5b076a62fb5c95bad17ca595fe4809c8","src/byteorder.rs":"23a49c378468c5d1e07e60a10a22fe29688094d6b3dc2460872a5348a6c04bc1","src/deprecated.rs":"df993f07cb37628012e45716aa74237a1294b98eef80f1ec69a9b17b9f354342","src/error.rs":"de16563e6e7aa301de52e2d01916ef49d1cd86c3082e321b983327a5a98a608b","src/impls.rs":"14d88e265a400db6b53fe0e5d1fbf4fc3a35444be24627c27910d8d5e0267567","src/layout.rs":"e0f6cc74170b2ecc1034a809d7988e7ee7d84c5d3a01dcccd17ffb1575377c26","src/lib.rs":"90cbf6d6db1c2c5d1d239761c28e95b6d25719754127ab939e65b936e5e26a22","src/macros.rs":"e588e1033cd1f5ca926639617c1b7b66927fd481ed217b1dfb650f31ae93c1ab","src/pointer/aliasing_safety.rs":"bcd03de7e68bd5e2b60387617545904c875e1c7f60c8c509b4ddf000b0c12878","src/pointer/mod.rs":"94389e83d1aefd70693cf5960d0b3e4f8a75be48937cf702a3a5e917bc4ee345","src/pointer/ptr.rs":"d128349ee917c2ef4d797162200a3a46aa0fbbb299beafd5fcdf8ff75ef95d56","src/ref.rs":"418dd6953d4b5e81db2486c961e925f91c52b12313542d3205aa8fa12ed8640c","src/util/macro_util.rs":"6f3159a3eedfd9c5ee97c0e12abf1745bc8604be7a9ebf1a1cefef8a785f33fd","src/util/macros.rs":"1c973dfaf2ace0b2d2f90ca513118f222196309a6b4483490a58c0edd068bdc0","src/util/mod.rs":"fbf787de78bf733fa0ddc6a76a383e6e326e5502d3efd066a363c0699ca18815","src/wrappers.rs":"de45833b47eded5e32e6cb70a703bf590567d411c3a4b8a0b9db6983104968e0","testdata/include_value/data":"88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589","tests/trybuild.rs":"cbee2dd970cc0737f9a91e4b5e90ea9f1ce0c2639767550c1754519c2d73942d","tests/ui-msrv/diagnostic-not-implemented-from-bytes.rs":"d41e080139456e38ee162a57e489749ed46f4ab3d548b873fff5e3cfd1915089","tests/ui-msrv/diagnostic-not-implemented-from-bytes.stderr":"4d6f6a622aaf9652774459000ae22fa9ba185f94038937e29db60a83201ebb11","tests/ui-msrv/diagnostic-not-implemented-from-zeros.rs":"7068df4b45955c6f40bd71dfaa51ed87c850221a142fc5471b6354d5ed7a2c46","tests/ui-msrv/diagnostic-not-implemented-from-zeros.stderr":"6e811a51f5ca455fa40d7d3d9c82d9f77920d7e951edf04df123b54442416de2","tests/ui-msrv/diagnostic-not-implemented-immutable.rs":"701f02b3e7dbb91ea6257cc08b5aeaed81a32be83f2424ca3887655926b568de","tests/ui-msrv/diagnostic-not-implemented-immutable.stderr":"6ad821a39c1d87e135b7f2271e8764d256cdb8a29a59a3b71d60a308494833c5","tests/ui-msrv/diagnostic-not-implemented-into-bytes.rs":"aaedc974685ddc133c1f6c547f51f480057db9932700210ea513be55ddb3497f","tests/ui-msrv/diagnostic-not-implemented-into-bytes.stderr":"6d4171e67ba7db879f669e4a29c70bc6da2136e6bb863a7db2e4018ddce52b25","tests/ui-msrv/diagnostic-not-implemented-issue-1296.rs":"b030a925ff39cb2ea9b1777273f0bcfd982d972fa43cb5f2b6fdc1e6da467312","tests/ui-msrv/diagnostic-not-implemented-issue-1296.stderr":"b86aefff7280c4e9b4d1dad00be80967be770ffd5b03c7be5ee71fe36ba44287","tests/ui-msrv/diagnostic-not-implemented-known-layout.rs":"1e9d77125b68169b231d62da4fb1a1a76fb71bf7a1c4275a096a0715873b4fd2","tests/ui-msrv/diagnostic-not-implemented-known-layout.stderr":"0c01befe42780668a7b85786a53f63988e933451f6195a67b9c8e21d806152f6","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.rs":"922b8eab7092dba41ec37b3ebcad7b48eb8d391e54dff3f2869bcf1954c85003","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.stderr":"94acea9ac40ea7c7f57537797235f44dc7416211125aa3dc0349711568a6f9a9","tests/ui-msrv/diagnostic-not-implemented-unaligned.rs":"8af59d04924492eff43708cb504a421d9c5b8e42cae1ea0a80118f911af47e7b","tests/ui-msrv/diagnostic-not-implemented-unaligned.stderr":"77fb96627905e1673e809566ff72d34e48fac45a87be653ce1e2e22e4a4a28b9","tests/ui-msrv/include_value_not_from_bytes.rs":"74f4d54dad245eff591cb46344fd1f25fb27b73de941c04d1ee82b0ad2639807","tests/ui-msrv/include_value_not_from_bytes.stderr":"535dca896e872c26e03faba47b9bedc747fe87dfd4ede44cb83dae2c27de796b","tests/ui-msrv/include_value_wrong_size.rs":"5a0561eeb4cb245cf5b68547b43faa2432c56bfe23f7f50677a0b110dab60cdb","tests/ui-msrv/include_value_wrong_size.stderr":"df5f93c98a658e40f195e65ccc3b0460d3e70ddf080412ff24edba1dd8da032d","tests/ui-msrv/invalid-impls/invalid-impls.rs":"ded679eaa7cf397aad0296a43cfb2344513e282b34b3a38dbb5d3d8d5da9a632","tests/ui-msrv/invalid-impls/invalid-impls.stderr":"0b59da38747a72bd81f474d3b1b9395642b6d58042e9bb9695c48731a4153819","tests/ui-msrv/max-align.rs":"ffcb6687c98e5629d01b17cbd0845ec195007cc39aa244b26a77d17688c8f13d","tests/ui-msrv/max-align.stderr":"38775aa2a8bc035eedbc57ab0081c865b804d9a7fc5200ec425210fdea6a69d1","tests/ui-msrv/transmute-dst-not-frombytes.rs":"2d045c51d4ea1a435ca3f4e435412eeb0ac6511597dccab8e0040d4903f2b7df","tests/ui-msrv/transmute-dst-not-frombytes.stderr":"d16d3bd0821a608213d963382731d14fecaa4c460a1a6f7140fa4188ed5f5114","tests/ui-msrv/transmute-mut-alignment-increase.rs":"c998500cd80df3c519fca8bb289b4790197f8b076b767eb62ab908693897ef92","tests/ui-msrv/transmute-mut-alignment-increase.stderr":"04dd2f3c2fe50a620171b57c0605048e18cf953693f99a8795c793533079c5ec","tests/ui-msrv/transmute-mut-const.rs":"5689e8cbc11728f948d0263009a2219e272734e317bd20abd00bd4ddcefba713","tests/ui-msrv/transmute-mut-const.stderr":"df4b2a4c358c29279f16c591c088ca2d7bc10264827c3278df0771c8c6734e3b","tests/ui-msrv/transmute-mut-dst-generic.rs":"8c5442baf9963e3dd2b3e6f782574ef794629b761dc29cff95d017b38d234c7b","tests/ui-msrv/transmute-mut-dst-generic.stderr":"d19ae09a138d21aa64da708da85fd09b9b98a70c76cf397f5cbe7866ccbddbed","tests/ui-msrv/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr":"817a236270689e21caa46e983bb4d552f8ad01a8a7a9ae763e17f12f51c0a733","tests/ui-msrv/transmute-mut-dst-not-frombytes.rs":"2b95c8d73c6a321137b5a59c12f554e7433b10f0e95e3ac657330bce0bab149c","tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr":"0c49b6faae66093f554fccddacc1dee476b21c902311a7187ae2fb4f0a378172","tests/ui-msrv/transmute-mut-dst-not-intobytes.rs":"2e4da8d35584a2bbeaea33398bb5773a2d40aeee2e2ea7272e9382940cb97ec3","tests/ui-msrv/transmute-mut-dst-not-intobytes.stderr":"7d6a7c1f491ef70f5e71f0224aa6f7a18f3477b3941eb89982cdfaaa19ebc3b3","tests/ui-msrv/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-msrv/transmute-mut-dst-unsized.stderr":"a0a1a4e227f052c6af7cdb69be4b6d5dcc9fe83e43f6dbe55665fe024b0c6ab1","tests/ui-msrv/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-msrv/transmute-mut-illegal-lifetime.stderr":"ff5965b190242ce05735d7c072c11565c5bd8609261c83dd06396ae8416dfbaa","tests/ui-msrv/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-msrv/transmute-mut-size-decrease.stderr":"d0ae511a20ef17111bea9b49ee2551b4cf37000a6397a05520f5a799751c3303","tests/ui-msrv/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-msrv/transmute-mut-size-increase.stderr":"c792b3b0cc60c757dec50107a4209555ffc86c0800ff59f6c6893390ea81e9b9","tests/ui-msrv/transmute-mut-src-dst-generic.rs":"97f1e6c643632abdf3ae188acf91f24bc1e1f6b7cedf5794717ae8685611c892","tests/ui-msrv/transmute-mut-src-dst-generic.stderr":"a88ba3044cd5f16eaaa3240dcbaea973ff72029e14f4f6556736f1fdf3256928","tests/ui-msrv/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-msrv/transmute-mut-src-dst-not-references.stderr":"fc2740d55afdb07bdde457ac259f48ef5b3e13503968299e51791576328b207d","tests/ui-msrv/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-msrv/transmute-mut-src-dst-unsized.stderr":"ed847d54cefa277229e697e6281cff26e17b211ad08a2dc0e9fb4de5d1284520","tests/ui-msrv/transmute-mut-src-generic.rs":"7197d889f9d1d91402d4c4c13da96ff8c170042f7ce0a758157b27f985f508fb","tests/ui-msrv/transmute-mut-src-generic.stderr":"0cd7391cdabe94ffd43109ea1f55eac6b7b68011857a62d9d9e31e10f44aefad","tests/ui-msrv/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-msrv/transmute-mut-src-immutable.stderr":"6854b18881116cecf0c716eac01aac312bfe43a295a797c4ad01ac8b7ea7d81c","tests/ui-msrv/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-msrv/transmute-mut-src-not-a-reference.stderr":"538af460b18f588b6075307de50ba1307f98189d2f2aea74346a77ad8b64710c","tests/ui-msrv/transmute-mut-src-not-frombytes.rs":"647cb1a8fa51b4e833fd3f498a471a344318affc0d2ca8080a7f17dc8a27b30a","tests/ui-msrv/transmute-mut-src-not-frombytes.stderr":"88d66b8538b915634b9a42cbc10f0c92c46ea8580e6907ab09509d5f63917419","tests/ui-msrv/transmute-mut-src-not-intobytes.rs":"40ed14c627923d668173d9d5b3ee5cb0462a126ad4f209224205abc4a3f33b45","tests/ui-msrv/transmute-mut-src-not-intobytes.stderr":"89598f5443c1b15c41267a320680cab7449e0dfd28ec80e071cfc61f4a0cb39d","tests/ui-msrv/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-msrv/transmute-mut-src-unsized.stderr":"face6b360be0638bb8c658b5a055f7fb9c8faeabc066cff8b5e97543f4b5c9d8","tests/ui-msrv/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-msrv/transmute-ptr-to-usize.stderr":"f506ccb353a61ea57095fb5a5aaaf0c624a207988c19ba633c1266d930f5ddda","tests/ui-msrv/transmute-ref-alignment-increase.rs":"f1ea9907bd943bf6a709ee40431c8b3122f6926271b33b8e9561bdddf504e82a","tests/ui-msrv/transmute-ref-alignment-increase.stderr":"7cb1443fdc6058f2a65ad4187b65421a1d5a381467903a113d50aa7a7218caaa","tests/ui-msrv/transmute-ref-dst-generic.rs":"f0938b0fb1cbe99e8bbf45a6d1c3eda4272530027ec685039b140bb9559807f2","tests/ui-msrv/transmute-ref-dst-generic.stderr":"8f47f9eabb44e8d5c561359237e79d42a998b615b526666e16db325b9cea8a09","tests/ui-msrv/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-msrv/transmute-ref-dst-mutable.stderr":"a662775e45dd0e6dc32669fae7e9db09d05a7965404deaa409ec13ede808df5c","tests/ui-msrv/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr":"9c623227178dffccc393175d99d096f34b1ae1075edb32b0e36cc74161658176","tests/ui-msrv/transmute-ref-dst-not-frombytes.rs":"88f5a210bea3e3a775f92b6aaf4586e62cb9c6f61bcdc1cd7e63ad9ad214b863","tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr":"c17eee33de0e94d29cbb04f7e7ddd3e6b11793fe24d59bae498a3763b7eab983","tests/ui-msrv/transmute-ref-dst-not-nocell.rs":"71ed55ef424c8173bb438c6a1985a1a53e09d7964950d64a50ddb914c3425760","tests/ui-msrv/transmute-ref-dst-not-nocell.stderr":"3983f0ec4ead95d693c5cc189751c18fff5553c4507bafcbd16b35c7c5d8715d","tests/ui-msrv/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-msrv/transmute-ref-dst-unsized.stderr":"74baf5c0013561bae41a1764ef210b91d6221526d644abe7b373039182505501","tests/ui-msrv/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-msrv/transmute-ref-illegal-lifetime.stderr":"4f2a3e71cda94564f2343ca9ff23de3eca0d2ff465cedacab187151183813092","tests/ui-msrv/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-msrv/transmute-ref-size-decrease.stderr":"686597597e9f87e717b702bf6b8b6a52d14c5612ec267d48a01b442ab14648e1","tests/ui-msrv/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-msrv/transmute-ref-size-increase.stderr":"f1ad62609362a24b5cf47761e30e2cf0a35db82682e041faf251b2a1f822da7c","tests/ui-msrv/transmute-ref-src-dst-generic.rs":"01573b77e343fb6df20112ad65c4f9ff83fadb41428307f5dbb51964f6ca14a7","tests/ui-msrv/transmute-ref-src-dst-generic.stderr":"ca3c1493cbab64b5af7c3c4ea88ca16f6bb2478865b0dbe9d4a28d3b11d5fad1","tests/ui-msrv/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-msrv/transmute-ref-src-dst-not-references.stderr":"dcc9a40098bef37fe269315873a1457f6c3e54b8a3a02483cac482c6360bdd19","tests/ui-msrv/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-msrv/transmute-ref-src-dst-unsized.stderr":"18a60fd4366ab0f2351e77326dd0f30af1848ca25bc500ef8e2b2414aa6c4633","tests/ui-msrv/transmute-ref-src-generic.rs":"b0f7e1938a623f48f64bc49ebdad4e15e2dac217e2885d7a209b10f54357786c","tests/ui-msrv/transmute-ref-src-generic.stderr":"2ba4f5f66b2a2eae90f2cb4b28bb92b066fcaf17412ca777e7d9823697d64736","tests/ui-msrv/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-msrv/transmute-ref-src-not-a-reference.stderr":"5a8d829089820ec79d9cd8d9ffac7dbde430914fdad691d46edcd96414d5cad0","tests/ui-msrv/transmute-ref-src-not-intobytes.rs":"81c6fa9775976ab678585a19a174470225e05f0b0cb43ceb754c198a8f0c9732","tests/ui-msrv/transmute-ref-src-not-intobytes.stderr":"42bcfe9f4f3126b6b274bf7838793a449be50b45b484caa7e608143ee492e520","tests/ui-msrv/transmute-ref-src-not-nocell.rs":"0f1cf580d97ed69667b02bfe5de1425ceb0678fc43bf2130e65adc38f3dc5f3f","tests/ui-msrv/transmute-ref-src-not-nocell.stderr":"542ac3b71708fb9373701924b31d16e2db09f6e14ce140491e737dce5400573c","tests/ui-msrv/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-msrv/transmute-ref-src-unsized.stderr":"6047ef727981ccf1ee0c7a9b2a373a46d5a52787db182cfd07af6ec5601c1400","tests/ui-msrv/transmute-size-decrease.rs":"d191596652adbc26329449af4b2183bdae0a387ee668690b1de8535b71495eb7","tests/ui-msrv/transmute-size-decrease.stderr":"d11ad6ec7bc90cce95a2bb415bdbb5273f684c0b5dd49d982f59c4a719b921c4","tests/ui-msrv/transmute-size-increase.rs":"8ca917f831b736bfadb6ccee22acde205098678a3a2cb3cc753dfecacafcb0be","tests/ui-msrv/transmute-size-increase.stderr":"dc42334ddbd0e67151a3122cdfdd63d3b7ae9162027bdb61004579331aeb4dd3","tests/ui-msrv/transmute-src-not-intobytes.rs":"e88bbf21c2512b9c04f938ead3990161f9b050aa469d9164244966ba6e2f02dd","tests/ui-msrv/transmute-src-not-intobytes.stderr":"4afac67df48f5339031d43cac9d4938eee1eb3f2c2f41fd613bdf14ab41f702a","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.rs":"534191c737297f8d60d1227a9cbbb9700bb08db15783d9191df3a64c8424e303","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.stderr":"af8bfea743c5ec2272d4828573f1e984615c63b808dc19b70e27c77cbfc5cc4a","tests/ui-msrv/try_transmute-size-decrease.rs":"a9079c8c3898342e42d0d239fd5c5460caaa60d6141ec162cdd97758edf13118","tests/ui-msrv/try_transmute-size-decrease.stderr":"a50920ccd3d2747f1b742a7f75befcac17b7249c3af7c1171bb100807c0ba571","tests/ui-msrv/try_transmute-size-increase.rs":"77fe321684808543b29dcd89a4dfbcd620543a94cac925babed23a0baa7aee5d","tests/ui-msrv/try_transmute-size-increase.stderr":"778e56b5da2fe2eed74551ce4ab91c0185e07bb6fec8d692c3b80be4f88b6692","tests/ui-msrv/try_transmute-src-not-intobytes.rs":"fe267df8308820b9d6f6f3c2ba9f139d1f06c9355dcda85a72af312cf1485eb8","tests/ui-msrv/try_transmute-src-not-intobytes.stderr":"a387fa192db75cecfb18009928b87860a65a74cb39ab003977fbb03b3e95ca6a","tests/ui-msrv/try_transmute_mut-alignment-increase.rs":"831ab755840c1a81cf7c8a18a711c6bb82392f601f3aa5948a094523ac8fe027","tests/ui-msrv/try_transmute_mut-alignment-increase.stderr":"16110083840317e5afdc6818952139120f62799f5a538e88f015e6879248af53","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.rs":"d5150c8c6dac0d727f91763964a211da00c9842d3130c4c600b4ff6475ef6b83","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.stderr":"f1659eaa09e3e3bc19939383064abfa39d3e2885c0abf2613332b7833bf0b143","tests/ui-msrv/try_transmute_mut-size-decrease.rs":"074cafd652b65c765ef6d37115a7ff8d8512cbee9b2cadd2b45e06c10a9ddf2f","tests/ui-msrv/try_transmute_mut-size-decrease.stderr":"a934b004ef39cc34ca026b29bcf5538c7185b2946ba32b2585a47421aabd4493","tests/ui-msrv/try_transmute_mut-size-increase.rs":"049acbb919cfc11e88168fe4e5a8c12d8a2182f4b30bf1db3e6aa3d0654ddb1e","tests/ui-msrv/try_transmute_mut-size-increase.stderr":"ca16bd542e83f89369fb028d02b02e80bfe63b817367e3880c21136c506ce495","tests/ui-msrv/try_transmute_mut-src-not-intobytes.rs":"0fe8411042107a477d9fe6c328d85b8d6018eff1309f58957cb2687768dbac2b","tests/ui-msrv/try_transmute_mut-src-not-intobytes.stderr":"856f1765b1ca7befcc5ee7bbf7d3922f2d1d2420b7ceffc6b901256a2b107941","tests/ui-msrv/try_transmute_ref-alignment-increase.rs":"798a0af4304ed21fa5bb6fcac4c3e9bb93a282128839aaf6022d6d55364fc876","tests/ui-msrv/try_transmute_ref-alignment-increase.stderr":"40171e18a1404c6c0c3a10144695ce7d3b86dbea4f23d73511b811ff1dd1c824","tests/ui-msrv/try_transmute_ref-dst-mutable.rs":"1ed1c2bf9f6588cc8b2eb57afac161052ac8124e7065606b2aaab51db2aa3457","tests/ui-msrv/try_transmute_ref-dst-mutable.stderr":"8e32cfc1c968313e3d20f8d97f2f464c57635ba749f4882a7d11b41fa13f3fbe","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"8a52c04394cc7f3d89b6b93e3906aef833931f730ba5beaed83cb4072334aa01","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"c6141f063a6b51023d99c1b19f30a601a122f12d4ff70fe80bbe259cd95d930c","tests/ui-msrv/try_transmute_ref-size-decrease.rs":"0e78e0112cc7f6f9b86d76382c25ac59bdaf691daf7735b2b6a086f96b33daff","tests/ui-msrv/try_transmute_ref-size-decrease.stderr":"ecd4bd4d334078da4f8a877429c15c13e9ca8a737a24377884a3562e678ddced","tests/ui-msrv/try_transmute_ref-size-increase.rs":"707d0539764ce04f37e270ee98d0a1037bb2dff1fb408edd7aa470380b0922a1","tests/ui-msrv/try_transmute_ref-size-increase.stderr":"185363ff83042152ad95113d05ef7edc376cfb7c8a2dbcccd748e8506abe94d8","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.rs":"cb455e796e85ac9af743f9b3a1ece8c5e8ee9e4a18128e84685d3c124c595ebe","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.stderr":"8494ad555cb66d69851a2c173fd4c64e53625ddd1228bd883b97bcd9cf553301","tests/ui-nightly/diagnostic-not-implemented-from-bytes.rs":"d41e080139456e38ee162a57e489749ed46f4ab3d548b873fff5e3cfd1915089","tests/ui-nightly/diagnostic-not-implemented-from-bytes.stderr":"763f6b8641c1f0397290e562943274f8c79f19bf33193b5c280b4d0bd300a63f","tests/ui-nightly/diagnostic-not-implemented-from-zeros.rs":"7068df4b45955c6f40bd71dfaa51ed87c850221a142fc5471b6354d5ed7a2c46","tests/ui-nightly/diagnostic-not-implemented-from-zeros.stderr":"37c86e0bf9e245e9b4555ab917e8c9354603de70fd03b09572f5ee6b6bebcf85","tests/ui-nightly/diagnostic-not-implemented-immutable.rs":"701f02b3e7dbb91ea6257cc08b5aeaed81a32be83f2424ca3887655926b568de","tests/ui-nightly/diagnostic-not-implemented-immutable.stderr":"ad9d95796a3274fd94784f968cae88274eacba857706586500dd7b70853027f0","tests/ui-nightly/diagnostic-not-implemented-into-bytes.rs":"aaedc974685ddc133c1f6c547f51f480057db9932700210ea513be55ddb3497f","tests/ui-nightly/diagnostic-not-implemented-into-bytes.stderr":"a2e8b5eff3d6300d460d7075a123603c939f0172684610c068414ae93c26a1f3","tests/ui-nightly/diagnostic-not-implemented-issue-1296.rs":"b030a925ff39cb2ea9b1777273f0bcfd982d972fa43cb5f2b6fdc1e6da467312","tests/ui-nightly/diagnostic-not-implemented-issue-1296.stderr":"cca057f576c6abb7edc1230fbbc4facff5dc5e5e03215a53eac95dd26ebff8f9","tests/ui-nightly/diagnostic-not-implemented-known-layout.rs":"1e9d77125b68169b231d62da4fb1a1a76fb71bf7a1c4275a096a0715873b4fd2","tests/ui-nightly/diagnostic-not-implemented-known-layout.stderr":"5c39149b9527bf75417fc00ebfeb7be1b3b415819148e0856399a6b66b905fa1","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.rs":"922b8eab7092dba41ec37b3ebcad7b48eb8d391e54dff3f2869bcf1954c85003","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.stderr":"77b56d726ef90660b8c5ed8cd7d7d91f04e85c621c225e5e6470453d6d612402","tests/ui-nightly/diagnostic-not-implemented-unaligned.rs":"8af59d04924492eff43708cb504a421d9c5b8e42cae1ea0a80118f911af47e7b","tests/ui-nightly/diagnostic-not-implemented-unaligned.stderr":"581eed41bc5fccae1c365ad4ba2ad25deb4f77cd1900f86afb9ee21bbd66a559","tests/ui-nightly/include_value_not_from_bytes.rs":"74f4d54dad245eff591cb46344fd1f25fb27b73de941c04d1ee82b0ad2639807","tests/ui-nightly/include_value_not_from_bytes.stderr":"0fc6146ebf1e6a37c654a2ce5def5032200e9bdce571109432f89f12ed53cd11","tests/ui-nightly/include_value_wrong_size.rs":"5a0561eeb4cb245cf5b68547b43faa2432c56bfe23f7f50677a0b110dab60cdb","tests/ui-nightly/include_value_wrong_size.stderr":"1bc51f8e12c76f3f03c40cb9c5e0bee793e556020450bd32459c832969aa2f49","tests/ui-nightly/invalid-impls/invalid-impls.rs":"ded679eaa7cf397aad0296a43cfb2344513e282b34b3a38dbb5d3d8d5da9a632","tests/ui-nightly/invalid-impls/invalid-impls.stderr":"d543caf7bec986a33f2cf5c7e8f5ab47b1e130d11d9b2abf26e0caca443ab317","tests/ui-nightly/max-align.rs":"ffcb6687c98e5629d01b17cbd0845ec195007cc39aa244b26a77d17688c8f13d","tests/ui-nightly/max-align.stderr":"e6a1e261b02aa0fded5a3f3e3cdda6afe067f0d1430d684e3d7bd24af2e8635a","tests/ui-nightly/transmute-dst-not-frombytes.rs":"2d045c51d4ea1a435ca3f4e435412eeb0ac6511597dccab8e0040d4903f2b7df","tests/ui-nightly/transmute-dst-not-frombytes.stderr":"64e8fcc7670fd8b557aa35ecca3c45320b8ffc0a278fc31322def46256b1ab0f","tests/ui-nightly/transmute-mut-alignment-increase.rs":"c998500cd80df3c519fca8bb289b4790197f8b076b767eb62ab908693897ef92","tests/ui-nightly/transmute-mut-alignment-increase.stderr":"bf4263defaa6e76e955050c27a4880d36deba12db6fcd7944a228ab9209cc04d","tests/ui-nightly/transmute-mut-const.rs":"5689e8cbc11728f948d0263009a2219e272734e317bd20abd00bd4ddcefba713","tests/ui-nightly/transmute-mut-const.stderr":"5ba6fe2a93644de5be0430ed76c74ab6daf7d07fd9f7cd9f3b0b7816b6a9aacf","tests/ui-nightly/transmute-mut-dst-generic.rs":"8c5442baf9963e3dd2b3e6f782574ef794629b761dc29cff95d017b38d234c7b","tests/ui-nightly/transmute-mut-dst-generic.stderr":"d012039fa54f3d7cc8ee7275637964e7d83f8067545260676326b571bca46617","tests/ui-nightly/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr":"32ce6f1eb8223b91f705a524f9bf4e43a5540b8d4ea71f2b800c9db0bd078404","tests/ui-nightly/transmute-mut-dst-not-frombytes.rs":"2b95c8d73c6a321137b5a59c12f554e7433b10f0e95e3ac657330bce0bab149c","tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr":"5e7724e171ba1eadc794637c316bf564c9ff4e89aae71ef2e1f7d542ee1dda1b","tests/ui-nightly/transmute-mut-dst-not-intobytes.rs":"2e4da8d35584a2bbeaea33398bb5773a2d40aeee2e2ea7272e9382940cb97ec3","tests/ui-nightly/transmute-mut-dst-not-intobytes.stderr":"e74cb2928d75bd21b0f9ea1c0ac0348816c03e5ba93505667a73990602b2d445","tests/ui-nightly/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-nightly/transmute-mut-dst-unsized.stderr":"d317769c4ec5f2616a8c867c06b8f62b362bbda0f3990c59dd692799c4204f1b","tests/ui-nightly/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-nightly/transmute-mut-illegal-lifetime.stderr":"b0379252732ca51314077fa20d3fb4bfcbee61f486229547c807ed0d7dede9c8","tests/ui-nightly/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-nightly/transmute-mut-size-decrease.stderr":"9294c2562503924704673967f93afbfd4b1d84abbf76318636105acdc3f37a63","tests/ui-nightly/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-nightly/transmute-mut-size-increase.stderr":"6858e39d6238843faa0ec4bf199f88d5013f1b50a811f5e882837f01eea00f93","tests/ui-nightly/transmute-mut-src-dst-generic.rs":"97f1e6c643632abdf3ae188acf91f24bc1e1f6b7cedf5794717ae8685611c892","tests/ui-nightly/transmute-mut-src-dst-generic.stderr":"47469784e04ada2ecbda4f2542a70cc76912a2130ef62de81d1a3830953a2980","tests/ui-nightly/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-nightly/transmute-mut-src-dst-not-references.stderr":"5c594d9bd2a130594bb5a7943273ec34d2cb749671f4ac2394d1f2338415463d","tests/ui-nightly/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-nightly/transmute-mut-src-dst-unsized.stderr":"0ff5e6cd0abc9fa20c6b11b4e08fcad230425bc0aa3cb37ef8f55299764c60d9","tests/ui-nightly/transmute-mut-src-generic.rs":"7197d889f9d1d91402d4c4c13da96ff8c170042f7ce0a758157b27f985f508fb","tests/ui-nightly/transmute-mut-src-generic.stderr":"33e2e8e61c3fce508e4b285730a4246306998ce1b98fcb649603f7cfa55b7b23","tests/ui-nightly/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-nightly/transmute-mut-src-immutable.stderr":"4128e859073d94a2874cf0b2810a7bf602ec8383a600fc1f59c49c43eebe1675","tests/ui-nightly/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-nightly/transmute-mut-src-not-a-reference.stderr":"580185c9b84316e0b4f10fe807b18a1dcb5efcc99277b6b87d2759026ae88519","tests/ui-nightly/transmute-mut-src-not-frombytes.rs":"647cb1a8fa51b4e833fd3f498a471a344318affc0d2ca8080a7f17dc8a27b30a","tests/ui-nightly/transmute-mut-src-not-frombytes.stderr":"7f5928c9663e84505c89d2d0cedbb6d3f3f55e6d715dde7d9fd849458fc38f92","tests/ui-nightly/transmute-mut-src-not-intobytes.rs":"40ed14c627923d668173d9d5b3ee5cb0462a126ad4f209224205abc4a3f33b45","tests/ui-nightly/transmute-mut-src-not-intobytes.stderr":"74f07472d7c2fbe975c00f3ae0d0ed0a2b90d152df9c02165412b32c28a51933","tests/ui-nightly/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-nightly/transmute-mut-src-unsized.stderr":"46975d50196630b323eba0c91dde0aec06b8bdef0015ddbe54155a374a2ec828","tests/ui-nightly/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-nightly/transmute-ptr-to-usize.stderr":"3ae37a81b7c5ce4bb944914fb05c72ed0cf8559988487ddb303d6e702c40014e","tests/ui-nightly/transmute-ref-alignment-increase.rs":"f1ea9907bd943bf6a709ee40431c8b3122f6926271b33b8e9561bdddf504e82a","tests/ui-nightly/transmute-ref-alignment-increase.stderr":"375a2badceb65cf9f828bc67ff62578b305d0be2c54661933f2cd8b1f3904f82","tests/ui-nightly/transmute-ref-dst-generic.rs":"f0938b0fb1cbe99e8bbf45a6d1c3eda4272530027ec685039b140bb9559807f2","tests/ui-nightly/transmute-ref-dst-generic.stderr":"06b9fcf8e0443f997c0ef5f8e2659afcb65f095b11162ea69488f89788b337a7","tests/ui-nightly/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-nightly/transmute-ref-dst-mutable.stderr":"4db4b94e66018355b266db9128e6ec6b7763eb823eedfd6e8d34f0aee830cd76","tests/ui-nightly/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr":"67fdc7b427e715dc68803d46dd2af7f08c2269964697073c6a2519027ec1a2b3","tests/ui-nightly/transmute-ref-dst-not-frombytes.rs":"88f5a210bea3e3a775f92b6aaf4586e62cb9c6f61bcdc1cd7e63ad9ad214b863","tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr":"d832d4fdc61ef148eeef839a221ca27c99c70ea4961529344a1139279e824af6","tests/ui-nightly/transmute-ref-dst-not-nocell.rs":"71ed55ef424c8173bb438c6a1985a1a53e09d7964950d64a50ddb914c3425760","tests/ui-nightly/transmute-ref-dst-not-nocell.stderr":"9d723fbc05549f006d9e520aeface19418fca877862c48dc00730667742eadea","tests/ui-nightly/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-nightly/transmute-ref-dst-unsized.stderr":"7f9474b356200efb1db10fe3d4f956cd005a9b808e64a057499fa54857ae2ca8","tests/ui-nightly/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-nightly/transmute-ref-illegal-lifetime.stderr":"cb98c1b304334e58fc61be1c4b7782e68ab92d90a44c9627326d94d14a44cc38","tests/ui-nightly/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-nightly/transmute-ref-size-decrease.stderr":"14f6ea48e66c484e94f47c3af0983de06869a884cda19b2201548aadc2378758","tests/ui-nightly/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-nightly/transmute-ref-size-increase.stderr":"d5777c69b0ee36b6dcaf7699abb3ea03e1a8bac17bb5a1d4059ae28ff5f4357f","tests/ui-nightly/transmute-ref-src-dst-generic.rs":"01573b77e343fb6df20112ad65c4f9ff83fadb41428307f5dbb51964f6ca14a7","tests/ui-nightly/transmute-ref-src-dst-generic.stderr":"ebffb5c5318798ff84f1da69c3ba732b9af2ad3688ebd7b4b2770e2b201afccb","tests/ui-nightly/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-nightly/transmute-ref-src-dst-not-references.stderr":"ddea4b98e955704604dea41f4ade4c8b20de87efdad1fca7c105a2ce17548244","tests/ui-nightly/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-nightly/transmute-ref-src-dst-unsized.stderr":"84b86782822ff263e2e4b0207a56eb41fd4ba6fecf614f1d91c823188fef77fa","tests/ui-nightly/transmute-ref-src-generic.rs":"b0f7e1938a623f48f64bc49ebdad4e15e2dac217e2885d7a209b10f54357786c","tests/ui-nightly/transmute-ref-src-generic.stderr":"b53a09eca6226647cf53ee9bd0388e558def3bd1f8009b6ec74cc26e4db13d1c","tests/ui-nightly/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-nightly/transmute-ref-src-not-a-reference.stderr":"a21461a6176859b5cda0272023347174d5034760a6e4b18cdd1e20ab6cb60a46","tests/ui-nightly/transmute-ref-src-not-intobytes.rs":"81c6fa9775976ab678585a19a174470225e05f0b0cb43ceb754c198a8f0c9732","tests/ui-nightly/transmute-ref-src-not-intobytes.stderr":"3777baf4bfccbd161af155cb4899285932db3c386a2288ddd845651b6ef4c172","tests/ui-nightly/transmute-ref-src-not-nocell.rs":"0f1cf580d97ed69667b02bfe5de1425ceb0678fc43bf2130e65adc38f3dc5f3f","tests/ui-nightly/transmute-ref-src-not-nocell.stderr":"6556e59c7dcde4148d54d4b518230fb4fe8bad55045849916f08917569e9487e","tests/ui-nightly/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-nightly/transmute-ref-src-unsized.stderr":"81e97e76f030dd45ca338d76a327ffffc1fefff8228e0fc7d0a829e43e530b02","tests/ui-nightly/transmute-size-decrease.rs":"d191596652adbc26329449af4b2183bdae0a387ee668690b1de8535b71495eb7","tests/ui-nightly/transmute-size-decrease.stderr":"963c3b12c4a101587d3a27b2ae5cdee71b83c8ef89166e20c532ce37455847ec","tests/ui-nightly/transmute-size-increase.rs":"8ca917f831b736bfadb6ccee22acde205098678a3a2cb3cc753dfecacafcb0be","tests/ui-nightly/transmute-size-increase.stderr":"ca1a6ff9b387fe1a32216f9e49d088b06b73f1de58625069c8c6fab0213121e3","tests/ui-nightly/transmute-src-not-intobytes.rs":"e88bbf21c2512b9c04f938ead3990161f9b050aa469d9164244966ba6e2f02dd","tests/ui-nightly/transmute-src-not-intobytes.stderr":"d613c2240d84cba27f0bbc4a1737fd255e05eb78c70f6cdc123613d174c27653","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.rs":"534191c737297f8d60d1227a9cbbb9700bb08db15783d9191df3a64c8424e303","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.stderr":"e8b5e3dccd7caa3fb4419907c02aa9951173ebb856e364cb7ba931c9e49e8696","tests/ui-nightly/try_transmute-size-decrease.rs":"a9079c8c3898342e42d0d239fd5c5460caaa60d6141ec162cdd97758edf13118","tests/ui-nightly/try_transmute-size-decrease.stderr":"db4a95088719395580646395d67759e16f8601777287d6617649dda945200cd5","tests/ui-nightly/try_transmute-size-increase.rs":"77fe321684808543b29dcd89a4dfbcd620543a94cac925babed23a0baa7aee5d","tests/ui-nightly/try_transmute-size-increase.stderr":"21caa98bce058c1e777af805d14512996e6624b3287a73a9865ee51c7e73f9c7","tests/ui-nightly/try_transmute-src-not-intobytes.rs":"fe267df8308820b9d6f6f3c2ba9f139d1f06c9355dcda85a72af312cf1485eb8","tests/ui-nightly/try_transmute-src-not-intobytes.stderr":"2b0c6e2e152cf2d17627bca2adbca5317461664b92d47a71090b6c300ea49dbb","tests/ui-nightly/try_transmute_mut-alignment-increase.rs":"831ab755840c1a81cf7c8a18a711c6bb82392f601f3aa5948a094523ac8fe027","tests/ui-nightly/try_transmute_mut-alignment-increase.stderr":"b5c642762c9d7f1eacdbafd2030af7d5a1b8cc8f73ce5f66bb31ab1c1d70feb9","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.rs":"d5150c8c6dac0d727f91763964a211da00c9842d3130c4c600b4ff6475ef6b83","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.stderr":"87c182e4dd89f8a9341d43ec1ff5309c027cc3cae77619e3e5d18da1646fd62c","tests/ui-nightly/try_transmute_mut-size-decrease.rs":"074cafd652b65c765ef6d37115a7ff8d8512cbee9b2cadd2b45e06c10a9ddf2f","tests/ui-nightly/try_transmute_mut-size-decrease.stderr":"f67ca517a7d6704fcbae5065a6f9ed8ecb94d62b3fc0c995e74a40e1425e92fd","tests/ui-nightly/try_transmute_mut-size-increase.rs":"049acbb919cfc11e88168fe4e5a8c12d8a2182f4b30bf1db3e6aa3d0654ddb1e","tests/ui-nightly/try_transmute_mut-size-increase.stderr":"76780facb70e6d5d70242df75470fa0f24e030901fef2c032878358c6bb5fbd8","tests/ui-nightly/try_transmute_mut-src-not-intobytes.rs":"0fe8411042107a477d9fe6c328d85b8d6018eff1309f58957cb2687768dbac2b","tests/ui-nightly/try_transmute_mut-src-not-intobytes.stderr":"5e0846606253e8f4469d81cdd7651a75a91863ba02fc5a88c286cbdb3cae3436","tests/ui-nightly/try_transmute_ref-alignment-increase.rs":"798a0af4304ed21fa5bb6fcac4c3e9bb93a282128839aaf6022d6d55364fc876","tests/ui-nightly/try_transmute_ref-alignment-increase.stderr":"252fd84eaa4f9b6a7750b713c2fab6d277e5020aa2205dc5f65dc056f92d5321","tests/ui-nightly/try_transmute_ref-dst-mutable.rs":"1ed1c2bf9f6588cc8b2eb57afac161052ac8124e7065606b2aaab51db2aa3457","tests/ui-nightly/try_transmute_ref-dst-mutable.stderr":"a4ae798bd31294b4f74fdd617c9f585c8d8930f525d9aa8c4d37146b3d6ad818","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"8a52c04394cc7f3d89b6b93e3906aef833931f730ba5beaed83cb4072334aa01","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"68cd7fffbd301f28da57117f76df2e9e3949c3766a75a6d0da189cb582cec5ec","tests/ui-nightly/try_transmute_ref-size-decrease.rs":"0e78e0112cc7f6f9b86d76382c25ac59bdaf691daf7735b2b6a086f96b33daff","tests/ui-nightly/try_transmute_ref-size-decrease.stderr":"ec532e464e8b7214e7541f9cf809dc2dcb9ea4653f92b169b14efdcf92b58369","tests/ui-nightly/try_transmute_ref-size-increase.rs":"707d0539764ce04f37e270ee98d0a1037bb2dff1fb408edd7aa470380b0922a1","tests/ui-nightly/try_transmute_ref-size-increase.stderr":"4be6a150553fb3482352f0922d2321e9c032514ffd1eca15c1d671cead5f8757","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.rs":"cb455e796e85ac9af743f9b3a1ece8c5e8ee9e4a18128e84685d3c124c595ebe","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.stderr":"d96e66a489a6ce49b79ea4a7abe889a72cdf232f16b46b9a2789012abb6e09d6","tests/ui-stable/diagnostic-not-implemented-from-bytes.rs":"d41e080139456e38ee162a57e489749ed46f4ab3d548b873fff5e3cfd1915089","tests/ui-stable/diagnostic-not-implemented-from-bytes.stderr":"fe9123522f5b3fa708c45654038260de96c154c960a161dd8c5bb7bb46a41ef2","tests/ui-stable/diagnostic-not-implemented-from-zeros.rs":"7068df4b45955c6f40bd71dfaa51ed87c850221a142fc5471b6354d5ed7a2c46","tests/ui-stable/diagnostic-not-implemented-from-zeros.stderr":"070c8b4c5fe7aee42b37b444b8c98ef92a6d9cdb9faa01ee48cb6f0c8c5133e8","tests/ui-stable/diagnostic-not-implemented-immutable.rs":"701f02b3e7dbb91ea6257cc08b5aeaed81a32be83f2424ca3887655926b568de","tests/ui-stable/diagnostic-not-implemented-immutable.stderr":"40641032b6145223854f70ebfc31726c0a7a191e5f2517bbb79a58d13d251f86","tests/ui-stable/diagnostic-not-implemented-into-bytes.rs":"aaedc974685ddc133c1f6c547f51f480057db9932700210ea513be55ddb3497f","tests/ui-stable/diagnostic-not-implemented-into-bytes.stderr":"cb41574733d5efa7fdfa3835d8c063876a9212e3e80ed2586730e0f69ac202f0","tests/ui-stable/diagnostic-not-implemented-issue-1296.rs":"b030a925ff39cb2ea9b1777273f0bcfd982d972fa43cb5f2b6fdc1e6da467312","tests/ui-stable/diagnostic-not-implemented-issue-1296.stderr":"99447c8a209d2e9fe4e17fb46a3f69c278636c86c738e59ef302541aab29a1f7","tests/ui-stable/diagnostic-not-implemented-known-layout.rs":"1e9d77125b68169b231d62da4fb1a1a76fb71bf7a1c4275a096a0715873b4fd2","tests/ui-stable/diagnostic-not-implemented-known-layout.stderr":"d6a92e77b18efaa29954c999d6705e3a050be4bb758575294329cb34d5e23f55","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.rs":"922b8eab7092dba41ec37b3ebcad7b48eb8d391e54dff3f2869bcf1954c85003","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.stderr":"9a4eecd6aa31e8ac2a8bcef61775befb94a30074b7d94a04e907b1d77130374f","tests/ui-stable/diagnostic-not-implemented-unaligned.rs":"8af59d04924492eff43708cb504a421d9c5b8e42cae1ea0a80118f911af47e7b","tests/ui-stable/diagnostic-not-implemented-unaligned.stderr":"565cf49ebcb5ada4823a326af1e154279117f868762d1e2b62f200060fe0e53d","tests/ui-stable/include_value_not_from_bytes.rs":"74f4d54dad245eff591cb46344fd1f25fb27b73de941c04d1ee82b0ad2639807","tests/ui-stable/include_value_not_from_bytes.stderr":"702c134b33eece562ad3491a2b20a8d946a4b3fcd3405cb1b049b412d2c5cbab","tests/ui-stable/include_value_wrong_size.rs":"5a0561eeb4cb245cf5b68547b43faa2432c56bfe23f7f50677a0b110dab60cdb","tests/ui-stable/include_value_wrong_size.stderr":"d1a76cd36830c8b07bb1204ebc95aeadf0a1a54ff7cc924635c0dbd3efa0b3a4","tests/ui-stable/invalid-impls/invalid-impls.rs":"ded679eaa7cf397aad0296a43cfb2344513e282b34b3a38dbb5d3d8d5da9a632","tests/ui-stable/invalid-impls/invalid-impls.stderr":"2a39f7ee2bb7b23fb73cbaa4142b97e6dfd37b42de5b1a837b19d6b0e97a4507","tests/ui-stable/max-align.rs":"ffcb6687c98e5629d01b17cbd0845ec195007cc39aa244b26a77d17688c8f13d","tests/ui-stable/max-align.stderr":"a8bd50e80cd0ae680a52ea71d06d259a43300dcfbf6b336a12cb371fe84e119b","tests/ui-stable/transmute-dst-not-frombytes.rs":"2d045c51d4ea1a435ca3f4e435412eeb0ac6511597dccab8e0040d4903f2b7df","tests/ui-stable/transmute-dst-not-frombytes.stderr":"61fc075454296268f1bd62fe6933ad658ee21cbe5bb15d56169f924e9ac01c92","tests/ui-stable/transmute-mut-alignment-increase.rs":"c998500cd80df3c519fca8bb289b4790197f8b076b767eb62ab908693897ef92","tests/ui-stable/transmute-mut-alignment-increase.stderr":"622de849ac650d5764c05eaae04ace1060161d691e885bcff724bc7d49cfecf2","tests/ui-stable/transmute-mut-const.rs":"5689e8cbc11728f948d0263009a2219e272734e317bd20abd00bd4ddcefba713","tests/ui-stable/transmute-mut-const.stderr":"3cb32fdc824fee5a0e3c03f60353c98d6dbced9e21fe437b8280a3835cc997c0","tests/ui-stable/transmute-mut-dst-generic.rs":"8c5442baf9963e3dd2b3e6f782574ef794629b761dc29cff95d017b38d234c7b","tests/ui-stable/transmute-mut-dst-generic.stderr":"f2c60a1aae05ad780802b0290989c546abe35adcbcacf83a2264446a40ceb5dd","tests/ui-stable/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-stable/transmute-mut-dst-not-a-reference.stderr":"64de9b311751410bab9d7be9ab96809b8243459429e5b31c01b080dd5f42469a","tests/ui-stable/transmute-mut-dst-not-frombytes.rs":"2b95c8d73c6a321137b5a59c12f554e7433b10f0e95e3ac657330bce0bab149c","tests/ui-stable/transmute-mut-dst-not-frombytes.stderr":"a2558fda1d07bf668d0d7a6e4822cbb9b7316b32950e60bf30ea9a887d29e66a","tests/ui-stable/transmute-mut-dst-not-intobytes.rs":"2e4da8d35584a2bbeaea33398bb5773a2d40aeee2e2ea7272e9382940cb97ec3","tests/ui-stable/transmute-mut-dst-not-intobytes.stderr":"673fadf2f0ae16d09b23e7eb2f37ed554b50ca67849b33106a321dc2aa9da293","tests/ui-stable/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-stable/transmute-mut-dst-unsized.stderr":"32ddb36f99b7e7288f548c0205562dd8daf60e10da44d0851686556910bde8a2","tests/ui-stable/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-stable/transmute-mut-illegal-lifetime.stderr":"3a43e0be32ef3589fe3fa713d387bd3976bd8c75813f9641bbf7c539e10bed41","tests/ui-stable/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-stable/transmute-mut-size-decrease.stderr":"b63870c4361917d4cd19fbaba433a9389b806135c9576ae8997c86f3b763fe3c","tests/ui-stable/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-stable/transmute-mut-size-increase.stderr":"cb086ebcc60c4e17f8897c62c5b36b110b259c6e970825953798daf37144af47","tests/ui-stable/transmute-mut-src-dst-generic.rs":"97f1e6c643632abdf3ae188acf91f24bc1e1f6b7cedf5794717ae8685611c892","tests/ui-stable/transmute-mut-src-dst-generic.stderr":"42b02cf4d31dda2ac99a09d66189dc6c00af5c885f8c0dcf04a91d6192abe073","tests/ui-stable/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-stable/transmute-mut-src-dst-not-references.stderr":"5ffeb1d3d10172fbb87f08233664c3c81179f39b72d5bcc92257849142d9ab8c","tests/ui-stable/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-stable/transmute-mut-src-dst-unsized.stderr":"073bc637cde2d211192037cea97619f195c3fdc9ca0175f89b288ac2d5a116bc","tests/ui-stable/transmute-mut-src-generic.rs":"7197d889f9d1d91402d4c4c13da96ff8c170042f7ce0a758157b27f985f508fb","tests/ui-stable/transmute-mut-src-generic.stderr":"ca9f493d91401062575b2f85c23bdfa256bfd80ceea81669ad5b12b229be802a","tests/ui-stable/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-stable/transmute-mut-src-immutable.stderr":"6c686d12cd90ab5b1c3101bddc99f022d2e07f550c7889b8cb3c73977fc2fb04","tests/ui-stable/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-stable/transmute-mut-src-not-a-reference.stderr":"740530b1d0d60e2ae8e21eb51b9d04dec30df22be560e114969311385594aa9a","tests/ui-stable/transmute-mut-src-not-frombytes.rs":"647cb1a8fa51b4e833fd3f498a471a344318affc0d2ca8080a7f17dc8a27b30a","tests/ui-stable/transmute-mut-src-not-frombytes.stderr":"d2342fd50213cd462b8bc023dd4d7c452e70c2140c00b62fd6fbf7fb8104cdfe","tests/ui-stable/transmute-mut-src-not-intobytes.rs":"40ed14c627923d668173d9d5b3ee5cb0462a126ad4f209224205abc4a3f33b45","tests/ui-stable/transmute-mut-src-not-intobytes.stderr":"9336ca7a34959225010233decd1da051f873c5e67392a18bae5b1a0d4b902993","tests/ui-stable/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-stable/transmute-mut-src-unsized.stderr":"bc4302f01d572fe24640bcd43bb3f84c6811aa056711565a6f75b7a1ffc43ca7","tests/ui-stable/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-stable/transmute-ptr-to-usize.stderr":"0d0cedd5e4eb48338fdd23752eb6ebf57642f3565529f618ebda6071578f2149","tests/ui-stable/transmute-ref-alignment-increase.rs":"f1ea9907bd943bf6a709ee40431c8b3122f6926271b33b8e9561bdddf504e82a","tests/ui-stable/transmute-ref-alignment-increase.stderr":"124cf81a3a302d4a2494f769efda66413bcc0494da22d4956dc341596e55739a","tests/ui-stable/transmute-ref-dst-generic.rs":"f0938b0fb1cbe99e8bbf45a6d1c3eda4272530027ec685039b140bb9559807f2","tests/ui-stable/transmute-ref-dst-generic.stderr":"0fa2e50dd2f259260511ae3534334420e4384d542daa8532c7d3a625652c2ada","tests/ui-stable/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-stable/transmute-ref-dst-mutable.stderr":"486b10eabc7af0158624a4fa0389953c68703525f1ea2679dd576821c8ecb912","tests/ui-stable/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-stable/transmute-ref-dst-not-a-reference.stderr":"5363c9c0af4a48ffd0d546b0ece0b43144d7c690c54cd6cd7dbfd723aedbc227","tests/ui-stable/transmute-ref-dst-not-frombytes.rs":"88f5a210bea3e3a775f92b6aaf4586e62cb9c6f61bcdc1cd7e63ad9ad214b863","tests/ui-stable/transmute-ref-dst-not-frombytes.stderr":"eb8fced405758edb7c29b7c9c73bf07698e839fb71fd07c84aa343c173e54c40","tests/ui-stable/transmute-ref-dst-not-nocell.rs":"71ed55ef424c8173bb438c6a1985a1a53e09d7964950d64a50ddb914c3425760","tests/ui-stable/transmute-ref-dst-not-nocell.stderr":"e939607d2028a038930dcca2f194c3f9072ceebc912eab3f3ead6a53e86ee037","tests/ui-stable/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-stable/transmute-ref-dst-unsized.stderr":"d85c454675711b193fe8bce43bf154a7471073affcd6f19af3cab4701b5e4f63","tests/ui-stable/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-stable/transmute-ref-illegal-lifetime.stderr":"45ab741d710dc5a01a21ab64f99927e7da5593328b2037b9bc82a87bc0969136","tests/ui-stable/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-stable/transmute-ref-size-decrease.stderr":"fec5ab0e3d885bbb8e7ab82d6d58b9b4ee35a1802502fbc494bafa086d4132cf","tests/ui-stable/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-stable/transmute-ref-size-increase.stderr":"720e2150c9ed538cf00d7525124ab0cee6ac53e91582470e09c140db783fc2be","tests/ui-stable/transmute-ref-src-dst-generic.rs":"01573b77e343fb6df20112ad65c4f9ff83fadb41428307f5dbb51964f6ca14a7","tests/ui-stable/transmute-ref-src-dst-generic.stderr":"25f15e5316df34cd4a438548090c287228f86062f7e2ef59ea17fb727b868a19","tests/ui-stable/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-stable/transmute-ref-src-dst-not-references.stderr":"918a203918a5f61d5a135c0497f7dd0ac99bf2e9f089940a2a4061cc8fada01f","tests/ui-stable/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-stable/transmute-ref-src-dst-unsized.stderr":"23c16b09e080e4ce94cb65e3a3acbba0a6f6bac7a4089ee50d0778e7a606a612","tests/ui-stable/transmute-ref-src-generic.rs":"b0f7e1938a623f48f64bc49ebdad4e15e2dac217e2885d7a209b10f54357786c","tests/ui-stable/transmute-ref-src-generic.stderr":"f3f8a7ee67ebec21169e1284c9eeaedcfa7b93c05f4e42c504cbd06508f34f9f","tests/ui-stable/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-stable/transmute-ref-src-not-a-reference.stderr":"625fdd62e689536fad2c4edaade47625be62de70dea8071ba25accaf8a758305","tests/ui-stable/transmute-ref-src-not-intobytes.rs":"81c6fa9775976ab678585a19a174470225e05f0b0cb43ceb754c198a8f0c9732","tests/ui-stable/transmute-ref-src-not-intobytes.stderr":"567de31ddc6aed234cd5bd11204847de4478016dcbd223ae182d4579efde98c3","tests/ui-stable/transmute-ref-src-not-nocell.rs":"0f1cf580d97ed69667b02bfe5de1425ceb0678fc43bf2130e65adc38f3dc5f3f","tests/ui-stable/transmute-ref-src-not-nocell.stderr":"32c77219dccbca2de8527a27dec52ba98667fdaeb500afdd380db4ad595cf28f","tests/ui-stable/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-stable/transmute-ref-src-unsized.stderr":"1251c79f24d7d6842579c8e74c7e4b6dc793ae2e6fadb0713c66904545abeaab","tests/ui-stable/transmute-size-decrease.rs":"d191596652adbc26329449af4b2183bdae0a387ee668690b1de8535b71495eb7","tests/ui-stable/transmute-size-decrease.stderr":"617695b7858c0ef01c2a9f7fefc8f7aeb1d6e438f6e36b13a1901d84118e7e01","tests/ui-stable/transmute-size-increase.rs":"8ca917f831b736bfadb6ccee22acde205098678a3a2cb3cc753dfecacafcb0be","tests/ui-stable/transmute-size-increase.stderr":"2c5593d90e962ae7ed4ba91f5dbfa50f31f8fe58ff9f7eb0af69b7a4757d8fbf","tests/ui-stable/transmute-src-not-intobytes.rs":"e88bbf21c2512b9c04f938ead3990161f9b050aa469d9164244966ba6e2f02dd","tests/ui-stable/transmute-src-not-intobytes.stderr":"98c6dc46393e615d890c5f6deaa3bf0aad60b2beb8f3767856fc7e50027813f2","tests/ui-stable/try_transmute-dst-not-tryfrombytes.rs":"534191c737297f8d60d1227a9cbbb9700bb08db15783d9191df3a64c8424e303","tests/ui-stable/try_transmute-dst-not-tryfrombytes.stderr":"15bdd10761070140c4a729ad24ffa0749d0a554515ef499dba0717db5a862070","tests/ui-stable/try_transmute-size-decrease.rs":"a9079c8c3898342e42d0d239fd5c5460caaa60d6141ec162cdd97758edf13118","tests/ui-stable/try_transmute-size-decrease.stderr":"e87938dfce9c41871577f4f2b80ea7eb9da948c89bce6896532c014b1fe47f51","tests/ui-stable/try_transmute-size-increase.rs":"77fe321684808543b29dcd89a4dfbcd620543a94cac925babed23a0baa7aee5d","tests/ui-stable/try_transmute-size-increase.stderr":"75834f5429dc6d53d3816c4ec9995c1c73a4b51348d5ee5e5e1f41c6d4b90c67","tests/ui-stable/try_transmute-src-not-intobytes.rs":"fe267df8308820b9d6f6f3c2ba9f139d1f06c9355dcda85a72af312cf1485eb8","tests/ui-stable/try_transmute-src-not-intobytes.stderr":"74106b79b00d7e2464ae0da4a2bd6731f9f4047cfac42f50d1edd3b299fa1b85","tests/ui-stable/try_transmute_mut-alignment-increase.rs":"831ab755840c1a81cf7c8a18a711c6bb82392f601f3aa5948a094523ac8fe027","tests/ui-stable/try_transmute_mut-alignment-increase.stderr":"c0f7ab750769c50030222f2f12636743d11c0c9596781e76acd46e7010800e6c","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.rs":"d5150c8c6dac0d727f91763964a211da00c9842d3130c4c600b4ff6475ef6b83","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.stderr":"e6bb99863d12de43a6156246ff020f2397e633bd01b7114b8cdbf047fd8de77b","tests/ui-stable/try_transmute_mut-size-decrease.rs":"074cafd652b65c765ef6d37115a7ff8d8512cbee9b2cadd2b45e06c10a9ddf2f","tests/ui-stable/try_transmute_mut-size-decrease.stderr":"397f8e2ecaa0bc0d16705c3d6e48351687879b6c8752ee587b2c795945e3b664","tests/ui-stable/try_transmute_mut-size-increase.rs":"049acbb919cfc11e88168fe4e5a8c12d8a2182f4b30bf1db3e6aa3d0654ddb1e","tests/ui-stable/try_transmute_mut-size-increase.stderr":"3e2b18edfee19545bc02c3ba829ec9e571522a2056f4c838348734688253b331","tests/ui-stable/try_transmute_mut-src-not-intobytes.rs":"0fe8411042107a477d9fe6c328d85b8d6018eff1309f58957cb2687768dbac2b","tests/ui-stable/try_transmute_mut-src-not-intobytes.stderr":"df9d5465891f116aa5716cda44a102804348afcbcfa8d4aa093ea1f25bde4360","tests/ui-stable/try_transmute_ref-alignment-increase.rs":"798a0af4304ed21fa5bb6fcac4c3e9bb93a282128839aaf6022d6d55364fc876","tests/ui-stable/try_transmute_ref-alignment-increase.stderr":"d4a72d346572162c207a303041480a00b3a9d088619495dc99e0084c3f19fdb2","tests/ui-stable/try_transmute_ref-dst-mutable.rs":"1ed1c2bf9f6588cc8b2eb57afac161052ac8124e7065606b2aaab51db2aa3457","tests/ui-stable/try_transmute_ref-dst-mutable.stderr":"b639bae41e7bb7ece5c5eb1468d72c3144dec40982f209da5499025c96bae0bd","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"8a52c04394cc7f3d89b6b93e3906aef833931f730ba5beaed83cb4072334aa01","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"b6b54d2b8b6011e08d955f63395b423d1ede5fea840e7d062da89a3e665d3d79","tests/ui-stable/try_transmute_ref-size-decrease.rs":"0e78e0112cc7f6f9b86d76382c25ac59bdaf691daf7735b2b6a086f96b33daff","tests/ui-stable/try_transmute_ref-size-decrease.stderr":"2ebd930f89eb0b95a0bf05956a8c01a9085109db8c034457b89b464e745b6e18","tests/ui-stable/try_transmute_ref-size-increase.rs":"707d0539764ce04f37e270ee98d0a1037bb2dff1fb408edd7aa470380b0922a1","tests/ui-stable/try_transmute_ref-size-increase.stderr":"c47a2d133e11a7054c44c85c057bb8de5d9c0a7f9b9f2730f4a7bba2a0ff7977","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.rs":"cb455e796e85ac9af743f9b3a1ece8c5e8ee9e4a18128e84685d3c124c595ebe","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.stderr":"110fd6c127e17ead1ac137bd399c54252158b58670dd2b557e5c08da39b32e9d","win-cargo.bat":"dbde5af501630f6d14a0681d27f30ef2ffaeb1753d14be2f7cb1a7f285458c07"},"package":"67914ab451f3bfd2e69e5e9d2ef3858484e7074d63f204fd166ec391b54de21d"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"876e5a74db78bdc53677ec4d489ce7b2fc87840f2dc094423cef406138082708","CONTRIBUTING.md":"a0980739c88a1b5fe71e487ec49ead40a33e96042d4cb2310240ac1a635c97d3","Cargo.toml":"81d8b87948c87239146c8f25a8455855d4f3e559f5a28f0ddd34912c6cefe01d","LICENSE-APACHE":"9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3","LICENSE-BSD":"83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32","LICENSE-MIT":"1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df","POLICIES.md":"43dbf7f7b6e003fe080099e51ea2b70b5d99fa2185ee54717a914202a42e1a82","README.md":"b83d5428b07edfde5ee7fd7f554157993b7fdbbfd9e9c9f14aeb591a3eef976b","build.rs":"184df57473e21eb609c8d105368c0f0b30df453f02234d0d1b4c71736cd35a29","cargo.sh":"f1899964e521b76e650470c508319a6738c4fe296e75908b628d35e965598f4a","ci/check_all_toolchains_tested.sh":"e67462dc8744126d54ecf15cbb3941147e3158953eed476af8e4cddf56dc352b","ci/check_fmt.sh":"553c004dcf45c5637ad3d4db37fadbf1a8c7cb0a3c9df15d890260d7d0e8786f","ci/check_job_dependencies.sh":"79291a5abd881f9151260af741aadc38d1c4df2e22593d60cc424723d201c265","ci/check_readme.sh":"00abb89eb4d94c26773f6a568faada404868c1be023e7048f970392a76ba4a31","ci/check_versions.sh":"04a0ae151dfbb5c26d8af5722ba312dab75733e08a1eefc0680e67b053730065","ci/release_crate_version.sh":"0048efe5c2eb256f79c93689359aba729929a46b389559697763b880354c8f4a","clippy.toml":"df67a6131fff2fe52309e797d2dfad080fc8cbdfcb1baa7f14415b3e397c291c","githooks/pre-push":"d64e096bc67a82e60b6427e96b6737000658a49cf982cc8ba337fd2a996a5294","rustfmt.toml":"33a21d11175200d203fcdb803c61a24fc461661bf8a2de7c9189af7ecee123c2","src/byte_slice.rs":"35ddecf2b022a8bb9ab0b88021b4975b5b076a62fb5c95bad17ca595fe4809c8","src/byteorder.rs":"23a49c378468c5d1e07e60a10a22fe29688094d6b3dc2460872a5348a6c04bc1","src/deprecated.rs":"df993f07cb37628012e45716aa74237a1294b98eef80f1ec69a9b17b9f354342","src/error.rs":"de16563e6e7aa301de52e2d01916ef49d1cd86c3082e321b983327a5a98a608b","src/impls.rs":"14d88e265a400db6b53fe0e5d1fbf4fc3a35444be24627c27910d8d5e0267567","src/layout.rs":"e0f6cc74170b2ecc1034a809d7988e7ee7d84c5d3a01dcccd17ffb1575377c26","src/lib.rs":"cc010ca9e6702bf7bac9d4fcc336cae4642b7c5b232cf3e6b2dae731be1f927d","src/macros.rs":"e588e1033cd1f5ca926639617c1b7b66927fd481ed217b1dfb650f31ae93c1ab","src/pointer/aliasing_safety.rs":"bcd03de7e68bd5e2b60387617545904c875e1c7f60c8c509b4ddf000b0c12878","src/pointer/mod.rs":"94389e83d1aefd70693cf5960d0b3e4f8a75be48937cf702a3a5e917bc4ee345","src/pointer/ptr.rs":"d128349ee917c2ef4d797162200a3a46aa0fbbb299beafd5fcdf8ff75ef95d56","src/ref.rs":"418dd6953d4b5e81db2486c961e925f91c52b12313542d3205aa8fa12ed8640c","src/util/macro_util.rs":"6f3159a3eedfd9c5ee97c0e12abf1745bc8604be7a9ebf1a1cefef8a785f33fd","src/util/macros.rs":"1c973dfaf2ace0b2d2f90ca513118f222196309a6b4483490a58c0edd068bdc0","src/util/mod.rs":"fbf787de78bf733fa0ddc6a76a383e6e326e5502d3efd066a363c0699ca18815","src/wrappers.rs":"de45833b47eded5e32e6cb70a703bf590567d411c3a4b8a0b9db6983104968e0","testdata/include_value/data":"88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589","tests/trybuild.rs":"cbee2dd970cc0737f9a91e4b5e90ea9f1ce0c2639767550c1754519c2d73942d","tests/ui-msrv/diagnostic-not-implemented-from-bytes.rs":"d41e080139456e38ee162a57e489749ed46f4ab3d548b873fff5e3cfd1915089","tests/ui-msrv/diagnostic-not-implemented-from-bytes.stderr":"4d6f6a622aaf9652774459000ae22fa9ba185f94038937e29db60a83201ebb11","tests/ui-msrv/diagnostic-not-implemented-from-zeros.rs":"7068df4b45955c6f40bd71dfaa51ed87c850221a142fc5471b6354d5ed7a2c46","tests/ui-msrv/diagnostic-not-implemented-from-zeros.stderr":"6e811a51f5ca455fa40d7d3d9c82d9f77920d7e951edf04df123b54442416de2","tests/ui-msrv/diagnostic-not-implemented-immutable.rs":"701f02b3e7dbb91ea6257cc08b5aeaed81a32be83f2424ca3887655926b568de","tests/ui-msrv/diagnostic-not-implemented-immutable.stderr":"6ad821a39c1d87e135b7f2271e8764d256cdb8a29a59a3b71d60a308494833c5","tests/ui-msrv/diagnostic-not-implemented-into-bytes.rs":"aaedc974685ddc133c1f6c547f51f480057db9932700210ea513be55ddb3497f","tests/ui-msrv/diagnostic-not-implemented-into-bytes.stderr":"6d4171e67ba7db879f669e4a29c70bc6da2136e6bb863a7db2e4018ddce52b25","tests/ui-msrv/diagnostic-not-implemented-issue-1296.rs":"b030a925ff39cb2ea9b1777273f0bcfd982d972fa43cb5f2b6fdc1e6da467312","tests/ui-msrv/diagnostic-not-implemented-issue-1296.stderr":"b86aefff7280c4e9b4d1dad00be80967be770ffd5b03c7be5ee71fe36ba44287","tests/ui-msrv/diagnostic-not-implemented-known-layout.rs":"1e9d77125b68169b231d62da4fb1a1a76fb71bf7a1c4275a096a0715873b4fd2","tests/ui-msrv/diagnostic-not-implemented-known-layout.stderr":"0c01befe42780668a7b85786a53f63988e933451f6195a67b9c8e21d806152f6","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.rs":"922b8eab7092dba41ec37b3ebcad7b48eb8d391e54dff3f2869bcf1954c85003","tests/ui-msrv/diagnostic-not-implemented-try-from-bytes.stderr":"94acea9ac40ea7c7f57537797235f44dc7416211125aa3dc0349711568a6f9a9","tests/ui-msrv/diagnostic-not-implemented-unaligned.rs":"8af59d04924492eff43708cb504a421d9c5b8e42cae1ea0a80118f911af47e7b","tests/ui-msrv/diagnostic-not-implemented-unaligned.stderr":"77fb96627905e1673e809566ff72d34e48fac45a87be653ce1e2e22e4a4a28b9","tests/ui-msrv/include_value_not_from_bytes.rs":"74f4d54dad245eff591cb46344fd1f25fb27b73de941c04d1ee82b0ad2639807","tests/ui-msrv/include_value_not_from_bytes.stderr":"535dca896e872c26e03faba47b9bedc747fe87dfd4ede44cb83dae2c27de796b","tests/ui-msrv/include_value_wrong_size.rs":"5a0561eeb4cb245cf5b68547b43faa2432c56bfe23f7f50677a0b110dab60cdb","tests/ui-msrv/include_value_wrong_size.stderr":"df5f93c98a658e40f195e65ccc3b0460d3e70ddf080412ff24edba1dd8da032d","tests/ui-msrv/invalid-impls/invalid-impls.rs":"ded679eaa7cf397aad0296a43cfb2344513e282b34b3a38dbb5d3d8d5da9a632","tests/ui-msrv/invalid-impls/invalid-impls.stderr":"0b59da38747a72bd81f474d3b1b9395642b6d58042e9bb9695c48731a4153819","tests/ui-msrv/max-align.rs":"ffcb6687c98e5629d01b17cbd0845ec195007cc39aa244b26a77d17688c8f13d","tests/ui-msrv/max-align.stderr":"38775aa2a8bc035eedbc57ab0081c865b804d9a7fc5200ec425210fdea6a69d1","tests/ui-msrv/transmute-dst-not-frombytes.rs":"2d045c51d4ea1a435ca3f4e435412eeb0ac6511597dccab8e0040d4903f2b7df","tests/ui-msrv/transmute-dst-not-frombytes.stderr":"d16d3bd0821a608213d963382731d14fecaa4c460a1a6f7140fa4188ed5f5114","tests/ui-msrv/transmute-mut-alignment-increase.rs":"c998500cd80df3c519fca8bb289b4790197f8b076b767eb62ab908693897ef92","tests/ui-msrv/transmute-mut-alignment-increase.stderr":"04dd2f3c2fe50a620171b57c0605048e18cf953693f99a8795c793533079c5ec","tests/ui-msrv/transmute-mut-const.rs":"5689e8cbc11728f948d0263009a2219e272734e317bd20abd00bd4ddcefba713","tests/ui-msrv/transmute-mut-const.stderr":"df4b2a4c358c29279f16c591c088ca2d7bc10264827c3278df0771c8c6734e3b","tests/ui-msrv/transmute-mut-dst-generic.rs":"8c5442baf9963e3dd2b3e6f782574ef794629b761dc29cff95d017b38d234c7b","tests/ui-msrv/transmute-mut-dst-generic.stderr":"d19ae09a138d21aa64da708da85fd09b9b98a70c76cf397f5cbe7866ccbddbed","tests/ui-msrv/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr":"817a236270689e21caa46e983bb4d552f8ad01a8a7a9ae763e17f12f51c0a733","tests/ui-msrv/transmute-mut-dst-not-frombytes.rs":"2b95c8d73c6a321137b5a59c12f554e7433b10f0e95e3ac657330bce0bab149c","tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr":"0c49b6faae66093f554fccddacc1dee476b21c902311a7187ae2fb4f0a378172","tests/ui-msrv/transmute-mut-dst-not-intobytes.rs":"2e4da8d35584a2bbeaea33398bb5773a2d40aeee2e2ea7272e9382940cb97ec3","tests/ui-msrv/transmute-mut-dst-not-intobytes.stderr":"7d6a7c1f491ef70f5e71f0224aa6f7a18f3477b3941eb89982cdfaaa19ebc3b3","tests/ui-msrv/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-msrv/transmute-mut-dst-unsized.stderr":"a0a1a4e227f052c6af7cdb69be4b6d5dcc9fe83e43f6dbe55665fe024b0c6ab1","tests/ui-msrv/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-msrv/transmute-mut-illegal-lifetime.stderr":"ff5965b190242ce05735d7c072c11565c5bd8609261c83dd06396ae8416dfbaa","tests/ui-msrv/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-msrv/transmute-mut-size-decrease.stderr":"d0ae511a20ef17111bea9b49ee2551b4cf37000a6397a05520f5a799751c3303","tests/ui-msrv/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-msrv/transmute-mut-size-increase.stderr":"c792b3b0cc60c757dec50107a4209555ffc86c0800ff59f6c6893390ea81e9b9","tests/ui-msrv/transmute-mut-src-dst-generic.rs":"97f1e6c643632abdf3ae188acf91f24bc1e1f6b7cedf5794717ae8685611c892","tests/ui-msrv/transmute-mut-src-dst-generic.stderr":"a88ba3044cd5f16eaaa3240dcbaea973ff72029e14f4f6556736f1fdf3256928","tests/ui-msrv/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-msrv/transmute-mut-src-dst-not-references.stderr":"fc2740d55afdb07bdde457ac259f48ef5b3e13503968299e51791576328b207d","tests/ui-msrv/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-msrv/transmute-mut-src-dst-unsized.stderr":"ed847d54cefa277229e697e6281cff26e17b211ad08a2dc0e9fb4de5d1284520","tests/ui-msrv/transmute-mut-src-generic.rs":"7197d889f9d1d91402d4c4c13da96ff8c170042f7ce0a758157b27f985f508fb","tests/ui-msrv/transmute-mut-src-generic.stderr":"0cd7391cdabe94ffd43109ea1f55eac6b7b68011857a62d9d9e31e10f44aefad","tests/ui-msrv/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-msrv/transmute-mut-src-immutable.stderr":"6854b18881116cecf0c716eac01aac312bfe43a295a797c4ad01ac8b7ea7d81c","tests/ui-msrv/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-msrv/transmute-mut-src-not-a-reference.stderr":"538af460b18f588b6075307de50ba1307f98189d2f2aea74346a77ad8b64710c","tests/ui-msrv/transmute-mut-src-not-frombytes.rs":"647cb1a8fa51b4e833fd3f498a471a344318affc0d2ca8080a7f17dc8a27b30a","tests/ui-msrv/transmute-mut-src-not-frombytes.stderr":"88d66b8538b915634b9a42cbc10f0c92c46ea8580e6907ab09509d5f63917419","tests/ui-msrv/transmute-mut-src-not-intobytes.rs":"40ed14c627923d668173d9d5b3ee5cb0462a126ad4f209224205abc4a3f33b45","tests/ui-msrv/transmute-mut-src-not-intobytes.stderr":"89598f5443c1b15c41267a320680cab7449e0dfd28ec80e071cfc61f4a0cb39d","tests/ui-msrv/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-msrv/transmute-mut-src-unsized.stderr":"face6b360be0638bb8c658b5a055f7fb9c8faeabc066cff8b5e97543f4b5c9d8","tests/ui-msrv/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-msrv/transmute-ptr-to-usize.stderr":"f506ccb353a61ea57095fb5a5aaaf0c624a207988c19ba633c1266d930f5ddda","tests/ui-msrv/transmute-ref-alignment-increase.rs":"f1ea9907bd943bf6a709ee40431c8b3122f6926271b33b8e9561bdddf504e82a","tests/ui-msrv/transmute-ref-alignment-increase.stderr":"7cb1443fdc6058f2a65ad4187b65421a1d5a381467903a113d50aa7a7218caaa","tests/ui-msrv/transmute-ref-dst-generic.rs":"f0938b0fb1cbe99e8bbf45a6d1c3eda4272530027ec685039b140bb9559807f2","tests/ui-msrv/transmute-ref-dst-generic.stderr":"8f47f9eabb44e8d5c561359237e79d42a998b615b526666e16db325b9cea8a09","tests/ui-msrv/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-msrv/transmute-ref-dst-mutable.stderr":"a662775e45dd0e6dc32669fae7e9db09d05a7965404deaa409ec13ede808df5c","tests/ui-msrv/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr":"9c623227178dffccc393175d99d096f34b1ae1075edb32b0e36cc74161658176","tests/ui-msrv/transmute-ref-dst-not-frombytes.rs":"88f5a210bea3e3a775f92b6aaf4586e62cb9c6f61bcdc1cd7e63ad9ad214b863","tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr":"c17eee33de0e94d29cbb04f7e7ddd3e6b11793fe24d59bae498a3763b7eab983","tests/ui-msrv/transmute-ref-dst-not-nocell.rs":"71ed55ef424c8173bb438c6a1985a1a53e09d7964950d64a50ddb914c3425760","tests/ui-msrv/transmute-ref-dst-not-nocell.stderr":"3983f0ec4ead95d693c5cc189751c18fff5553c4507bafcbd16b35c7c5d8715d","tests/ui-msrv/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-msrv/transmute-ref-dst-unsized.stderr":"74baf5c0013561bae41a1764ef210b91d6221526d644abe7b373039182505501","tests/ui-msrv/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-msrv/transmute-ref-illegal-lifetime.stderr":"4f2a3e71cda94564f2343ca9ff23de3eca0d2ff465cedacab187151183813092","tests/ui-msrv/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-msrv/transmute-ref-size-decrease.stderr":"686597597e9f87e717b702bf6b8b6a52d14c5612ec267d48a01b442ab14648e1","tests/ui-msrv/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-msrv/transmute-ref-size-increase.stderr":"f1ad62609362a24b5cf47761e30e2cf0a35db82682e041faf251b2a1f822da7c","tests/ui-msrv/transmute-ref-src-dst-generic.rs":"01573b77e343fb6df20112ad65c4f9ff83fadb41428307f5dbb51964f6ca14a7","tests/ui-msrv/transmute-ref-src-dst-generic.stderr":"ca3c1493cbab64b5af7c3c4ea88ca16f6bb2478865b0dbe9d4a28d3b11d5fad1","tests/ui-msrv/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-msrv/transmute-ref-src-dst-not-references.stderr":"dcc9a40098bef37fe269315873a1457f6c3e54b8a3a02483cac482c6360bdd19","tests/ui-msrv/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-msrv/transmute-ref-src-dst-unsized.stderr":"18a60fd4366ab0f2351e77326dd0f30af1848ca25bc500ef8e2b2414aa6c4633","tests/ui-msrv/transmute-ref-src-generic.rs":"b0f7e1938a623f48f64bc49ebdad4e15e2dac217e2885d7a209b10f54357786c","tests/ui-msrv/transmute-ref-src-generic.stderr":"2ba4f5f66b2a2eae90f2cb4b28bb92b066fcaf17412ca777e7d9823697d64736","tests/ui-msrv/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-msrv/transmute-ref-src-not-a-reference.stderr":"5a8d829089820ec79d9cd8d9ffac7dbde430914fdad691d46edcd96414d5cad0","tests/ui-msrv/transmute-ref-src-not-intobytes.rs":"81c6fa9775976ab678585a19a174470225e05f0b0cb43ceb754c198a8f0c9732","tests/ui-msrv/transmute-ref-src-not-intobytes.stderr":"42bcfe9f4f3126b6b274bf7838793a449be50b45b484caa7e608143ee492e520","tests/ui-msrv/transmute-ref-src-not-nocell.rs":"0f1cf580d97ed69667b02bfe5de1425ceb0678fc43bf2130e65adc38f3dc5f3f","tests/ui-msrv/transmute-ref-src-not-nocell.stderr":"542ac3b71708fb9373701924b31d16e2db09f6e14ce140491e737dce5400573c","tests/ui-msrv/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-msrv/transmute-ref-src-unsized.stderr":"6047ef727981ccf1ee0c7a9b2a373a46d5a52787db182cfd07af6ec5601c1400","tests/ui-msrv/transmute-size-decrease.rs":"d191596652adbc26329449af4b2183bdae0a387ee668690b1de8535b71495eb7","tests/ui-msrv/transmute-size-decrease.stderr":"d11ad6ec7bc90cce95a2bb415bdbb5273f684c0b5dd49d982f59c4a719b921c4","tests/ui-msrv/transmute-size-increase.rs":"8ca917f831b736bfadb6ccee22acde205098678a3a2cb3cc753dfecacafcb0be","tests/ui-msrv/transmute-size-increase.stderr":"dc42334ddbd0e67151a3122cdfdd63d3b7ae9162027bdb61004579331aeb4dd3","tests/ui-msrv/transmute-src-not-intobytes.rs":"e88bbf21c2512b9c04f938ead3990161f9b050aa469d9164244966ba6e2f02dd","tests/ui-msrv/transmute-src-not-intobytes.stderr":"4afac67df48f5339031d43cac9d4938eee1eb3f2c2f41fd613bdf14ab41f702a","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.rs":"534191c737297f8d60d1227a9cbbb9700bb08db15783d9191df3a64c8424e303","tests/ui-msrv/try_transmute-dst-not-tryfrombytes.stderr":"af8bfea743c5ec2272d4828573f1e984615c63b808dc19b70e27c77cbfc5cc4a","tests/ui-msrv/try_transmute-size-decrease.rs":"a9079c8c3898342e42d0d239fd5c5460caaa60d6141ec162cdd97758edf13118","tests/ui-msrv/try_transmute-size-decrease.stderr":"a50920ccd3d2747f1b742a7f75befcac17b7249c3af7c1171bb100807c0ba571","tests/ui-msrv/try_transmute-size-increase.rs":"77fe321684808543b29dcd89a4dfbcd620543a94cac925babed23a0baa7aee5d","tests/ui-msrv/try_transmute-size-increase.stderr":"778e56b5da2fe2eed74551ce4ab91c0185e07bb6fec8d692c3b80be4f88b6692","tests/ui-msrv/try_transmute-src-not-intobytes.rs":"fe267df8308820b9d6f6f3c2ba9f139d1f06c9355dcda85a72af312cf1485eb8","tests/ui-msrv/try_transmute-src-not-intobytes.stderr":"a387fa192db75cecfb18009928b87860a65a74cb39ab003977fbb03b3e95ca6a","tests/ui-msrv/try_transmute_mut-alignment-increase.rs":"831ab755840c1a81cf7c8a18a711c6bb82392f601f3aa5948a094523ac8fe027","tests/ui-msrv/try_transmute_mut-alignment-increase.stderr":"16110083840317e5afdc6818952139120f62799f5a538e88f015e6879248af53","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.rs":"d5150c8c6dac0d727f91763964a211da00c9842d3130c4c600b4ff6475ef6b83","tests/ui-msrv/try_transmute_mut-dst-not-tryfrombytes.stderr":"f1659eaa09e3e3bc19939383064abfa39d3e2885c0abf2613332b7833bf0b143","tests/ui-msrv/try_transmute_mut-size-decrease.rs":"074cafd652b65c765ef6d37115a7ff8d8512cbee9b2cadd2b45e06c10a9ddf2f","tests/ui-msrv/try_transmute_mut-size-decrease.stderr":"a934b004ef39cc34ca026b29bcf5538c7185b2946ba32b2585a47421aabd4493","tests/ui-msrv/try_transmute_mut-size-increase.rs":"049acbb919cfc11e88168fe4e5a8c12d8a2182f4b30bf1db3e6aa3d0654ddb1e","tests/ui-msrv/try_transmute_mut-size-increase.stderr":"ca16bd542e83f89369fb028d02b02e80bfe63b817367e3880c21136c506ce495","tests/ui-msrv/try_transmute_mut-src-not-intobytes.rs":"0fe8411042107a477d9fe6c328d85b8d6018eff1309f58957cb2687768dbac2b","tests/ui-msrv/try_transmute_mut-src-not-intobytes.stderr":"856f1765b1ca7befcc5ee7bbf7d3922f2d1d2420b7ceffc6b901256a2b107941","tests/ui-msrv/try_transmute_ref-alignment-increase.rs":"798a0af4304ed21fa5bb6fcac4c3e9bb93a282128839aaf6022d6d55364fc876","tests/ui-msrv/try_transmute_ref-alignment-increase.stderr":"40171e18a1404c6c0c3a10144695ce7d3b86dbea4f23d73511b811ff1dd1c824","tests/ui-msrv/try_transmute_ref-dst-mutable.rs":"1ed1c2bf9f6588cc8b2eb57afac161052ac8124e7065606b2aaab51db2aa3457","tests/ui-msrv/try_transmute_ref-dst-mutable.stderr":"8e32cfc1c968313e3d20f8d97f2f464c57635ba749f4882a7d11b41fa13f3fbe","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"8a52c04394cc7f3d89b6b93e3906aef833931f730ba5beaed83cb4072334aa01","tests/ui-msrv/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"c6141f063a6b51023d99c1b19f30a601a122f12d4ff70fe80bbe259cd95d930c","tests/ui-msrv/try_transmute_ref-size-decrease.rs":"0e78e0112cc7f6f9b86d76382c25ac59bdaf691daf7735b2b6a086f96b33daff","tests/ui-msrv/try_transmute_ref-size-decrease.stderr":"ecd4bd4d334078da4f8a877429c15c13e9ca8a737a24377884a3562e678ddced","tests/ui-msrv/try_transmute_ref-size-increase.rs":"707d0539764ce04f37e270ee98d0a1037bb2dff1fb408edd7aa470380b0922a1","tests/ui-msrv/try_transmute_ref-size-increase.stderr":"185363ff83042152ad95113d05ef7edc376cfb7c8a2dbcccd748e8506abe94d8","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.rs":"cb455e796e85ac9af743f9b3a1ece8c5e8ee9e4a18128e84685d3c124c595ebe","tests/ui-msrv/try_transmute_ref-src-not-immutable-intobytes.stderr":"8494ad555cb66d69851a2c173fd4c64e53625ddd1228bd883b97bcd9cf553301","tests/ui-nightly/diagnostic-not-implemented-from-bytes.rs":"d41e080139456e38ee162a57e489749ed46f4ab3d548b873fff5e3cfd1915089","tests/ui-nightly/diagnostic-not-implemented-from-bytes.stderr":"763f6b8641c1f0397290e562943274f8c79f19bf33193b5c280b4d0bd300a63f","tests/ui-nightly/diagnostic-not-implemented-from-zeros.rs":"7068df4b45955c6f40bd71dfaa51ed87c850221a142fc5471b6354d5ed7a2c46","tests/ui-nightly/diagnostic-not-implemented-from-zeros.stderr":"37c86e0bf9e245e9b4555ab917e8c9354603de70fd03b09572f5ee6b6bebcf85","tests/ui-nightly/diagnostic-not-implemented-immutable.rs":"701f02b3e7dbb91ea6257cc08b5aeaed81a32be83f2424ca3887655926b568de","tests/ui-nightly/diagnostic-not-implemented-immutable.stderr":"ad9d95796a3274fd94784f968cae88274eacba857706586500dd7b70853027f0","tests/ui-nightly/diagnostic-not-implemented-into-bytes.rs":"aaedc974685ddc133c1f6c547f51f480057db9932700210ea513be55ddb3497f","tests/ui-nightly/diagnostic-not-implemented-into-bytes.stderr":"a2e8b5eff3d6300d460d7075a123603c939f0172684610c068414ae93c26a1f3","tests/ui-nightly/diagnostic-not-implemented-issue-1296.rs":"b030a925ff39cb2ea9b1777273f0bcfd982d972fa43cb5f2b6fdc1e6da467312","tests/ui-nightly/diagnostic-not-implemented-issue-1296.stderr":"cca057f576c6abb7edc1230fbbc4facff5dc5e5e03215a53eac95dd26ebff8f9","tests/ui-nightly/diagnostic-not-implemented-known-layout.rs":"1e9d77125b68169b231d62da4fb1a1a76fb71bf7a1c4275a096a0715873b4fd2","tests/ui-nightly/diagnostic-not-implemented-known-layout.stderr":"5c39149b9527bf75417fc00ebfeb7be1b3b415819148e0856399a6b66b905fa1","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.rs":"922b8eab7092dba41ec37b3ebcad7b48eb8d391e54dff3f2869bcf1954c85003","tests/ui-nightly/diagnostic-not-implemented-try-from-bytes.stderr":"77b56d726ef90660b8c5ed8cd7d7d91f04e85c621c225e5e6470453d6d612402","tests/ui-nightly/diagnostic-not-implemented-unaligned.rs":"8af59d04924492eff43708cb504a421d9c5b8e42cae1ea0a80118f911af47e7b","tests/ui-nightly/diagnostic-not-implemented-unaligned.stderr":"581eed41bc5fccae1c365ad4ba2ad25deb4f77cd1900f86afb9ee21bbd66a559","tests/ui-nightly/include_value_not_from_bytes.rs":"74f4d54dad245eff591cb46344fd1f25fb27b73de941c04d1ee82b0ad2639807","tests/ui-nightly/include_value_not_from_bytes.stderr":"0fc6146ebf1e6a37c654a2ce5def5032200e9bdce571109432f89f12ed53cd11","tests/ui-nightly/include_value_wrong_size.rs":"5a0561eeb4cb245cf5b68547b43faa2432c56bfe23f7f50677a0b110dab60cdb","tests/ui-nightly/include_value_wrong_size.stderr":"1bc51f8e12c76f3f03c40cb9c5e0bee793e556020450bd32459c832969aa2f49","tests/ui-nightly/invalid-impls/invalid-impls.rs":"ded679eaa7cf397aad0296a43cfb2344513e282b34b3a38dbb5d3d8d5da9a632","tests/ui-nightly/invalid-impls/invalid-impls.stderr":"d543caf7bec986a33f2cf5c7e8f5ab47b1e130d11d9b2abf26e0caca443ab317","tests/ui-nightly/max-align.rs":"ffcb6687c98e5629d01b17cbd0845ec195007cc39aa244b26a77d17688c8f13d","tests/ui-nightly/max-align.stderr":"e6a1e261b02aa0fded5a3f3e3cdda6afe067f0d1430d684e3d7bd24af2e8635a","tests/ui-nightly/transmute-dst-not-frombytes.rs":"2d045c51d4ea1a435ca3f4e435412eeb0ac6511597dccab8e0040d4903f2b7df","tests/ui-nightly/transmute-dst-not-frombytes.stderr":"64e8fcc7670fd8b557aa35ecca3c45320b8ffc0a278fc31322def46256b1ab0f","tests/ui-nightly/transmute-mut-alignment-increase.rs":"c998500cd80df3c519fca8bb289b4790197f8b076b767eb62ab908693897ef92","tests/ui-nightly/transmute-mut-alignment-increase.stderr":"bf4263defaa6e76e955050c27a4880d36deba12db6fcd7944a228ab9209cc04d","tests/ui-nightly/transmute-mut-const.rs":"5689e8cbc11728f948d0263009a2219e272734e317bd20abd00bd4ddcefba713","tests/ui-nightly/transmute-mut-const.stderr":"5ba6fe2a93644de5be0430ed76c74ab6daf7d07fd9f7cd9f3b0b7816b6a9aacf","tests/ui-nightly/transmute-mut-dst-generic.rs":"8c5442baf9963e3dd2b3e6f782574ef794629b761dc29cff95d017b38d234c7b","tests/ui-nightly/transmute-mut-dst-generic.stderr":"d012039fa54f3d7cc8ee7275637964e7d83f8067545260676326b571bca46617","tests/ui-nightly/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr":"32ce6f1eb8223b91f705a524f9bf4e43a5540b8d4ea71f2b800c9db0bd078404","tests/ui-nightly/transmute-mut-dst-not-frombytes.rs":"2b95c8d73c6a321137b5a59c12f554e7433b10f0e95e3ac657330bce0bab149c","tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr":"5e7724e171ba1eadc794637c316bf564c9ff4e89aae71ef2e1f7d542ee1dda1b","tests/ui-nightly/transmute-mut-dst-not-intobytes.rs":"2e4da8d35584a2bbeaea33398bb5773a2d40aeee2e2ea7272e9382940cb97ec3","tests/ui-nightly/transmute-mut-dst-not-intobytes.stderr":"e74cb2928d75bd21b0f9ea1c0ac0348816c03e5ba93505667a73990602b2d445","tests/ui-nightly/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-nightly/transmute-mut-dst-unsized.stderr":"d317769c4ec5f2616a8c867c06b8f62b362bbda0f3990c59dd692799c4204f1b","tests/ui-nightly/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-nightly/transmute-mut-illegal-lifetime.stderr":"b0379252732ca51314077fa20d3fb4bfcbee61f486229547c807ed0d7dede9c8","tests/ui-nightly/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-nightly/transmute-mut-size-decrease.stderr":"9294c2562503924704673967f93afbfd4b1d84abbf76318636105acdc3f37a63","tests/ui-nightly/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-nightly/transmute-mut-size-increase.stderr":"6858e39d6238843faa0ec4bf199f88d5013f1b50a811f5e882837f01eea00f93","tests/ui-nightly/transmute-mut-src-dst-generic.rs":"97f1e6c643632abdf3ae188acf91f24bc1e1f6b7cedf5794717ae8685611c892","tests/ui-nightly/transmute-mut-src-dst-generic.stderr":"47469784e04ada2ecbda4f2542a70cc76912a2130ef62de81d1a3830953a2980","tests/ui-nightly/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-nightly/transmute-mut-src-dst-not-references.stderr":"5c594d9bd2a130594bb5a7943273ec34d2cb749671f4ac2394d1f2338415463d","tests/ui-nightly/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-nightly/transmute-mut-src-dst-unsized.stderr":"0ff5e6cd0abc9fa20c6b11b4e08fcad230425bc0aa3cb37ef8f55299764c60d9","tests/ui-nightly/transmute-mut-src-generic.rs":"7197d889f9d1d91402d4c4c13da96ff8c170042f7ce0a758157b27f985f508fb","tests/ui-nightly/transmute-mut-src-generic.stderr":"33e2e8e61c3fce508e4b285730a4246306998ce1b98fcb649603f7cfa55b7b23","tests/ui-nightly/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-nightly/transmute-mut-src-immutable.stderr":"4128e859073d94a2874cf0b2810a7bf602ec8383a600fc1f59c49c43eebe1675","tests/ui-nightly/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-nightly/transmute-mut-src-not-a-reference.stderr":"580185c9b84316e0b4f10fe807b18a1dcb5efcc99277b6b87d2759026ae88519","tests/ui-nightly/transmute-mut-src-not-frombytes.rs":"647cb1a8fa51b4e833fd3f498a471a344318affc0d2ca8080a7f17dc8a27b30a","tests/ui-nightly/transmute-mut-src-not-frombytes.stderr":"7f5928c9663e84505c89d2d0cedbb6d3f3f55e6d715dde7d9fd849458fc38f92","tests/ui-nightly/transmute-mut-src-not-intobytes.rs":"40ed14c627923d668173d9d5b3ee5cb0462a126ad4f209224205abc4a3f33b45","tests/ui-nightly/transmute-mut-src-not-intobytes.stderr":"74f07472d7c2fbe975c00f3ae0d0ed0a2b90d152df9c02165412b32c28a51933","tests/ui-nightly/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-nightly/transmute-mut-src-unsized.stderr":"46975d50196630b323eba0c91dde0aec06b8bdef0015ddbe54155a374a2ec828","tests/ui-nightly/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-nightly/transmute-ptr-to-usize.stderr":"3ae37a81b7c5ce4bb944914fb05c72ed0cf8559988487ddb303d6e702c40014e","tests/ui-nightly/transmute-ref-alignment-increase.rs":"f1ea9907bd943bf6a709ee40431c8b3122f6926271b33b8e9561bdddf504e82a","tests/ui-nightly/transmute-ref-alignment-increase.stderr":"375a2badceb65cf9f828bc67ff62578b305d0be2c54661933f2cd8b1f3904f82","tests/ui-nightly/transmute-ref-dst-generic.rs":"f0938b0fb1cbe99e8bbf45a6d1c3eda4272530027ec685039b140bb9559807f2","tests/ui-nightly/transmute-ref-dst-generic.stderr":"06b9fcf8e0443f997c0ef5f8e2659afcb65f095b11162ea69488f89788b337a7","tests/ui-nightly/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-nightly/transmute-ref-dst-mutable.stderr":"4db4b94e66018355b266db9128e6ec6b7763eb823eedfd6e8d34f0aee830cd76","tests/ui-nightly/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr":"67fdc7b427e715dc68803d46dd2af7f08c2269964697073c6a2519027ec1a2b3","tests/ui-nightly/transmute-ref-dst-not-frombytes.rs":"88f5a210bea3e3a775f92b6aaf4586e62cb9c6f61bcdc1cd7e63ad9ad214b863","tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr":"d832d4fdc61ef148eeef839a221ca27c99c70ea4961529344a1139279e824af6","tests/ui-nightly/transmute-ref-dst-not-nocell.rs":"71ed55ef424c8173bb438c6a1985a1a53e09d7964950d64a50ddb914c3425760","tests/ui-nightly/transmute-ref-dst-not-nocell.stderr":"9d723fbc05549f006d9e520aeface19418fca877862c48dc00730667742eadea","tests/ui-nightly/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-nightly/transmute-ref-dst-unsized.stderr":"7f9474b356200efb1db10fe3d4f956cd005a9b808e64a057499fa54857ae2ca8","tests/ui-nightly/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-nightly/transmute-ref-illegal-lifetime.stderr":"cb98c1b304334e58fc61be1c4b7782e68ab92d90a44c9627326d94d14a44cc38","tests/ui-nightly/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-nightly/transmute-ref-size-decrease.stderr":"14f6ea48e66c484e94f47c3af0983de06869a884cda19b2201548aadc2378758","tests/ui-nightly/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-nightly/transmute-ref-size-increase.stderr":"d5777c69b0ee36b6dcaf7699abb3ea03e1a8bac17bb5a1d4059ae28ff5f4357f","tests/ui-nightly/transmute-ref-src-dst-generic.rs":"01573b77e343fb6df20112ad65c4f9ff83fadb41428307f5dbb51964f6ca14a7","tests/ui-nightly/transmute-ref-src-dst-generic.stderr":"ebffb5c5318798ff84f1da69c3ba732b9af2ad3688ebd7b4b2770e2b201afccb","tests/ui-nightly/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-nightly/transmute-ref-src-dst-not-references.stderr":"ddea4b98e955704604dea41f4ade4c8b20de87efdad1fca7c105a2ce17548244","tests/ui-nightly/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-nightly/transmute-ref-src-dst-unsized.stderr":"84b86782822ff263e2e4b0207a56eb41fd4ba6fecf614f1d91c823188fef77fa","tests/ui-nightly/transmute-ref-src-generic.rs":"b0f7e1938a623f48f64bc49ebdad4e15e2dac217e2885d7a209b10f54357786c","tests/ui-nightly/transmute-ref-src-generic.stderr":"b53a09eca6226647cf53ee9bd0388e558def3bd1f8009b6ec74cc26e4db13d1c","tests/ui-nightly/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-nightly/transmute-ref-src-not-a-reference.stderr":"a21461a6176859b5cda0272023347174d5034760a6e4b18cdd1e20ab6cb60a46","tests/ui-nightly/transmute-ref-src-not-intobytes.rs":"81c6fa9775976ab678585a19a174470225e05f0b0cb43ceb754c198a8f0c9732","tests/ui-nightly/transmute-ref-src-not-intobytes.stderr":"3777baf4bfccbd161af155cb4899285932db3c386a2288ddd845651b6ef4c172","tests/ui-nightly/transmute-ref-src-not-nocell.rs":"0f1cf580d97ed69667b02bfe5de1425ceb0678fc43bf2130e65adc38f3dc5f3f","tests/ui-nightly/transmute-ref-src-not-nocell.stderr":"6556e59c7dcde4148d54d4b518230fb4fe8bad55045849916f08917569e9487e","tests/ui-nightly/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-nightly/transmute-ref-src-unsized.stderr":"81e97e76f030dd45ca338d76a327ffffc1fefff8228e0fc7d0a829e43e530b02","tests/ui-nightly/transmute-size-decrease.rs":"d191596652adbc26329449af4b2183bdae0a387ee668690b1de8535b71495eb7","tests/ui-nightly/transmute-size-decrease.stderr":"963c3b12c4a101587d3a27b2ae5cdee71b83c8ef89166e20c532ce37455847ec","tests/ui-nightly/transmute-size-increase.rs":"8ca917f831b736bfadb6ccee22acde205098678a3a2cb3cc753dfecacafcb0be","tests/ui-nightly/transmute-size-increase.stderr":"ca1a6ff9b387fe1a32216f9e49d088b06b73f1de58625069c8c6fab0213121e3","tests/ui-nightly/transmute-src-not-intobytes.rs":"e88bbf21c2512b9c04f938ead3990161f9b050aa469d9164244966ba6e2f02dd","tests/ui-nightly/transmute-src-not-intobytes.stderr":"d613c2240d84cba27f0bbc4a1737fd255e05eb78c70f6cdc123613d174c27653","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.rs":"534191c737297f8d60d1227a9cbbb9700bb08db15783d9191df3a64c8424e303","tests/ui-nightly/try_transmute-dst-not-tryfrombytes.stderr":"e8b5e3dccd7caa3fb4419907c02aa9951173ebb856e364cb7ba931c9e49e8696","tests/ui-nightly/try_transmute-size-decrease.rs":"a9079c8c3898342e42d0d239fd5c5460caaa60d6141ec162cdd97758edf13118","tests/ui-nightly/try_transmute-size-decrease.stderr":"db4a95088719395580646395d67759e16f8601777287d6617649dda945200cd5","tests/ui-nightly/try_transmute-size-increase.rs":"77fe321684808543b29dcd89a4dfbcd620543a94cac925babed23a0baa7aee5d","tests/ui-nightly/try_transmute-size-increase.stderr":"21caa98bce058c1e777af805d14512996e6624b3287a73a9865ee51c7e73f9c7","tests/ui-nightly/try_transmute-src-not-intobytes.rs":"fe267df8308820b9d6f6f3c2ba9f139d1f06c9355dcda85a72af312cf1485eb8","tests/ui-nightly/try_transmute-src-not-intobytes.stderr":"2b0c6e2e152cf2d17627bca2adbca5317461664b92d47a71090b6c300ea49dbb","tests/ui-nightly/try_transmute_mut-alignment-increase.rs":"831ab755840c1a81cf7c8a18a711c6bb82392f601f3aa5948a094523ac8fe027","tests/ui-nightly/try_transmute_mut-alignment-increase.stderr":"b5c642762c9d7f1eacdbafd2030af7d5a1b8cc8f73ce5f66bb31ab1c1d70feb9","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.rs":"d5150c8c6dac0d727f91763964a211da00c9842d3130c4c600b4ff6475ef6b83","tests/ui-nightly/try_transmute_mut-dst-not-tryfrombytes.stderr":"87c182e4dd89f8a9341d43ec1ff5309c027cc3cae77619e3e5d18da1646fd62c","tests/ui-nightly/try_transmute_mut-size-decrease.rs":"074cafd652b65c765ef6d37115a7ff8d8512cbee9b2cadd2b45e06c10a9ddf2f","tests/ui-nightly/try_transmute_mut-size-decrease.stderr":"f67ca517a7d6704fcbae5065a6f9ed8ecb94d62b3fc0c995e74a40e1425e92fd","tests/ui-nightly/try_transmute_mut-size-increase.rs":"049acbb919cfc11e88168fe4e5a8c12d8a2182f4b30bf1db3e6aa3d0654ddb1e","tests/ui-nightly/try_transmute_mut-size-increase.stderr":"76780facb70e6d5d70242df75470fa0f24e030901fef2c032878358c6bb5fbd8","tests/ui-nightly/try_transmute_mut-src-not-intobytes.rs":"0fe8411042107a477d9fe6c328d85b8d6018eff1309f58957cb2687768dbac2b","tests/ui-nightly/try_transmute_mut-src-not-intobytes.stderr":"5e0846606253e8f4469d81cdd7651a75a91863ba02fc5a88c286cbdb3cae3436","tests/ui-nightly/try_transmute_ref-alignment-increase.rs":"798a0af4304ed21fa5bb6fcac4c3e9bb93a282128839aaf6022d6d55364fc876","tests/ui-nightly/try_transmute_ref-alignment-increase.stderr":"252fd84eaa4f9b6a7750b713c2fab6d277e5020aa2205dc5f65dc056f92d5321","tests/ui-nightly/try_transmute_ref-dst-mutable.rs":"1ed1c2bf9f6588cc8b2eb57afac161052ac8124e7065606b2aaab51db2aa3457","tests/ui-nightly/try_transmute_ref-dst-mutable.stderr":"a4ae798bd31294b4f74fdd617c9f585c8d8930f525d9aa8c4d37146b3d6ad818","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"8a52c04394cc7f3d89b6b93e3906aef833931f730ba5beaed83cb4072334aa01","tests/ui-nightly/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"68cd7fffbd301f28da57117f76df2e9e3949c3766a75a6d0da189cb582cec5ec","tests/ui-nightly/try_transmute_ref-size-decrease.rs":"0e78e0112cc7f6f9b86d76382c25ac59bdaf691daf7735b2b6a086f96b33daff","tests/ui-nightly/try_transmute_ref-size-decrease.stderr":"ec532e464e8b7214e7541f9cf809dc2dcb9ea4653f92b169b14efdcf92b58369","tests/ui-nightly/try_transmute_ref-size-increase.rs":"707d0539764ce04f37e270ee98d0a1037bb2dff1fb408edd7aa470380b0922a1","tests/ui-nightly/try_transmute_ref-size-increase.stderr":"4be6a150553fb3482352f0922d2321e9c032514ffd1eca15c1d671cead5f8757","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.rs":"cb455e796e85ac9af743f9b3a1ece8c5e8ee9e4a18128e84685d3c124c595ebe","tests/ui-nightly/try_transmute_ref-src-not-immutable-intobytes.stderr":"d96e66a489a6ce49b79ea4a7abe889a72cdf232f16b46b9a2789012abb6e09d6","tests/ui-stable/diagnostic-not-implemented-from-bytes.rs":"d41e080139456e38ee162a57e489749ed46f4ab3d548b873fff5e3cfd1915089","tests/ui-stable/diagnostic-not-implemented-from-bytes.stderr":"fe9123522f5b3fa708c45654038260de96c154c960a161dd8c5bb7bb46a41ef2","tests/ui-stable/diagnostic-not-implemented-from-zeros.rs":"7068df4b45955c6f40bd71dfaa51ed87c850221a142fc5471b6354d5ed7a2c46","tests/ui-stable/diagnostic-not-implemented-from-zeros.stderr":"070c8b4c5fe7aee42b37b444b8c98ef92a6d9cdb9faa01ee48cb6f0c8c5133e8","tests/ui-stable/diagnostic-not-implemented-immutable.rs":"701f02b3e7dbb91ea6257cc08b5aeaed81a32be83f2424ca3887655926b568de","tests/ui-stable/diagnostic-not-implemented-immutable.stderr":"40641032b6145223854f70ebfc31726c0a7a191e5f2517bbb79a58d13d251f86","tests/ui-stable/diagnostic-not-implemented-into-bytes.rs":"aaedc974685ddc133c1f6c547f51f480057db9932700210ea513be55ddb3497f","tests/ui-stable/diagnostic-not-implemented-into-bytes.stderr":"cb41574733d5efa7fdfa3835d8c063876a9212e3e80ed2586730e0f69ac202f0","tests/ui-stable/diagnostic-not-implemented-issue-1296.rs":"b030a925ff39cb2ea9b1777273f0bcfd982d972fa43cb5f2b6fdc1e6da467312","tests/ui-stable/diagnostic-not-implemented-issue-1296.stderr":"99447c8a209d2e9fe4e17fb46a3f69c278636c86c738e59ef302541aab29a1f7","tests/ui-stable/diagnostic-not-implemented-known-layout.rs":"1e9d77125b68169b231d62da4fb1a1a76fb71bf7a1c4275a096a0715873b4fd2","tests/ui-stable/diagnostic-not-implemented-known-layout.stderr":"d6a92e77b18efaa29954c999d6705e3a050be4bb758575294329cb34d5e23f55","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.rs":"922b8eab7092dba41ec37b3ebcad7b48eb8d391e54dff3f2869bcf1954c85003","tests/ui-stable/diagnostic-not-implemented-try-from-bytes.stderr":"9a4eecd6aa31e8ac2a8bcef61775befb94a30074b7d94a04e907b1d77130374f","tests/ui-stable/diagnostic-not-implemented-unaligned.rs":"8af59d04924492eff43708cb504a421d9c5b8e42cae1ea0a80118f911af47e7b","tests/ui-stable/diagnostic-not-implemented-unaligned.stderr":"565cf49ebcb5ada4823a326af1e154279117f868762d1e2b62f200060fe0e53d","tests/ui-stable/include_value_not_from_bytes.rs":"74f4d54dad245eff591cb46344fd1f25fb27b73de941c04d1ee82b0ad2639807","tests/ui-stable/include_value_not_from_bytes.stderr":"702c134b33eece562ad3491a2b20a8d946a4b3fcd3405cb1b049b412d2c5cbab","tests/ui-stable/include_value_wrong_size.rs":"5a0561eeb4cb245cf5b68547b43faa2432c56bfe23f7f50677a0b110dab60cdb","tests/ui-stable/include_value_wrong_size.stderr":"d1a76cd36830c8b07bb1204ebc95aeadf0a1a54ff7cc924635c0dbd3efa0b3a4","tests/ui-stable/invalid-impls/invalid-impls.rs":"ded679eaa7cf397aad0296a43cfb2344513e282b34b3a38dbb5d3d8d5da9a632","tests/ui-stable/invalid-impls/invalid-impls.stderr":"2a39f7ee2bb7b23fb73cbaa4142b97e6dfd37b42de5b1a837b19d6b0e97a4507","tests/ui-stable/max-align.rs":"ffcb6687c98e5629d01b17cbd0845ec195007cc39aa244b26a77d17688c8f13d","tests/ui-stable/max-align.stderr":"a8bd50e80cd0ae680a52ea71d06d259a43300dcfbf6b336a12cb371fe84e119b","tests/ui-stable/transmute-dst-not-frombytes.rs":"2d045c51d4ea1a435ca3f4e435412eeb0ac6511597dccab8e0040d4903f2b7df","tests/ui-stable/transmute-dst-not-frombytes.stderr":"61fc075454296268f1bd62fe6933ad658ee21cbe5bb15d56169f924e9ac01c92","tests/ui-stable/transmute-mut-alignment-increase.rs":"c998500cd80df3c519fca8bb289b4790197f8b076b767eb62ab908693897ef92","tests/ui-stable/transmute-mut-alignment-increase.stderr":"622de849ac650d5764c05eaae04ace1060161d691e885bcff724bc7d49cfecf2","tests/ui-stable/transmute-mut-const.rs":"5689e8cbc11728f948d0263009a2219e272734e317bd20abd00bd4ddcefba713","tests/ui-stable/transmute-mut-const.stderr":"3cb32fdc824fee5a0e3c03f60353c98d6dbced9e21fe437b8280a3835cc997c0","tests/ui-stable/transmute-mut-dst-generic.rs":"8c5442baf9963e3dd2b3e6f782574ef794629b761dc29cff95d017b38d234c7b","tests/ui-stable/transmute-mut-dst-generic.stderr":"f2c60a1aae05ad780802b0290989c546abe35adcbcacf83a2264446a40ceb5dd","tests/ui-stable/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-stable/transmute-mut-dst-not-a-reference.stderr":"64de9b311751410bab9d7be9ab96809b8243459429e5b31c01b080dd5f42469a","tests/ui-stable/transmute-mut-dst-not-frombytes.rs":"2b95c8d73c6a321137b5a59c12f554e7433b10f0e95e3ac657330bce0bab149c","tests/ui-stable/transmute-mut-dst-not-frombytes.stderr":"a2558fda1d07bf668d0d7a6e4822cbb9b7316b32950e60bf30ea9a887d29e66a","tests/ui-stable/transmute-mut-dst-not-intobytes.rs":"2e4da8d35584a2bbeaea33398bb5773a2d40aeee2e2ea7272e9382940cb97ec3","tests/ui-stable/transmute-mut-dst-not-intobytes.stderr":"673fadf2f0ae16d09b23e7eb2f37ed554b50ca67849b33106a321dc2aa9da293","tests/ui-stable/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-stable/transmute-mut-dst-unsized.stderr":"32ddb36f99b7e7288f548c0205562dd8daf60e10da44d0851686556910bde8a2","tests/ui-stable/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-stable/transmute-mut-illegal-lifetime.stderr":"3a43e0be32ef3589fe3fa713d387bd3976bd8c75813f9641bbf7c539e10bed41","tests/ui-stable/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-stable/transmute-mut-size-decrease.stderr":"b63870c4361917d4cd19fbaba433a9389b806135c9576ae8997c86f3b763fe3c","tests/ui-stable/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-stable/transmute-mut-size-increase.stderr":"cb086ebcc60c4e17f8897c62c5b36b110b259c6e970825953798daf37144af47","tests/ui-stable/transmute-mut-src-dst-generic.rs":"97f1e6c643632abdf3ae188acf91f24bc1e1f6b7cedf5794717ae8685611c892","tests/ui-stable/transmute-mut-src-dst-generic.stderr":"42b02cf4d31dda2ac99a09d66189dc6c00af5c885f8c0dcf04a91d6192abe073","tests/ui-stable/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-stable/transmute-mut-src-dst-not-references.stderr":"5ffeb1d3d10172fbb87f08233664c3c81179f39b72d5bcc92257849142d9ab8c","tests/ui-stable/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-stable/transmute-mut-src-dst-unsized.stderr":"073bc637cde2d211192037cea97619f195c3fdc9ca0175f89b288ac2d5a116bc","tests/ui-stable/transmute-mut-src-generic.rs":"7197d889f9d1d91402d4c4c13da96ff8c170042f7ce0a758157b27f985f508fb","tests/ui-stable/transmute-mut-src-generic.stderr":"ca9f493d91401062575b2f85c23bdfa256bfd80ceea81669ad5b12b229be802a","tests/ui-stable/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-stable/transmute-mut-src-immutable.stderr":"6c686d12cd90ab5b1c3101bddc99f022d2e07f550c7889b8cb3c73977fc2fb04","tests/ui-stable/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-stable/transmute-mut-src-not-a-reference.stderr":"740530b1d0d60e2ae8e21eb51b9d04dec30df22be560e114969311385594aa9a","tests/ui-stable/transmute-mut-src-not-frombytes.rs":"647cb1a8fa51b4e833fd3f498a471a344318affc0d2ca8080a7f17dc8a27b30a","tests/ui-stable/transmute-mut-src-not-frombytes.stderr":"d2342fd50213cd462b8bc023dd4d7c452e70c2140c00b62fd6fbf7fb8104cdfe","tests/ui-stable/transmute-mut-src-not-intobytes.rs":"40ed14c627923d668173d9d5b3ee5cb0462a126ad4f209224205abc4a3f33b45","tests/ui-stable/transmute-mut-src-not-intobytes.stderr":"9336ca7a34959225010233decd1da051f873c5e67392a18bae5b1a0d4b902993","tests/ui-stable/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-stable/transmute-mut-src-unsized.stderr":"bc4302f01d572fe24640bcd43bb3f84c6811aa056711565a6f75b7a1ffc43ca7","tests/ui-stable/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-stable/transmute-ptr-to-usize.stderr":"0d0cedd5e4eb48338fdd23752eb6ebf57642f3565529f618ebda6071578f2149","tests/ui-stable/transmute-ref-alignment-increase.rs":"f1ea9907bd943bf6a709ee40431c8b3122f6926271b33b8e9561bdddf504e82a","tests/ui-stable/transmute-ref-alignment-increase.stderr":"124cf81a3a302d4a2494f769efda66413bcc0494da22d4956dc341596e55739a","tests/ui-stable/transmute-ref-dst-generic.rs":"f0938b0fb1cbe99e8bbf45a6d1c3eda4272530027ec685039b140bb9559807f2","tests/ui-stable/transmute-ref-dst-generic.stderr":"0fa2e50dd2f259260511ae3534334420e4384d542daa8532c7d3a625652c2ada","tests/ui-stable/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-stable/transmute-ref-dst-mutable.stderr":"486b10eabc7af0158624a4fa0389953c68703525f1ea2679dd576821c8ecb912","tests/ui-stable/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-stable/transmute-ref-dst-not-a-reference.stderr":"5363c9c0af4a48ffd0d546b0ece0b43144d7c690c54cd6cd7dbfd723aedbc227","tests/ui-stable/transmute-ref-dst-not-frombytes.rs":"88f5a210bea3e3a775f92b6aaf4586e62cb9c6f61bcdc1cd7e63ad9ad214b863","tests/ui-stable/transmute-ref-dst-not-frombytes.stderr":"eb8fced405758edb7c29b7c9c73bf07698e839fb71fd07c84aa343c173e54c40","tests/ui-stable/transmute-ref-dst-not-nocell.rs":"71ed55ef424c8173bb438c6a1985a1a53e09d7964950d64a50ddb914c3425760","tests/ui-stable/transmute-ref-dst-not-nocell.stderr":"e939607d2028a038930dcca2f194c3f9072ceebc912eab3f3ead6a53e86ee037","tests/ui-stable/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-stable/transmute-ref-dst-unsized.stderr":"d85c454675711b193fe8bce43bf154a7471073affcd6f19af3cab4701b5e4f63","tests/ui-stable/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-stable/transmute-ref-illegal-lifetime.stderr":"45ab741d710dc5a01a21ab64f99927e7da5593328b2037b9bc82a87bc0969136","tests/ui-stable/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-stable/transmute-ref-size-decrease.stderr":"fec5ab0e3d885bbb8e7ab82d6d58b9b4ee35a1802502fbc494bafa086d4132cf","tests/ui-stable/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-stable/transmute-ref-size-increase.stderr":"720e2150c9ed538cf00d7525124ab0cee6ac53e91582470e09c140db783fc2be","tests/ui-stable/transmute-ref-src-dst-generic.rs":"01573b77e343fb6df20112ad65c4f9ff83fadb41428307f5dbb51964f6ca14a7","tests/ui-stable/transmute-ref-src-dst-generic.stderr":"25f15e5316df34cd4a438548090c287228f86062f7e2ef59ea17fb727b868a19","tests/ui-stable/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-stable/transmute-ref-src-dst-not-references.stderr":"918a203918a5f61d5a135c0497f7dd0ac99bf2e9f089940a2a4061cc8fada01f","tests/ui-stable/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-stable/transmute-ref-src-dst-unsized.stderr":"23c16b09e080e4ce94cb65e3a3acbba0a6f6bac7a4089ee50d0778e7a606a612","tests/ui-stable/transmute-ref-src-generic.rs":"b0f7e1938a623f48f64bc49ebdad4e15e2dac217e2885d7a209b10f54357786c","tests/ui-stable/transmute-ref-src-generic.stderr":"f3f8a7ee67ebec21169e1284c9eeaedcfa7b93c05f4e42c504cbd06508f34f9f","tests/ui-stable/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-stable/transmute-ref-src-not-a-reference.stderr":"625fdd62e689536fad2c4edaade47625be62de70dea8071ba25accaf8a758305","tests/ui-stable/transmute-ref-src-not-intobytes.rs":"81c6fa9775976ab678585a19a174470225e05f0b0cb43ceb754c198a8f0c9732","tests/ui-stable/transmute-ref-src-not-intobytes.stderr":"567de31ddc6aed234cd5bd11204847de4478016dcbd223ae182d4579efde98c3","tests/ui-stable/transmute-ref-src-not-nocell.rs":"0f1cf580d97ed69667b02bfe5de1425ceb0678fc43bf2130e65adc38f3dc5f3f","tests/ui-stable/transmute-ref-src-not-nocell.stderr":"32c77219dccbca2de8527a27dec52ba98667fdaeb500afdd380db4ad595cf28f","tests/ui-stable/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-stable/transmute-ref-src-unsized.stderr":"1251c79f24d7d6842579c8e74c7e4b6dc793ae2e6fadb0713c66904545abeaab","tests/ui-stable/transmute-size-decrease.rs":"d191596652adbc26329449af4b2183bdae0a387ee668690b1de8535b71495eb7","tests/ui-stable/transmute-size-decrease.stderr":"617695b7858c0ef01c2a9f7fefc8f7aeb1d6e438f6e36b13a1901d84118e7e01","tests/ui-stable/transmute-size-increase.rs":"8ca917f831b736bfadb6ccee22acde205098678a3a2cb3cc753dfecacafcb0be","tests/ui-stable/transmute-size-increase.stderr":"2c5593d90e962ae7ed4ba91f5dbfa50f31f8fe58ff9f7eb0af69b7a4757d8fbf","tests/ui-stable/transmute-src-not-intobytes.rs":"e88bbf21c2512b9c04f938ead3990161f9b050aa469d9164244966ba6e2f02dd","tests/ui-stable/transmute-src-not-intobytes.stderr":"98c6dc46393e615d890c5f6deaa3bf0aad60b2beb8f3767856fc7e50027813f2","tests/ui-stable/try_transmute-dst-not-tryfrombytes.rs":"534191c737297f8d60d1227a9cbbb9700bb08db15783d9191df3a64c8424e303","tests/ui-stable/try_transmute-dst-not-tryfrombytes.stderr":"15bdd10761070140c4a729ad24ffa0749d0a554515ef499dba0717db5a862070","tests/ui-stable/try_transmute-size-decrease.rs":"a9079c8c3898342e42d0d239fd5c5460caaa60d6141ec162cdd97758edf13118","tests/ui-stable/try_transmute-size-decrease.stderr":"e87938dfce9c41871577f4f2b80ea7eb9da948c89bce6896532c014b1fe47f51","tests/ui-stable/try_transmute-size-increase.rs":"77fe321684808543b29dcd89a4dfbcd620543a94cac925babed23a0baa7aee5d","tests/ui-stable/try_transmute-size-increase.stderr":"75834f5429dc6d53d3816c4ec9995c1c73a4b51348d5ee5e5e1f41c6d4b90c67","tests/ui-stable/try_transmute-src-not-intobytes.rs":"fe267df8308820b9d6f6f3c2ba9f139d1f06c9355dcda85a72af312cf1485eb8","tests/ui-stable/try_transmute-src-not-intobytes.stderr":"74106b79b00d7e2464ae0da4a2bd6731f9f4047cfac42f50d1edd3b299fa1b85","tests/ui-stable/try_transmute_mut-alignment-increase.rs":"831ab755840c1a81cf7c8a18a711c6bb82392f601f3aa5948a094523ac8fe027","tests/ui-stable/try_transmute_mut-alignment-increase.stderr":"c0f7ab750769c50030222f2f12636743d11c0c9596781e76acd46e7010800e6c","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.rs":"d5150c8c6dac0d727f91763964a211da00c9842d3130c4c600b4ff6475ef6b83","tests/ui-stable/try_transmute_mut-dst-not-tryfrombytes.stderr":"e6bb99863d12de43a6156246ff020f2397e633bd01b7114b8cdbf047fd8de77b","tests/ui-stable/try_transmute_mut-size-decrease.rs":"074cafd652b65c765ef6d37115a7ff8d8512cbee9b2cadd2b45e06c10a9ddf2f","tests/ui-stable/try_transmute_mut-size-decrease.stderr":"397f8e2ecaa0bc0d16705c3d6e48351687879b6c8752ee587b2c795945e3b664","tests/ui-stable/try_transmute_mut-size-increase.rs":"049acbb919cfc11e88168fe4e5a8c12d8a2182f4b30bf1db3e6aa3d0654ddb1e","tests/ui-stable/try_transmute_mut-size-increase.stderr":"3e2b18edfee19545bc02c3ba829ec9e571522a2056f4c838348734688253b331","tests/ui-stable/try_transmute_mut-src-not-intobytes.rs":"0fe8411042107a477d9fe6c328d85b8d6018eff1309f58957cb2687768dbac2b","tests/ui-stable/try_transmute_mut-src-not-intobytes.stderr":"df9d5465891f116aa5716cda44a102804348afcbcfa8d4aa093ea1f25bde4360","tests/ui-stable/try_transmute_ref-alignment-increase.rs":"798a0af4304ed21fa5bb6fcac4c3e9bb93a282128839aaf6022d6d55364fc876","tests/ui-stable/try_transmute_ref-alignment-increase.stderr":"d4a72d346572162c207a303041480a00b3a9d088619495dc99e0084c3f19fdb2","tests/ui-stable/try_transmute_ref-dst-mutable.rs":"1ed1c2bf9f6588cc8b2eb57afac161052ac8124e7065606b2aaab51db2aa3457","tests/ui-stable/try_transmute_ref-dst-mutable.stderr":"b639bae41e7bb7ece5c5eb1468d72c3144dec40982f209da5499025c96bae0bd","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.rs":"8a52c04394cc7f3d89b6b93e3906aef833931f730ba5beaed83cb4072334aa01","tests/ui-stable/try_transmute_ref-dst-not-immutable-tryfrombytes.stderr":"b6b54d2b8b6011e08d955f63395b423d1ede5fea840e7d062da89a3e665d3d79","tests/ui-stable/try_transmute_ref-size-decrease.rs":"0e78e0112cc7f6f9b86d76382c25ac59bdaf691daf7735b2b6a086f96b33daff","tests/ui-stable/try_transmute_ref-size-decrease.stderr":"2ebd930f89eb0b95a0bf05956a8c01a9085109db8c034457b89b464e745b6e18","tests/ui-stable/try_transmute_ref-size-increase.rs":"707d0539764ce04f37e270ee98d0a1037bb2dff1fb408edd7aa470380b0922a1","tests/ui-stable/try_transmute_ref-size-increase.stderr":"c47a2d133e11a7054c44c85c057bb8de5d9c0a7f9b9f2730f4a7bba2a0ff7977","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.rs":"cb455e796e85ac9af743f9b3a1ece8c5e8ee9e4a18128e84685d3c124c595ebe","tests/ui-stable/try_transmute_ref-src-not-immutable-intobytes.stderr":"110fd6c127e17ead1ac137bd399c54252158b58670dd2b557e5c08da39b32e9d","win-cargo.bat":"dbde5af501630f6d14a0681d27f30ef2ffaeb1753d14be2f7cb1a7f285458c07"},"package":"a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468"}
\ No newline at end of file
diff --git a/crates/zerocopy/Android.bp b/crates/zerocopy/Android.bp
index 152b3be..638938e 100644
--- a/crates/zerocopy/Android.bp
+++ b/crates/zerocopy/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "zerocopy",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.13",
+    cargo_pkg_version: "0.8.14",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
@@ -42,7 +42,7 @@
     name: "libzerocopy_nostd",
     crate_name: "zerocopy",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.13",
+    cargo_pkg_version: "0.8.14",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
@@ -72,7 +72,7 @@
     name: "libzerocopy_nostd_noalloc",
     crate_name: "zerocopy",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.8.13",
+    cargo_pkg_version: "0.8.14",
     crate_root: "src/lib.rs",
     edition: "2021",
     features: [
diff --git a/crates/zerocopy/Cargo.toml b/crates/zerocopy/Cargo.toml
index 3b83c34..9c03b8b 100644
--- a/crates/zerocopy/Cargo.toml
+++ b/crates/zerocopy/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.56.0"
 name = "zerocopy"
-version = "0.8.13"
+version = "0.8.14"
 authors = ["Joshua Liebow-Feeser <[email protected]>"]
 build = "build.rs"
 exclude = [".*"]
@@ -72,7 +72,7 @@
 path = "tests/trybuild.rs"
 
 [dependencies.zerocopy-derive]
-version = "=0.8.13"
+version = "=0.8.14"
 optional = true
 
 [dev-dependencies.elain]
@@ -97,7 +97,7 @@
 features = ["diff"]
 
 [dev-dependencies.zerocopy-derive]
-version = "=0.8.13"
+version = "=0.8.14"
 
 [features]
 __internal_use_only_features_that_work_on_stable = [
@@ -114,4 +114,4 @@
 std = ["alloc"]
 
 [target."cfg(any())".dependencies.zerocopy-derive]
-version = "=0.8.13"
+version = "=0.8.14"
diff --git a/crates/zerocopy/METADATA b/crates/zerocopy/METADATA
index 4e6f231..5bc1cc9 100644
--- a/crates/zerocopy/METADATA
+++ b/crates/zerocopy/METADATA
@@ -1,17 +1,17 @@
 name: "zerocopy"
 description: "Utilities for zero-copy parsing and serialization"
 third_party {
-  version: "0.8.13"
+  version: "0.8.14"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 12
+    year: 2025
+    month: 1
+    day: 13
   }
   homepage: "https://crates.io/crates/zerocopy"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/zerocopy/zerocopy-0.8.13.crate"
-    version: "0.8.13"
+    value: "https://static.crates.io/crates/zerocopy/zerocopy-0.8.14.crate"
+    version: "0.8.14"
   }
 }
diff --git a/crates/zerocopy/src/lib.rs b/crates/zerocopy/src/lib.rs
index a45c49c..4734334 100644
--- a/crates/zerocopy/src/lib.rs
+++ b/crates/zerocopy/src/lib.rs
@@ -5432,6 +5432,22 @@
         Self: Sized;
 }
 
+/// Derives an optimized implementation of [`Hash`] for types that implement
+/// [`IntoBytes`] and [`Immutable`].
+///
+/// The standard library's derive for `Hash` generates a recursive descent
+/// into the fields of the type it is applied to. Instead, the implementation
+/// derived by this macro makes a single call to [`Hasher::write()`] for both
+/// [`Hash::hash()`] and [`Hash::hash_slice()`], feeding the hasher the bytes
+/// of the type or slice all at once.
+///
+/// [`Hash`]: core::hash::Hash
+/// [`Hash::hash()`]: core::hash::Hash::hash()
+/// [`Hash::hash_slice()`]: core::hash::Hash::hash_slice()
+#[cfg(any(feature = "derive", test))]
+#[cfg_attr(doc_cfg, doc(cfg(feature = "derive")))]
+pub use zerocopy_derive::ByteHash;
+
 #[cfg(feature = "alloc")]
 #[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))]
 #[cfg(zerocopy_panic_in_const_and_vec_try_reserve_1_57_0)]
diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index ad547b6..7c4e466 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -8,7 +8,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a72425af5ca5fea30463427958c9fdc07ac24e58d0edafb7cb14ebf7706f2350"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
 ]
 
 [[package]]
@@ -18,7 +18,7 @@
 checksum = "9e42f25ac5fa51f4188d14baf8f387a97dcd8639644b2f3df948bf5f6dd7d6fa"
 dependencies = [
  "bit_field",
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "log",
 ]
 
@@ -122,7 +122,7 @@
  "bindgen 0.69.5",
  "bindgen-cli",
  "bit_field",
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "bitreader",
  "bstr",
  "buddy_system_allocator",
@@ -235,13 +235,13 @@
  "hyper",
  "hyper-timeout",
  "ident_case",
- "idna 0.5.0",
+ "idna",
  "indexmap 1.9.3",
  "inotify",
  "inotify-sys",
  "instant",
  "intrusive-collections",
- "itertools 0.13.0",
+ "itertools 0.14.0",
  "itoa",
  "jni",
  "jni-sys",
@@ -260,7 +260,7 @@
  "linked-hash-map",
  "linkme",
  "linkme-impl",
- "litrs 0.3.0",
+ "litrs",
  "lock_api",
  "log",
  "lru-cache",
@@ -287,7 +287,7 @@
  "mls-rs-core",
  "mls-rs-crypto-traits",
  "mockall",
- "mockall_derive 0.13.1",
+ "mockall_derive",
  "moveit",
  "named-lock",
  "nix 0.28.0",
@@ -301,7 +301,7 @@
  "num_cpus",
  "num_enum",
  "num_enum_derive",
- "octets",
+ "octets 0.3.0",
  "once_cell",
  "oneshot-uniffi",
  "oorandom",
@@ -396,7 +396,7 @@
  "strsim 0.11.1",
  "strum",
  "strum_macros",
- "syn 2.0.90",
+ "syn 2.0.96",
  "syn-mid",
  "sync_wrapper 1.0.2",
  "synstructure",
@@ -404,8 +404,8 @@
  "termcolor",
  "termtree",
  "textwrap 0.16.1",
- "thiserror 2.0.6",
- "thiserror-impl 2.0.6",
+ "thiserror 2.0.11",
+ "thiserror-impl 2.0.11",
  "thread_local",
  "threadpool",
  "tikv-jemalloc-sys",
@@ -478,8 +478,8 @@
  "x509-cert",
  "xml-rs",
  "yaml-rust",
- "zerocopy 0.8.13",
- "zerocopy-derive 0.8.13",
+ "zerocopy 0.8.14",
+ "zerocopy-derive 0.8.14",
  "zeroize",
  "zeroize_derive",
  "zip",
@@ -635,17 +635,14 @@
  "argh_shared",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
 name = "argh_shared"
-version = "0.1.12"
+version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531"
-dependencies = [
- "serde",
-]
+checksum = "a464143cc82dedcdc3928737445362466b7674b5db4e2eb8e869846d6d84f4f6"
 
 [[package]]
 name = "arrayvec"
@@ -681,7 +678,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -698,7 +695,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -865,7 +862,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cexpr",
  "clang-sys",
  "lazy_static",
@@ -876,7 +873,7 @@
  "regex",
  "rustc-hash",
  "shlex",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -886,7 +883,7 @@
 checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
 dependencies = [
  "annotate-snippets",
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cexpr",
  "clang-sys",
  "itertools 0.12.1",
@@ -899,7 +896,7 @@
  "regex",
  "rustc-hash",
  "shlex",
- "syn 2.0.90",
+ "syn 2.0.96",
  "which",
 ]
 
@@ -931,9 +928,9 @@
 
 [[package]]
 name = "bitflags"
-version = "2.6.0"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be"
 
 [[package]]
 name = "bitreader"
@@ -991,9 +988,9 @@
 
 [[package]]
 name = "bytemuck"
-version = "1.20.0"
+version = "1.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
+checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
 dependencies = [
  "bytemuck_derive",
 ]
@@ -1006,7 +1003,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1227,7 +1224,7 @@
  "heck",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1568,7 +1565,7 @@
  "proc-macro2 1.0.92",
  "quote 1.0.37",
  "strsim 0.11.1",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1579,7 +1576,7 @@
 dependencies = [
  "darling_core",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1631,7 +1628,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1651,7 +1648,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1700,7 +1697,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1724,7 +1721,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
 dependencies = [
- "litrs 0.4.1",
+ "litrs",
 ]
 
 [[package]]
@@ -1745,7 +1742,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "bytemuck",
  "drm-ffi",
  "drm-fourcc",
@@ -1804,7 +1801,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -1849,7 +1846,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "74351c3392ea1ff6cd2628e0042d268ac2371cb613252ff383b6dfa50d22fa79"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "libc",
 ]
 
@@ -2130,7 +2127,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -2194,7 +2191,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "45bf55ba6dd53ad0ac115046ff999c5324c283444ee6e0be82454c4e8eb2f36a"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "drm",
  "drm-fourcc",
  "gbm-sys",
@@ -2218,7 +2215,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "31c683a9f13de31432e6097131d5f385898c7f0635c0f392b9d0fa165063c8ac"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "log",
  "managed",
@@ -2283,9 +2280,9 @@
 
 [[package]]
 name = "glob"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
 
 [[package]]
 name = "googletest"
@@ -2306,7 +2303,7 @@
 checksum = "ed3057b7d1e628480193188ccb1a7850d034a3add3a350f4ed921b48e287ada9"
 dependencies = [
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -2317,7 +2314,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -2326,7 +2323,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09831ec59b80be69e75d29cf36e16afbbe5fd1af9c1bf4689ad91c77db5aa6a6"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "libc",
  "nix 0.27.1",
 ]
@@ -2618,16 +2615,6 @@
 
 [[package]]
 name = "idna"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "idna"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
@@ -2676,7 +2663,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "futures-core",
  "inotify-sys",
  "libc",
@@ -2771,9 +2758,9 @@
 
 [[package]]
 name = "itertools"
-version = "0.13.0"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
 dependencies = [
  "either",
 ]
@@ -2869,7 +2856,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "93edd9cd673087fa7518fd63ad6c87be2cd9b4e35034b1873f3e3258c018275b"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "libbpf-sys",
  "libc",
  "vsprintf",
@@ -2934,7 +2921,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "libc",
 ]
 
@@ -3006,7 +2993,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3023,18 +3010,12 @@
 
 [[package]]
 name = "litrs"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b487d13a3f4b465df87895a37b24e364907019afa12d943528df5b7abe0836f1"
-dependencies = [
- "proc-macro2 1.0.92",
-]
-
-[[package]]
-name = "litrs"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
+dependencies = [
+ "proc-macro2 1.0.92",
+]
 
 [[package]]
 name = "lock_api"
@@ -3133,7 +3114,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3144,9 +3125,9 @@
 
 [[package]]
 name = "memmap2"
-version = "0.8.0"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed"
+checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
 dependencies = [
  "libc",
 ]
@@ -3202,7 +3183,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3297,7 +3278,7 @@
  "darling",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3343,15 +3324,14 @@
 
 [[package]]
 name = "mockall"
-version = "0.12.1"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48"
+checksum = "39a6bfcc6c8c7eed5ee98b9c3e33adc726054389233e201c95dab2d41a3839d2"
 dependencies = [
  "cfg-if",
  "downcast",
  "fragile",
- "lazy_static",
- "mockall_derive 0.12.1",
+ "mockall_derive",
  "predicates",
  "predicates-tree",
 ]
@@ -3365,7 +3345,7 @@
  "cfg-if",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3377,7 +3357,7 @@
  "cfg-if",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3406,7 +3386,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "libc",
 ]
@@ -3417,7 +3397,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "cfg_aliases 0.1.1",
  "libc",
@@ -3430,7 +3410,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "cfg_aliases 0.2.1",
  "libc",
@@ -3438,13 +3418,13 @@
 
 [[package]]
 name = "no-panic"
-version = "0.1.32"
+version = "0.1.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13039f2e914d0c1b8674a6a63681cfb857c41f029920db505f850c36dee22df8"
+checksum = "8f7da86466fe446079286ef4b2f6d789755b610a9d85da8477633f734d2697e8"
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3556,7 +3536,7 @@
  "proc-macro-crate 3.1.0",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3584,6 +3564,12 @@
 checksum = "3a74f2cda724d43a0a63140af89836d4e7db6138ef67c9f96d3a0f0150d05000"
 
 [[package]]
+name = "octets"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "109983a091271ee8916076731ba5fdc9ee22fea871bc7c6ceab9bfd423eb1d99"
+
+[[package]]
 name = "once_cell"
 version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3622,7 +3608,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3631,7 +3617,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "foreign-types",
  "libc",
@@ -3642,13 +3628,13 @@
 
 [[package]]
 name = "openssl-macros"
-version = "0.1.0"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 1.0.109",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3722,15 +3708,15 @@
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
 dependencies = [
  "cfg-if",
  "libc",
  "redox_syscall",
  "smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -3752,9 +3738,9 @@
 
 [[package]]
 name = "pathdiff"
-version = "0.2.1"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
 
 [[package]]
 name = "pathfinder_geometry"
@@ -3803,7 +3789,7 @@
  "quote 1.0.37",
  "serde",
  "serde_json",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3850,7 +3836,7 @@
 checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc"
 dependencies = [
  "memchr",
- "thiserror 2.0.6",
+ "thiserror 2.0.11",
  "ucd-trie",
 ]
 
@@ -3874,14 +3860,14 @@
  "pest_meta",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
 name = "pest_meta"
-version = "2.7.6"
+version = "2.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d"
+checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea"
 dependencies = [
  "once_cell",
  "pest",
@@ -3915,7 +3901,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -3995,9 +3981,9 @@
 
 [[package]]
 name = "plotters-svg"
-version = "0.3.5"
+version = "0.3.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
+checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
 dependencies = [
  "plotters-backend",
 ]
@@ -4073,9 +4059,9 @@
 
 [[package]]
 name = "predicates-core"
-version = "1.0.6"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
+checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa"
 
 [[package]]
 name = "predicates-tree"
@@ -4104,7 +4090,7 @@
 checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033"
 dependencies = [
  "proc-macro2 1.0.92",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -4276,7 +4262,7 @@
  "libc",
  "libm",
  "log",
- "octets",
+ "octets 0.2.0",
  "ring 0.16.20",
  "slab",
  "smallvec",
@@ -4382,11 +4368,11 @@
 
 [[package]]
 name = "redox_syscall"
-version = "0.4.1"
+version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
 dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.6.0",
 ]
 
 [[package]]
@@ -4434,7 +4420,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -4493,7 +4479,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "fallible-iterator 0.2.0",
  "fallible-streaming-iterator",
  "hashlink",
@@ -4547,7 +4533,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "errno",
  "libc",
  "linux-raw-sys 0.4.14",
@@ -4604,7 +4590,7 @@
  "proc-macro-error",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
  "thiserror 1.0.49",
 ]
 
@@ -4699,7 +4685,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -4967,9 +4953,9 @@
 
 [[package]]
 name = "strum"
-version = "0.25.0"
+version = "0.26.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
 
 [[package]]
 name = "strum_macros"
@@ -4981,7 +4967,7 @@
  "proc-macro2 1.0.92",
  "quote 1.0.37",
  "rustversion",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5014,9 +5000,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.90"
+version = "2.0.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
+checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
@@ -5031,7 +5017,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5054,7 +5040,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5116,11 +5102,11 @@
 
 [[package]]
 name = "thiserror"
-version = "2.0.6"
+version = "2.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47"
+checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
 dependencies = [
- "thiserror-impl 2.0.6",
+ "thiserror-impl 2.0.11",
 ]
 
 [[package]]
@@ -5131,18 +5117,18 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "2.0.6"
+version = "2.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312"
+checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5229,6 +5215,27 @@
 checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
+name = "tls_codec"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e78c9c330f8c85b2bae7c8368f2739157db9991235123aa1b15ef9502bfb6a"
+dependencies = [
+ "tls_codec_derive",
+ "zeroize",
+]
+
+[[package]]
+name = "tls_codec_derive"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c"
+dependencies = [
+ "proc-macro2 1.0.92",
+ "quote 1.0.37",
+ "syn 2.0.90",
+]
+
+[[package]]
 name = "tokio"
 version = "1.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5255,13 +5262,13 @@
 
 [[package]]
 name = "tokio-macros"
-version = "2.4.0"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
+checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5456,14 +5463,14 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
 dependencies = [
  "once_cell",
  "valuable",
@@ -5562,7 +5569,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6679b7fc2f6d6d2ea2f67555ef3ed9d71d30c5021faf9193091a5192db7dc468"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "log",
  "ptr_meta",
@@ -5580,7 +5587,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5589,7 +5596,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f6d465de2c918779dafb769a5a4fe8d6e4fb7cc4cc6cb1a735f2f6ec68beea4"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "ptr_meta",
  "uguid",
 ]
@@ -5629,9 +5636,9 @@
 
 [[package]]
 name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
 
 [[package]]
 name = "unicode-width"
@@ -5669,7 +5676,7 @@
 checksum = "ae7e5a6c33b1dec3f255f57ec0b6af0f0b2bb3021868be1d5eec7a38e2905ebc"
 dependencies = [
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5679,7 +5686,7 @@
 checksum = "802d2051a700e3ec894c79f80d2705b69d85844dafbbe5d1a92776f8f48b563a"
 dependencies = [
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -5711,7 +5718,7 @@
  "proc-macro2 1.0.92",
  "quote 1.0.37",
  "serde",
- "syn 2.0.90",
+ "syn 2.0.96",
  "toml 0.5.11",
  "uniffi_meta",
 ]
@@ -5763,12 +5770,12 @@
 
 [[package]]
 name = "url"
-version = "2.3.1"
+version = "2.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
 dependencies = [
  "form_urlencoded",
- "idna 0.3.0",
+ "idna",
  "percent-encoding",
 ]
 
@@ -5778,7 +5785,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "18d8b176d4d3e420685e964f87c25df5fdd5b26d7eb0d0e7c892d771f5b81035"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "libc",
  "nix 0.27.1",
@@ -5878,7 +5885,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "aa40e09453618c7a927c08c5a990497a2954da7c2aaa6c65e0d4f0fc975f6114"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "log",
  "zerocopy 0.7.35",
 ]
@@ -5897,18 +5904,6 @@
 
 [[package]]
 name = "virtio-queue"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3f69a13d6610db9312acbb438b0390362af905d37634a2106be70c0f734986d"
-dependencies = [
- "log",
- "virtio-bindings",
- "vm-memory 0.14.1",
- "vmm-sys-util 0.12.1",
-]
-
-[[package]]
-name = "virtio-queue"
 version = "0.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "07d8406e7250c934462de585d8f2d2781c31819bca1fbb7c5e964ca6bbaabfe8"
@@ -5921,12 +5916,12 @@
 
 [[package]]
 name = "virtio-vsock"
-version = "0.5.0"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cac6563c0154c034d102324fc43cea7815140947217a418dce92c6797371c325"
+checksum = "f32bf3cad748b3004afe3afd860f060c4ec57f5ac329dd46f0b5bf8520244332"
 dependencies = [
  "virtio-bindings",
- "virtio-queue 0.11.0",
+ "virtio-queue 0.12.0",
  "vm-memory 0.14.1",
 ]
 
@@ -6090,7 +6085,7 @@
  "once_cell",
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
  "wasm-bindgen-shared",
 ]
 
@@ -6112,7 +6107,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -6154,7 +6149,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2f0a4bab6d420ee4a609b63ef4d5f9b5d309c6b93a029fccab70f2594c0cb3ae"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "downcast-rs",
  "io-lifetimes",
  "rustix",
@@ -6518,13 +6513,14 @@
 
 [[package]]
 name = "x509-cert"
-version = "0.2.4"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25eefca1d99701da3a57feb07e5079fc62abba059fc139e98c13bbb250f3ef29"
+checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94"
 dependencies = [
  "const-oid",
  "der",
  "spki",
+ "tls_codec",
 ]
 
 [[package]]
@@ -6575,11 +6571,11 @@
 
 [[package]]
 name = "zerocopy"
-version = "0.8.13"
+version = "0.8.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67914ab451f3bfd2e69e5e9d2ef3858484e7074d63f204fd166ec391b54de21d"
+checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468"
 dependencies = [
- "zerocopy-derive 0.8.13",
+ "zerocopy-derive 0.8.14",
 ]
 
 [[package]]
@@ -6590,18 +6586,18 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.8.13"
+version = "0.8.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7988d73a4303ca289df03316bc490e934accf371af6bc745393cf3c2c5c4f25d"
+checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1"
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
@@ -6621,7 +6617,7 @@
 dependencies = [
  "proc-macro2 1.0.92",
  "quote 1.0.37",
- "syn 2.0.90",
+ "syn 2.0.96",
 ]
 
 [[package]]
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index f75b612..1a53321 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -20,7 +20,7 @@
 arc-swap = "=1.7.1"
 argh = "=0.1.12"
 argh_derive = "=0.1.12"
-argh_shared = "=0.1.12"
+argh_shared = "=0.1.13"
 arrayvec = "=0.7.6"
 ash = "=0.37.3"
 async-stream = "=0.3.5"
@@ -37,11 +37,11 @@
 bindgen = "=0.69.5"
 bindgen-cli = "=0.69.5"
 bit_field = "=0.10.2"
-bitflags = "=2.6.0"
+bitflags = "=2.7.0"
 bitreader = "=0.3.11"
 bstr = "=1.3.0"
 buddy_system_allocator = "=0.11.0"
-bytemuck = "=1.20.0"
+bytemuck = "=1.21.0"
 bytemuck_derive = "=1.8.0"
 byteorder = "=1.5.0"
 bytes = "=1.9.0"
@@ -129,7 +129,7 @@
 gdbstub_arch = "=0.3.1"
 getrandom = "=0.2.15"
 glam = "=0.29.2"
-glob = "=0.3.1"
+glob = "=0.3.2"
 googletest = "=0.11.0"
 googletest_macro = "=0.13.0"
 gpio-cdev = "=0.6.0"
@@ -156,7 +156,7 @@
 inotify-sys = "=0.1.5"
 instant = "=0.1.12"
 intrusive-collections = "=0.9.7"
-itertools = "=0.13.0"
+itertools = "=0.14.0"
 itoa = "=1.0.14"
 jni = "=0.21.1"
 jni-sys = "=0.3.0"
@@ -175,7 +175,7 @@
 linked-hash-map = "=0.5.6"
 linkme = "=0.3.10"
 linkme-impl = "=0.3.10"
-litrs = "=0.3.0"
+litrs = "=0.4.1"
 lock_api = "=0.4.12"
 log = "=0.4.22"
 lru-cache = "=0.1.2"
@@ -187,7 +187,7 @@
 matchit = "=0.7.3"
 maybe-async = "=0.2.10"
 memchr = "=2.7.4"
-memmap2 = "=0.8.0"
+memmap2 = "=0.9.5"
 memoffset = "=0.9.0"
 merge = "=0.1.0"
 merge_derive = "=0.1.0"
@@ -201,12 +201,12 @@
 mls-rs-codec-derive = "=0.1.1"
 mls-rs-core = "=0.18.0"
 mls-rs-crypto-traits = "=0.10.0"
-mockall = "=0.12.1"
+mockall = "=0.13.1"
 mockall_derive = "=0.13.1"
 moveit = "=0.6.0"
 named-lock = "=0.3.0"
 nix = "=0.28.0"
-no-panic = "=0.1.32"
+no-panic = "=0.1.33"
 nom = "=7.1.3"
 num-bigint = "=0.4.4"
 num-complex = "=0.4.6"
@@ -216,20 +216,20 @@
 num_cpus = "=1.16.0"
 num_enum = "=0.7.3"
 num_enum_derive = "=0.7.3"
-octets = "=0.2.0"
+octets = "=0.3.0"
 once_cell = "=1.20.2"
 oneshot-uniffi = "=0.1.6"
 oorandom = "=11.1.4"
 open-enum = "=0.5.2"
 open-enum-derive = "=0.5.2"
-openssl-macros = "=0.1.0"
+openssl-macros = "=0.1.1"
 os_str_bytes = "=6.6.1"
 p9 = "=0.2.3"
 p9_wire_format_derive = "=0.2.3"
 parking_lot = "=0.12.3"
-parking_lot_core = "=0.9.9"
+parking_lot_core = "=0.9.10"
 paste = "=1.0.15"
-pathdiff = "=0.2.1"
+pathdiff = "=0.2.3"
 pdl-compiler = "=0.3.1"
 pdl-runtime = "=0.3.2"
 percent-encoding = "=2.3.1"
@@ -237,7 +237,7 @@
 pest = "=2.7.15"
 pest_derive = "=2.7.6"
 pest_generator = "=2.7.6"
-pest_meta = "=2.7.6"
+pest_meta = "=2.7.15"
 petgraph = "=0.6.5"
 pin-project = "=1.1.3"
 pin-project-internal = "=1.1.3"
@@ -247,11 +247,11 @@
 pkcs8 = "=0.10.2"
 plotters = "=0.3.5"
 plotters-backend = "=0.3.7"
-plotters-svg = "=0.3.5"
+plotters-svg = "=0.3.7"
 poll_token_derive = "=0.1.0"
 ppv-lite86 = "=0.2.17"
 predicates = "=3.0.4"
-predicates-core = "=1.0.6"
+predicates-core = "=1.0.9"
 predicates-tree = "=1.0.9"
 prettyplease = "=0.2.25"
 proc-macro2 = "=1.0.92"
@@ -309,9 +309,9 @@
 spki = "=0.7.3"
 static_assertions = "=1.1.0"
 strsim = "=0.11.1"
-strum = "=0.25.0"
+strum = "=0.26.3"
 strum_macros = "=0.26.2"
-syn = "=2.0.90"
+syn = "=2.0.96"
 syn-mid = "=0.6.0"
 sync_wrapper = "=1.0.2"
 synstructure = "=0.13.1"
@@ -319,8 +319,8 @@
 termcolor = "=1.4.1"
 termtree = "=0.4.1"
 textwrap = "=0.16.1"
-thiserror = "=2.0.6"
-thiserror-impl = "=2.0.6"
+thiserror = "=2.0.11"
+thiserror-impl = "=2.0.11"
 thread_local = "=1.1.8"
 threadpool = "=1.8.1"
 tikv-jemalloc-sys = "=0.5.4"
@@ -330,7 +330,7 @@
 tinyvec_macros = "=0.1.1"
 tokio = "=1.42.0"
 tokio-io-timeout = "=1.2.0"
-tokio-macros = "=2.4.0"
+tokio-macros = "=2.5.0"
 tokio-openssl = "=0.6.5"
 tokio-stream = "=0.1.17"
 tokio-test = "=0.4.2"
@@ -344,7 +344,7 @@
 tower-service = "=0.3.3"
 tracing = "=0.1.40"
 tracing-attributes = "=0.1.28"
-tracing-core = "=0.1.32"
+tracing-core = "=0.1.33"
 tracing-subscriber = "=0.3.19"
 try-lock = "=0.2.5"
 tungstenite = "=0.24.0"
@@ -358,7 +358,7 @@
 unicode-bidi = "=0.3.15"
 unicode-ident = "=1.0.8"
 unicode-normalization = "=0.1.24"
-unicode-segmentation = "=1.10.1"
+unicode-segmentation = "=1.12.0"
 unicode-width = "=0.1.11"
 unicode-xid = "=0.2.6"
 uniffi = "=0.27.1"
@@ -368,7 +368,7 @@
 uniffi_meta = "=0.27.1"
 unsafe-libyaml = "=0.2.11"
 untrusted = "=0.7.1"
-url = "=2.3.1"
+url = "=2.5.2"
 userfaultfd = "=0.8.1"
 userfaultfd-sys = "=0.5.0"
 utf-8 = "=0.7.6"
@@ -378,7 +378,7 @@
 virtio-bindings = "=0.2.2"
 virtio-drivers = "=0.7.4"
 virtio-queue = "=0.12.0"
-virtio-vsock = "=0.5.0"
+virtio-vsock = "=0.6.0"
 vm-memory = "=0.12.2"
 vmm-sys-util = "=0.12.1"
 vsock = "=0.5.0"
@@ -390,11 +390,11 @@
 webpki = "=0.22.4"
 which = "=4.4.0"
 winnow = "=0.5.37"
-x509-cert = "=0.2.4"
+x509-cert = "=0.2.5"
 xml-rs = "=0.8.19"
 yaml-rust = "=0.4.5"
-zerocopy = "=0.8.13"
-zerocopy-derive = "=0.8.13"
+zerocopy = "=0.8.14"
+zerocopy-derive = "=0.8.14"
 zeroize = "=1.8.1"
 zeroize_derive = "=1.4.2"
 zip = "=0.6.6"