json5-1.3.1/.cargo_vcs_info.json0000644000000001360000000000100120740ustar { "git": { "sha1": "6905ad2ea7b007a5742069e17742756be59ff090" }, "path_in_vcs": "" }json5-1.3.1/.gitignore000064400000000000000000000000411046102023000126470ustar 00000000000000/target Cargo.lock /benches/data json5-1.3.1/Cargo.lock0000644000000477430000000000100100660ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "aho-corasick" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "alloca" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" dependencies = [ "cc", ] [[package]] name = "anes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstyle" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "cast" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "ciborium" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", "serde", ] [[package]] name = "ciborium-io" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", ] [[package]] name = "clap" version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstyle", "clap_lex", ] [[package]] name = "clap_lex" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cpufeatures" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "criterion" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d883447757bb0ee46f233e9dc22eb84d93a9508c9b868687b274fc431d886bf" dependencies = [ "alloca", "anes", "cast", "ciborium", "clap", "criterion-plot", "itertools", "num-traits", "oorandom", "page_size", "plotters", "rayon", "regex", "serde", "serde_json", "tinytemplate", "walkdir", ] [[package]] name = "criterion-plot" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed943f81ea2faa8dcecbbfa50164acf95d555afec96a27871663b300e387b2e4" dependencies = [ "cast", "itertools", ] [[package]] name = "crossbeam-deque" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "find-msvc-tools" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "half" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", "zerocopy", ] [[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "indexmap" version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", "hashbrown", "serde", "serde_core", ] [[package]] name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "json-five" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56bf719068ddd382e66ee32cf044805aa8203bf9999b5af007bd0367fb681c4d" dependencies = [ "serde", "unicode-general-category", ] [[package]] name = "json5" version = "1.3.1" dependencies = [ "criterion", "indexmap", "json-five", "serde", "serde_bytes", "serde_derive", "serde_json", "serde_json5", "ucd-trie", ] [[package]] name = "libc" version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "memchr" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "oorandom" version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "page_size" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" dependencies = [ "libc", "winapi", ] [[package]] name = "pest" version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" dependencies = [ "memchr", "ucd-trie", ] [[package]] name = "pest_derive" version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" dependencies = [ "pest", "pest_generator", ] [[package]] name = "pest_generator" version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", "syn", ] [[package]] name = "pest_meta" version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" dependencies = [ "pest", "sha2", ] [[package]] name = "plotters" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] [[package]] name = "proc-macro2" version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] [[package]] name = "rayon" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "regex" version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "serde" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_bytes" version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", "serde_core", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", "serde_core", ] [[package]] name = "serde_json5" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d34d03f54462862f2a42918391c9526337f53171eaa4d8894562be7f252edd3" dependencies = [ "pest", "pest_derive", "serde", ] [[package]] name = "sha2" version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "syn" version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "tinytemplate" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ "serde", "serde_json", ] [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-general-category" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasm-bindgen" version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "zerocopy" version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", "syn", ] json5-1.3.1/Cargo.toml0000644000000032650000000000100101000ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2024" name = "json5" version = "1.3.1" authors = ["Callum Oakley "] build = false autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "A Rust JSON5 serializer and deserializer which speaks Serde." readme = "README.md" keywords = [ "json5", "parser", "serde", "json", "jsonc", ] license = "MIT" repository = "https://github.com/callum-oakley/json5-rs" [lib] name = "json5" path = "src/lib.rs" bench = false [[test]] name = "de" path = "tests/de.rs" [[test]] name = "ser" path = "tests/ser.rs" [[bench]] name = "de" path = "benches/de.rs" harness = false [[bench]] name = "json" path = "benches/json.rs" harness = false [[bench]] name = "ser" path = "benches/ser.rs" harness = false [dependencies.serde] version = "1" [dependencies.ucd-trie] version = "0.1.7" [dev-dependencies.criterion] version = "0.8.1" [dev-dependencies.indexmap] version = "2.12.1" features = ["serde"] [dev-dependencies.json-five] version = "0.3.0" [dev-dependencies.serde_bytes] version = "0.11.19" [dev-dependencies.serde_derive] version = "1" [dev-dependencies.serde_json] version = "1.0.145" [dev-dependencies.serde_json5] version = "0.2.1" json5-1.3.1/Cargo.toml.orig000064400000000000000000000013351046102023000135550ustar 00000000000000[package] name = "json5" version = "1.3.1" authors = ["Callum Oakley "] description = "A Rust JSON5 serializer and deserializer which speaks Serde." license = "MIT" repository = "https://github.com/callum-oakley/json5-rs" readme = "README.md" keywords = ["json5", "parser", "serde", "json", "jsonc"] edition = "2024" [dependencies] serde = "1" ucd-trie = "0.1.7" [dev-dependencies] criterion = "0.8.1" indexmap = { version = "2.12.1", features = ["serde"] } json-five = "0.3.0" serde_bytes = "0.11.19" serde_derive = "1" serde_json = "1.0.145" serde_json5 = "0.2.1" [lib] bench = false [[bench]] name = "ser" harness = false [[bench]] name = "de" harness = false [[bench]] name = "json" harness = false json5-1.3.1/LICENSE000064400000000000000000000020561046102023000116740ustar 00000000000000MIT License Copyright (c) 2025 Callum Oakley Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. json5-1.3.1/README.md000064400000000000000000000123061046102023000121450ustar 00000000000000# JSON5 [![crates.io](https://img.shields.io/crates/v/json5.svg)](https://crates.io/crates/json5) [![docs.rs](https://docs.rs/json5/badge.svg)](https://docs.rs/json5) [JSON5][] is a superset of [JSON][] with an expanded syntax including some productions from [ECMAScript 5.1][]. It aims to be easier to write and maintain by hand (e.g. for config files). It is not intended to be used for machine-to-machine communication, for which you'd be better served by [serde-rs/json][]. In particular, JSON5 allows comments, trailing commas, object keys without quotes, single quoted strings, hexadecimal numbers, multi-line strings... ```json5 { // comments unquoted: "and you can quote me on that", singleQuotes: 'I can use "double quotes" here', lineBreaks: "Look, Mom! \ No \\n's!", hexadecimal: 0xdecaf, leadingDecimalPoint: 0.8675309, andTrailing: 8675309, positiveSign: +1, trailingComma: "in objects", andIn: ["arrays"], backwardsCompatible: "with JSON", } ``` This crate provides functions for deserializing JSON5 text into a Rust datatype and for serializing a Rust datatype as JSON5 text, both via the [Serde framework][]. ## Deserialization Implementing `serde::Deserialize` on your type will allow you to parse JSON5 text into a value of that type with `from_str`. ```rust use serde_derive::Deserialize; #[derive(Debug, PartialEq, Deserialize)] struct Config<'a> { foo: u32, bar: &'a str, } let config: Config = json5::from_str(" { // Note unquoted keys, comments, and trailing commas. foo: 42, bar: 'baz', } ")?; assert_eq!(config, Config{ foo: 42, bar: "baz" }); ``` There are many ways to customize the deserialization (e.g. deserializing `camelCase` field names into a struct with `snake_case` fields). See the Serde docs, especially the [Attributes][], [Custom serialization][], and [Examples][] sections. ## Serialization Similarly, implementing `serde::Serialize` on a Rust type allows you to produce a JSON5 serialization of values of that type with `to_string` or `to_writer`. The serializer will omit quotes around object keys where possible and will indent nested objects and arrays, but is otherwise fairly basic. ```rust use serde_derive::Serialize; #[derive(Serialize)] struct Config<'a> { foo: u32, bar: &'a str, } let config = Config { foo: 42, bar: "baz", }; assert_eq!(&json5::to_string(&config)?, "{ foo: 42, bar: \"baz\", }"); ``` There are many ways to customize the serialization (e.g. serializing `snake_case` struct fields as `camelCase`). See the Serde docs, especially the [Attributes][], [Custom serialization][] and [Examples][] sections. ## Byte arrays All the types of the [Serde data model][] are supported. Byte arrays are encoded as hex strings. e.g. ```rust use serde_bytes::{Bytes, ByteBuf}; let s = json5::to_string(&Bytes::new(b"JSON5"))?; assert_eq!(&s, "\"4a534f4e35\""); assert_eq!(json5::from_str::(&s)?, ByteBuf::from("JSON5")); ``` ## Benchmarks There's a [criterion][] benchmark in [benches](benches) comparing performance against [serde-rs/json][], [spyoungtech/json-five-rs][], and [google/serde_json5][] (which is based on a fork of an earlier version of this library). Throughput on my machine at the time of writing is summarised below. Higher is better. | crate | small | medium | large | |--------------------------|--------------|--------------|--------------| | serde-rs/json | 513.51 MiB/s | 519.16 MiB/s | 511.84 MiB/s | | callum-oakley/json5-rs | 227.47 MiB/s | 220.99 MiB/s | 224.51 MiB/s | | spyoungtech/json-five-rs | 105.36 MiB/s | 107.08 MiB/s | 106.45 MiB/s | | google/serde_json5 | 11.500 MiB/s | 11.581 MiB/s | 10.438 MiB/s | ![](./benches/throughput.svg) ## Project goals and non-goals - Goal: Strict adherence to [the specification][]. If you find some way the implementation deviates from the spec then please open an issue! - Non-goal: I'm not interested in supporting extensions or relaxations of the spec, even if they're gated behind an option. It comes at the cost of code complexity and expands the scope of the project to "anything that looks a bit like JSON5". - Goal: "Reasonable" performance given the target use case of deserializing configuration files (not e.g. message passing). - Non-goal: Performance in line with [serde-rs/json][]. Lots of work has gone in to making Serde JSON as fast as it is. I'm content to have a simpler codebase and sacrifice some performance (e.g. by working with chars instead of bytes). ## Contributing Please open an issue rather than a pull request. [Attributes]: https://serde.rs/attributes.html [criterion]: https://github.com/criterion-rs/criterion.rs [Custom serialization]: https://serde.rs/custom-serialization.html [ECMAScript 5.1]: https://www.ecma-international.org/ecma-262/5.1/ [Examples]: https://serde.rs/examples.html [google/serde_json5]: https://github.com/google/serde_json5 [JSON]: https://www.json.org/json-en.html [JSON5]: https://json5.org/ [Serde data model]: https://serde.rs/data-model.html#types [Serde framework]: https://serde.rs/ [serde-rs/json]: https://github.com/serde-rs/json [spyoungtech/json-five-rs]: https://github.com/spyoungtech/json-five-rs [the specification]: https://spec.json5.org/ json5-1.3.1/benches/de.rs000064400000000000000000000021651046102023000132350ustar 00000000000000use criterion::{ AxisScale, BenchmarkId, Criterion, PlotConfiguration, Throughput, criterion_group, criterion_main, }; use serde_json::Value; fn criterion_benchmark(c: &mut Criterion) { // JSON5 strings to deserialize let data = ["small.json", "medium.json", "large.json"].map(|file| { ( file, json5::to_string( &json5::from_str::( &std::fs::read_to_string(format!("benches/data/{file}")).unwrap(), ) .unwrap(), ) .unwrap(), ) }); let mut group = c.benchmark_group("de"); group.plot_config(PlotConfiguration::default().summary_scale(AxisScale::Logarithmic)); for (file, input) in data { group.sample_size(10); group.throughput(Throughput::Bytes(u64::try_from(input.len()).unwrap())); group.bench_with_input(BenchmarkId::from_parameter(file), &input, |b, input| { b.iter(|| json5::from_str::(input).unwrap()); }); } group.finish(); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); json5-1.3.1/benches/json.rs000064400000000000000000000033321046102023000136130ustar 00000000000000use criterion::{ AxisScale, BenchmarkId, Criterion, PlotConfiguration, Throughput, criterion_group, criterion_main, }; use serde_json::Value; fn criterion_benchmark(c: &mut Criterion) { // JSON strings to deserialize let data = ["small.json", "medium.json", "large.json"].map(|file| { ( file, std::fs::read_to_string(format!("benches/data/{file}")).unwrap(), ) }); let mut group = c.benchmark_group("json"); group.plot_config(PlotConfiguration::default().summary_scale(AxisScale::Logarithmic)); for (file, input) in data { group.sample_size(10); group.throughput(Throughput::Bytes(u64::try_from(input.len()).unwrap())); group.bench_with_input( BenchmarkId::new("callum-oakley/json5-rs", file), &input, |b, input| { b.iter(|| json5::from_str::(input).unwrap()); }, ); group.bench_with_input( BenchmarkId::new("serde-rs/json", file), &input, |b, input| { b.iter(|| serde_json::from_str::(input).unwrap()); }, ); group.bench_with_input( BenchmarkId::new("spyoungtech/json-five-rs", file), &input, |b, input| { b.iter(|| json_five::from_str::(input).unwrap()); }, ); group.bench_with_input( BenchmarkId::new("google/serde_json5", file), &input, |b, input| { b.iter(|| serde_json5::from_str::(input).unwrap()); }, ); } group.finish(); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); json5-1.3.1/benches/ser.rs000064400000000000000000000021051046102023000134300ustar 00000000000000use criterion::{ AxisScale, BenchmarkId, Criterion, PlotConfiguration, Throughput, criterion_group, criterion_main, }; use serde_json::Value; fn criterion_benchmark(c: &mut Criterion) { // Values to serialize let data = ["small.json", "medium.json", "large.json"].map(|file| { ( file, json5::from_str::( &std::fs::read_to_string(format!("benches/data/{file}")).unwrap(), ) .unwrap(), ) }); let mut group = c.benchmark_group("ser"); group.plot_config(PlotConfiguration::default().summary_scale(AxisScale::Logarithmic)); for (file, input) in data { group.sample_size(10); group.throughput(Throughput::Bytes( u64::try_from(json5::to_string(&input).unwrap().len()).unwrap(), )); group.bench_with_input(BenchmarkId::from_parameter(file), &input, |b, input| { b.iter(|| json5::to_string(&input).unwrap()); }); } group.finish(); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); json5-1.3.1/benches/throughput.svg000064400000000000000000000371211046102023000152310ustar 00000000000000 Gnuplot Produced by GNUPLOT 6.0 patchlevel 3 10 100 1000 1000 10000 100000 1x106 callum-oakley/json5-rs callum-oakley/json5-rs gnuplot_plot_2 google/serde_json5 google/serde_json5 gnuplot_plot_4 serde-rs/json serde-rs/json gnuplot_plot_6 spyoungtech/json-five-rs spyoungtech/json-five-rs gnuplot_plot_8 Average throughput (MiB/s) Input Size (Bytes) from_str: Comparison json5-1.3.1/jogfile000064400000000000000000000006121046102023000122250ustar 00000000000000setup-benches dir="benches/data" rm -rf "${dir}" mkdir -p "${dir}" cd "${dir}" || exit curl -fsSLo small.json 'https://api.github.com/repos/callum-oakley/json5-rs/commits?per_page=1' curl -fsSLo medium.json 'https://api.github.com/repos/callum-oakley/json5-rs/commits?per_page=10' curl -fsSLo large.json 'https://api.github.com/repos/callum-oakley/json5-rs/commits?per_page=100' json5-1.3.1/src/char.rs000064400000000000000000000040771046102023000127460ustar 00000000000000use crate::unicode::{ CONNECTOR_PUNCTUATION, DECIMAL_NUMBER, LETTER_NUMBER, LOWERCASE_LETTER, MODIFIER_LETTER, NONSPACING_MARK, OTHER_LETTER, SPACE_SEPARATOR, SPACING_MARK, TITLECASE_LETTER, UPPERCASE_LETTER, }; /// This is NOT the same as [`char::is_whitespace`]. /// /// #[must_use] pub fn is_json5_whitespace(c: char) -> bool { matches!( c, '\u{0009}'..='\u{000D}' | '\u{0020}' | '\u{00A0}' | '\u{2028}' | '\u{2029}' | '\u{FEFF}' ) || SPACE_SEPARATOR.contains_char(c) } /// #[must_use] pub fn is_json5_line_terminator(c: char) -> bool { matches!(c, '\u{000A}' | '\u{000D}' | '\u{2028}' | '\u{2029}') } /// #[must_use] pub fn is_json5_identifier_start(c: char) -> bool { matches!(c, '$' | '_') || UPPERCASE_LETTER.contains_char(c) || LOWERCASE_LETTER.contains_char(c) || TITLECASE_LETTER.contains_char(c) || MODIFIER_LETTER.contains_char(c) || OTHER_LETTER.contains_char(c) || LETTER_NUMBER.contains_char(c) } /// #[must_use] pub fn is_json5_identifier(c: char) -> bool { is_json5_identifier_start(c) || matches!(c, '\u{200C}' | '\u{200D}') || NONSPACING_MARK.contains_char(c) || SPACING_MARK.contains_char(c) || DECIMAL_NUMBER.contains_char(c) || CONNECTOR_PUNCTUATION.contains_char(c) } /// #[must_use] pub fn escape(delimeter: char, c: char) -> Option<&'static str> { match c { '"' if delimeter == '"' => Some(r#"\""#), '\'' if delimeter == '\'' => Some(r"\'"), '\\' => Some(r"\\"), '\n' => Some(r"\n"), '\r' => Some(r"\r"), // '\u{2028}' and '\u{2029}' don't strictly *need* to be escaped, but the spec recommends // that they *should* be. '\u{2028}' => Some(r"\u2028"), '\u{2029}' => Some(r"\u2029"), _ => None, } } json5-1.3.1/src/de.rs000064400000000000000000001043161046102023000124160ustar 00000000000000use std::{ fmt::Display, iter::Peekable, ops::Deref, str::{CharIndices, FromStr}, }; use serde::{Deserialize, de::Visitor, forward_to_deserialize_any}; use crate::error::{Error, ErrorCode, Position, Result}; /// Parse a JSON5 string and map it to a type implementing [`Deserialize`]. /// /// # Example /// ``` /// use serde_derive::Deserialize; /// /// #[derive(Debug, PartialEq, Deserialize)] /// struct Config<'a> { /// foo: u32, /// bar: &'a str, /// } /// /// let config: Config = json5::from_str(" /// { /// // Note unquoted keys, comments, and trailing commas. /// foo: 42, /// bar: 'baz', /// } /// ")?; /// /// assert_eq!(config, Config{ foo: 42, bar: "baz" }); /// # Ok::<(), json5::Error>(()) /// ``` /// /// # Errors /// Fails if the JSON5 is malformed or we can't map it to a `T`. pub fn from_str<'de, T: Deserialize<'de>>(input: &'de str) -> Result { let mut deserializer = Deserializer::from_str(input); let t = T::deserialize(&mut deserializer)?; deserializer.skip_whitespace()?; match deserializer.peek() { Some((offset, _)) => Err(deserializer.err_at(offset, ErrorCode::TrailingCharacters)), None => Ok(t), } } /// A deserializer that knows how to parse JSON5 and map it on to types implementing /// [`Deserialize`]. pub struct Deserializer<'de> { input: &'de str, char_indices: Peekable>, } impl<'de> Deserializer<'de> { /// Construct a deserializer that will read from the given JSON5 string. #[expect( clippy::should_implement_trait, reason = "Serde convention: https://serde.rs/conventions.html" )] #[must_use] pub fn from_str(input: &'de str) -> Self { Self { input, char_indices: input.char_indices().peekable(), } } } impl<'de> Deserializer<'de> { fn next(&mut self) -> Option<(usize, char)> { self.char_indices.next() } fn peek(&mut self) -> Option<(usize, char)> { self.char_indices.peek().copied() } fn next_or(&mut self, eof: ErrorCode) -> Result<(usize, char)> { self.next().ok_or_else(|| Error::new(eof)) } fn peek_or(&mut self, eof: ErrorCode) -> Result<(usize, char)> { self.peek().ok_or_else(|| Error::new(eof)) } fn expect_char( &mut self, expected: char, eof: ErrorCode, unexpected: ErrorCode, ) -> Result { let (offset, c) = self.next_or(eof)?; if c != expected { return Err(self.err_at(offset, unexpected)); } Ok(offset) } fn expect_str( &mut self, expected: &str, eof: ErrorCode, unexpected: ErrorCode, ) -> Result { let mut chars = expected.chars(); let offset = self.expect_char( chars.next().expect("expecting at least one character"), eof, unexpected, )?; for e in chars { self.expect_char(e, eof, unexpected)?; } Ok(offset) } fn expect_collection_end( &mut self, close: char, eof: ErrorCode, unexpected: ErrorCode, ) -> Result<()> { self.skip_whitespace()?; let (offset, c) = self.next_or(eof)?; match c { c if c == close => Ok(()), ',' => { self.skip_whitespace()?; self.expect_char(close, eof, unexpected)?; Ok(()) } _ => Err(self.err_at(offset, unexpected)), } } // https://spec.json5.org/#white-space fn skip_whitespace(&mut self) -> Result<()> { while let Some((_, c)) = self.peek() { match c { _ if crate::char::is_json5_whitespace(c) => { self.next(); } '/' => { self.next(); self.skip_comment()?; } _ => { break; } } } Ok(()) } // https://spec.json5.org/#comments fn skip_comment(&mut self) -> Result<()> { let (offset, c) = self.next_or(ErrorCode::EofParsingComment)?; match c { '/' => { while let Some((_, c)) = self.next() { if crate::char::is_json5_line_terminator(c) { break; } } } '*' => { while let Some((_, c)) = self.next() { if c == '*' && self.peek().is_some_and(|(_, c)| c == '/') { self.next(); break; } } } _ => { return Err(self.err_at(offset, ErrorCode::ExpectedComment)); } } Ok(()) } fn parse_null(&mut self) -> Result { self.skip_whitespace()?; let (offset, _) = self.peek_or(ErrorCode::EofParsingNull)?; self.expect_str("null", ErrorCode::EofParsingNull, ErrorCode::ExpectedNull)?; Ok(offset) } fn parse_bool(&mut self) -> Result<(usize, bool)> { self.skip_whitespace()?; match self.next_or(ErrorCode::EofParsingBool)? { (offset, 't') => { self.expect_str("rue", ErrorCode::EofParsingBool, ErrorCode::ExpectedBool)?; Ok((offset, true)) } (offset, 'f') => { self.expect_str("alse", ErrorCode::EofParsingBool, ErrorCode::ExpectedBool)?; Ok((offset, false)) } (offset, _) => Err(self.err_at(offset, ErrorCode::ExpectedBool)), } } // https://spec.json5.org/#numbers fn parse_number(&mut self) -> Result<(usize, NumberResult)> { self.skip_whitespace()?; let (start, _) = self.peek_or(ErrorCode::EofParsingNumber)?; let neg = match self.peek_or(ErrorCode::EofParsingNumber)? { (_, '+') => { self.next(); false } (_, '-') => { self.next(); true } _ => false, }; match self.next_or(ErrorCode::EofParsingNumber)? { (_, 'I') => { self.expect_str( "nfinity", ErrorCode::EofParsingNumber, ErrorCode::ExpectedNumber, )?; if neg { Ok((start, NumberResult::F64(-f64::INFINITY))) } else { Ok((start, NumberResult::F64(f64::INFINITY))) } } (_, 'N') => { self.expect_str("aN", ErrorCode::EofParsingNumber, ErrorCode::ExpectedNumber)?; if neg { Ok((start, NumberResult::F64(-f64::NAN))) } else { Ok((start, NumberResult::F64(f64::NAN))) } } (_, '0') => match self.peek() { Some((_, 'x' | 'X')) => { self.next(); self.parse_hex_number(neg, start).map(|n| (start, n)) } Some((offset, '.' | 'e' | 'E')) => self .parse_decimal_number(neg, start, offset) .map(|n| (start, n)), Some((_, '0'..='9')) => Err(self.err_at(start, ErrorCode::LeadingZero)), _ => Ok((start, NumberResult::U128(0))), }, (offset, '.' | '1'..='9') => self .parse_decimal_number(neg, start, offset) .map(|n| (start, n)), (offset, _) => Err(self.err_at(offset, ErrorCode::ExpectedNumber)), } } // Aside from the representation of Infinity, NaN, and hex numbers, which are handled in // parse_number, the f64, i64, and u64 implementations of FromStr implement exactly the format // we need. fn parse_decimal_number( &mut self, neg: bool, start: usize, mut offset: usize, ) -> Result { while let Some((o, c)) = self.peek() && matches!(c, '+' | '-' | '.' | 'e' | 'E' | '0'..='9') { self.next(); offset = o; } if self.input[start..=offset].contains(['.', 'e', 'E']) { // https://doc.rust-lang.org/std/primitive.f64.html#method.from_str Ok(NumberResult::F64(self.parse_from_str(start, offset)?)) } else if neg { // https://doc.rust-lang.org/std/primitive.i64.html#method.from_str Ok(NumberResult::I128(self.parse_from_str(start, offset)?)) } else { // https://doc.rust-lang.org/std/primitive.u64.html#method.from_str Ok(NumberResult::U128(self.parse_from_str(start, offset)?)) } } fn parse_from_str(&self, start: usize, offset: usize) -> Result where N: FromStr, N::Err: Display, { self.input[start..=offset] .parse() .map_err(|err: N::Err| self.custom_err_at(start, err)) } fn parse_hex_number(&mut self, neg: bool, start: usize) -> Result { let (offset, c) = self.next_or(ErrorCode::EofParsingNumber)?; if !c.is_ascii_hexdigit() { return Err(self.err_at(offset, ErrorCode::ExpectedNumber)); } let mut n = u128::from(c.to_digit(16).expect("c is ascii hexdigit")); while let Some((offset, c)) = self.peek() && c.is_ascii_hexdigit() { self.next(); n = n .checked_mul(16) .and_then(|n| { n.checked_add(u128::from(c.to_digit(16).expect("c is ascii hexdigit"))) }) .ok_or(self.err_at(offset, ErrorCode::OverflowParsingNumber))?; } if neg { // Special case for i128::MIN because -i128::MIN = i128::MAX + 1 doesn't fit in an i128. if n == 0x8000_0000_0000_0000_0000_0000_0000_0000 { Ok(NumberResult::I128(i128::MIN)) } else { Ok(NumberResult::I128( -i128::try_from(n).map_err(|err| self.custom_err_at(start, err))?, )) } } else { Ok(NumberResult::U128(n)) } } // https://spec.json5.org/#strings fn parse_string(&mut self) -> Result<(usize, StringResult<'de>)> { self.skip_whitespace()?; let (offset, c) = self.next_or(ErrorCode::EofParsingString)?; if c == '"' || c == '\'' { self.parse_string_characters(c).map(|s| (offset, s)) } else { Err(self.err_at(offset, ErrorCode::ExpectedString)) } } fn parse_string_characters(&mut self, delimiter: char) -> Result> { let mut owned = None; let (start, _) = self.peek_or(ErrorCode::EofParsingString)?; loop { let (offset, c) = self.next_or(ErrorCode::EofParsingString)?; if c == delimiter { if let Some(owned) = owned { return Ok(StringResult::Owned(owned)); } return Ok(StringResult::Borrowed(&self.input[start..offset])); } else if c == '\u{000A}' || c == '\u{000D}' { // LineTerminator is forbidden except U+2028 and U+2029 are explicitly allowed. return Err(self.err_at(offset, ErrorCode::LineTerminatorInString)); } else if c == '\\' { let owned = owned.get_or_insert(self.input[start..offset].to_owned()); if let Some(c) = self.parse_escape_sequence(offset)? { owned.push(c); } } else if let Some(owned) = &mut owned { owned.push(c); } } } // https://262.ecma-international.org/5.1/#sec-7.8.4 fn parse_escape_sequence(&mut self, offset: usize) -> Result> { let (_, c) = self.next_or(ErrorCode::EofParsingEscapeSequence)?; match c { // LineTerminatorSequence _ if crate::char::is_json5_line_terminator(c) => { if c == '\u{000D}' && self.peek().is_some_and(|(_, c)| c == '\u{000A}') { self.next(); } Ok(None) } // SingleEscapeCharacter (Table 4 — String Single Character Escape Sequences) 'b' => Ok(Some('\u{0008}')), 't' => Ok(Some('\u{0009}')), 'n' => Ok(Some('\u{000A}')), 'v' => Ok(Some('\u{000B}')), 'f' => Ok(Some('\u{000C}')), 'r' => Ok(Some('\u{000D}')), '0' => { if self.peek().is_some_and(|(_, c)| c.is_ascii_digit()) { return Err(self.err_at(offset, ErrorCode::InvalidEscapeSequence)); } Ok(Some('\u{0000}')) } '1'..'9' => Err(self.err_at(offset, ErrorCode::InvalidEscapeSequence)), 'x' => Ok(Some(self.parse_hex_escape_sequence(offset)?)), 'u' => Ok(Some(self.parse_unicode_escape_sequence(offset)?)), c => Ok(Some(c)), } } fn parse_hex_escape_sequence(&mut self, offset: usize) -> Result { char::try_from(self.parse_escape_sequence_digits(offset, 2)?) .map_err(|err| self.custom_err_at(offset, err)) } fn parse_unicode_escape_sequence(&mut self, offset: usize) -> Result { let a = self.parse_escape_sequence_digits(offset, 4)?; if let Ok(c) = char::try_from(a) { return Ok(c); } // "To escape an extended character that is not in the Basic Multilingual Plane, the // character is represented as a 12-character sequence, encoding the UTF-16 surrogate pair." // – https://spec.json5.org/#escapes self.expect_str( "\\u", ErrorCode::EofParsingEscapeSequence, ErrorCode::InvalidEscapeSequence, )?; let b = self.parse_escape_sequence_digits(offset, 4)?; let mut chars = char::decode_utf16([ u16::try_from(a).map_err(|err| self.custom_err_at(offset, err))?, u16::try_from(b).map_err(|err| self.custom_err_at(offset, err))?, ]); let c = chars .next() .ok_or_else(|| self.err_at(offset, ErrorCode::InvalidEscapeSequence))? .map_err(|err| self.custom_err_at(offset, err))?; if chars.next().is_none() { Ok(c) } else { Err(self.err_at(offset, ErrorCode::InvalidEscapeSequence)) } } fn parse_escape_sequence_digits(&mut self, offset: usize, length: usize) -> Result { let mut value = 0; for _ in 0..length { let (_, c) = self.next_or(ErrorCode::EofParsingEscapeSequence)?; if !c.is_ascii_hexdigit() { return Err(self.err_at(offset, ErrorCode::InvalidEscapeSequence)); } value = value * 16 + c.to_digit(16).expect("c.is_ascii_hexdigit"); } Ok(value) } // https://spec.json5.org/#objects fn parse_key(&mut self) -> Result<(usize, StringResult<'de>)> { self.skip_whitespace()?; match self.peek_or(ErrorCode::EofParsingObject)? { (_, '"' | '\'') => self.parse_string(), (offset, _) => self.parse_identifier().map(|i| (offset, i)), } } // https://262.ecma-international.org/5.1/#sec-7.6 fn parse_identifier(&mut self) -> Result> { let mut owned = None; let (start, _) = self.peek_or(ErrorCode::EofParsingIdentifier)?; loop { let (offset, c) = self.peek_or(ErrorCode::EofParsingIdentifier)?; if c == '\\' { self.next(); let owned = owned.get_or_insert(self.input[start..offset].to_owned()); self.expect_char( 'u', ErrorCode::EofParsingIdentifier, ErrorCode::InvalidEscapeSequence, )?; let c = self.parse_unicode_escape_sequence(offset)?; if offset == start { if !crate::char::is_json5_identifier_start(c) { return Err(self.err_at(offset, ErrorCode::ExpectedIdentifier)); } } else if !crate::char::is_json5_identifier(c) { return Err(self.err_at(offset, ErrorCode::ExpectedIdentifier)); } owned.push(c); continue; } if offset == start { if !crate::char::is_json5_identifier_start(c) { return Err(self.err_at(offset, ErrorCode::ExpectedIdentifier)); } } else if !crate::char::is_json5_identifier(c) { return Ok(match owned { Some(owned) => StringResult::Owned(owned), None => StringResult::Borrowed(&self.input[start..offset]), }); } self.next(); if let Some(owned) = &mut owned { owned.push(c); } } } fn decode_hex(&self, offset: usize, s: &str) -> Result> { let mut chars = s.chars(); let mut bytes = Vec::new(); while let Some(a) = chars.next() { match a .to_digit(16) .and_then(|a| chars.next().and_then(|b| b.to_digit(16)).map(|b| (a, b))) { Some((a, b)) => { bytes.push(u8::try_from(a * 16 + b).expect("two hex digits fit in a u8")); } None => return Err(self.err_at(offset, ErrorCode::InvalidBytes)), } } Ok(bytes) } fn err_at(&self, offset: usize, code: ErrorCode) -> Error { Error::new_at(Position::from_offset(offset, self.input), code) } fn custom_err_at(&self, offset: usize, msg: T) -> Error { Error::custom_at(Position::from_offset(offset, self.input), msg) } fn with_position(&self, err: Error, offset: usize) -> Error { err.with_position(Position::from_offset(offset, self.input)) } } macro_rules! deserialize_number { ($method:ident) => { fn $method>(self, visitor: V) -> Result { let (offset, number) = self.parse_number()?; match number { NumberResult::U128(u) => { if let Ok(u) = u64::try_from(u) { visitor.visit_u64(u) } else { visitor.visit_u128(u) } } NumberResult::I128(i) => { if let Ok(i) = i64::try_from(i) { visitor.visit_i64(i) } else { visitor.visit_i128(i) } } NumberResult::F64(f) => visitor.visit_f64(f), } .map_err(|err| self.with_position(err, offset)) } }; } macro_rules! deserialize_string { ($method:ident) => { fn $method>(self, visitor: V) -> Result { let (offset, s) = self.parse_string()?; match s { StringResult::Borrowed(borrowed) => visitor.visit_borrowed_str(borrowed), StringResult::Owned(owned) => visitor.visit_string(owned), } .map_err(|err| self.with_position(err, offset)) } }; } macro_rules! deserialize_bytes { ($method:ident) => { fn $method>(self, visitor: V) -> Result { let (offset, s) = self.parse_string()?; visitor .visit_byte_buf(self.decode_hex(offset, &s)?) .map_err(|err| self.with_position(err, offset)) } }; } macro_rules! deserialize_collection { ( $method:ident, $visit:ident, $access:ident, $open:expr, $close:expr, $eof:expr, $expected_opening:expr, $expected_closing:expr, ) => { fn $method>(self, visitor: V) -> Result { self.skip_whitespace()?; let offset = self.expect_char($open, $eof, $expected_opening)?; let value = visitor .$visit($access { de: self, first: true, }) .map_err(|err| self.with_position(err, offset))?; self.expect_collection_end($close, $eof, $expected_closing)?; Ok(value) } }; } impl<'de> serde::de::Deserializer<'de> for &mut Deserializer<'de> { type Error = Error; deserialize_number!(deserialize_u8); deserialize_number!(deserialize_u16); deserialize_number!(deserialize_u32); deserialize_number!(deserialize_u64); deserialize_number!(deserialize_u128); deserialize_number!(deserialize_i8); deserialize_number!(deserialize_i16); deserialize_number!(deserialize_i32); deserialize_number!(deserialize_i64); deserialize_number!(deserialize_i128); deserialize_number!(deserialize_f32); deserialize_number!(deserialize_f64); deserialize_string!(deserialize_str); deserialize_string!(deserialize_string); deserialize_string!(deserialize_char); deserialize_string!(deserialize_identifier); deserialize_bytes!(deserialize_bytes); deserialize_bytes!(deserialize_byte_buf); deserialize_collection!( deserialize_seq, visit_seq, SeqAccess, '[', ']', ErrorCode::EofParsingArray, ErrorCode::ExpectedOpeningBracket, ErrorCode::ExpectedClosingBracket, ); deserialize_collection!( deserialize_map, visit_map, MapAccess, '{', '}', ErrorCode::EofParsingObject, ErrorCode::ExpectedOpeningBrace, ErrorCode::ExpectedClosingBrace, ); fn deserialize_bool>(self, visitor: V) -> Result { let (offset, b) = self.parse_bool()?; visitor .visit_bool(b) .map_err(|err| self.with_position(err, offset)) } fn deserialize_option>(self, visitor: V) -> Result { self.skip_whitespace()?; let (offset, c) = self.peek_or(ErrorCode::EofParsingValue)?; if c == 'n' { self.parse_null()?; visitor.visit_none() } else { visitor.visit_some(&mut *self) } .map_err(|err| self.with_position(err, offset)) } fn deserialize_unit>(self, visitor: V) -> Result { let offset = self.parse_null()?; visitor .visit_unit() .map_err(|err| self.with_position(err, offset)) } fn deserialize_unit_struct>( self, _: &'static str, visitor: V, ) -> Result { self.deserialize_unit(visitor) } fn deserialize_newtype_struct>( self, _: &'static str, visitor: V, ) -> Result { visitor.visit_newtype_struct(self) } fn deserialize_tuple>(self, _: usize, visitor: V) -> Result { self.deserialize_seq(visitor) } fn deserialize_tuple_struct>( self, _: &'static str, _: usize, visitor: V, ) -> Result { self.deserialize_seq(visitor) } fn deserialize_struct>( self, _: &'static str, _: &'static [&'static str], visitor: V, ) -> Result { self.deserialize_map(visitor) } fn deserialize_enum>( self, _: &'static str, _: &'static [&'static str], visitor: V, ) -> Result { self.skip_whitespace()?; match self.peek_or(ErrorCode::EofParsingValue)? { (offset, '{') => { self.next(); let value = visitor .visit_enum(VariantAccess { de: self }) .map_err(|err| self.with_position(err, offset))?; self.expect_collection_end( '}', ErrorCode::EofParsingObject, ErrorCode::ExpectedClosingBrace, )?; Ok(value) } (offset, '"' | '\'') => visitor .visit_enum(UnitVariantAccess { de: self, map_key: false, }) .map_err(|err| self.with_position(err, offset)), (c, _) => Err(self.err_at(c, ErrorCode::ExpectedStringOrObject)), } } fn deserialize_any>(self, visitor: V) -> Result { self.skip_whitespace()?; match self.peek_or(ErrorCode::EofParsingValue)? { (_, 'n') => self.deserialize_unit(visitor), (_, 't' | 'f') => self.deserialize_bool(visitor), (_, '"' | '\'') => self.deserialize_str(visitor), (_, '+' | '-' | '.' | 'I' | 'N' | '0'..='9') => self.deserialize_f64(visitor), (_, '[') => self.deserialize_seq(visitor), (_, '{') => self.deserialize_map(visitor), (offset, _) => Err(self.err_at(offset, ErrorCode::ExpectedValue)), } } fn deserialize_ignored_any>(self, visitor: V) -> Result { self.deserialize_any(visitor) } } struct SeqAccess<'a, 'de: 'a> { de: &'a mut Deserializer<'de>, first: bool, } impl<'de> serde::de::SeqAccess<'de> for SeqAccess<'_, 'de> { type Error = Error; fn next_element_seed(&mut self, seed: T) -> Result> where T: serde::de::DeserializeSeed<'de>, { self.de.skip_whitespace()?; if self.de.peek().is_some_and(|(_, c)| c == ']') { return Ok(None); } if !self.first { self.de .expect_char(',', ErrorCode::EofParsingArray, ErrorCode::ExpectedComma)?; self.de.skip_whitespace()?; if self.de.peek().is_some_and(|(_, c)| c == ']') { return Ok(None); } } self.first = false; seed.deserialize(&mut *self.de).map(Some) } } struct MapAccess<'a, 'de: 'a> { de: &'a mut Deserializer<'de>, first: bool, } impl<'de> serde::de::MapAccess<'de> for MapAccess<'_, 'de> { type Error = Error; fn next_key_seed(&mut self, seed: K) -> Result> where K: serde::de::DeserializeSeed<'de>, { self.de.skip_whitespace()?; if self.de.peek().is_some_and(|(_, c)| c == '}') { return Ok(None); } if !self.first { self.de .expect_char(',', ErrorCode::EofParsingObject, ErrorCode::ExpectedComma)?; self.de.skip_whitespace()?; if self.de.peek().is_some_and(|(_, c)| c == '}') { return Ok(None); } } self.first = false; seed.deserialize(MapKey { de: self.de }).map(Some) } fn next_value_seed(&mut self, seed: V) -> Result where V: serde::de::DeserializeSeed<'de>, { self.de.skip_whitespace()?; self.de .expect_char(':', ErrorCode::EofParsingObject, ErrorCode::ExpectedColon)?; seed.deserialize(&mut *self.de) } } struct MapKey<'a, 'de: 'a> { de: &'a mut Deserializer<'de>, } macro_rules! deserialize_key_from_str { ($method:ident, $visit:ident) => { fn $method>(self, visitor: V) -> Result { let (offset, key) = self.de.parse_key()?; visitor .$visit(from_str(&key)?) .map_err(|err| self.de.with_position(err, offset)) } }; } macro_rules! deserialize_string_key { ($method:ident) => { fn $method>(self, visitor: V) -> Result { let (offset, key) = self.de.parse_key()?; match key { StringResult::Borrowed(borrowed) => visitor.visit_borrowed_str(borrowed), StringResult::Owned(owned) => visitor.visit_string(owned), } .map_err(|err| self.de.with_position(err, offset)) } }; } macro_rules! deserialize_bytes_key { ($method:ident) => { fn $method>(self, visitor: V) -> Result { let (offset, s) = self.de.parse_key()?; visitor .visit_byte_buf(self.de.decode_hex(offset, &s)?) .map_err(|err| self.de.with_position(err, offset)) } }; } impl<'de> serde::de::Deserializer<'de> for MapKey<'_, 'de> { type Error = Error; deserialize_key_from_str!(deserialize_bool, visit_bool); deserialize_key_from_str!(deserialize_u8, visit_u8); deserialize_key_from_str!(deserialize_u16, visit_u16); deserialize_key_from_str!(deserialize_u32, visit_u32); deserialize_key_from_str!(deserialize_u64, visit_u64); deserialize_key_from_str!(deserialize_u128, visit_u128); deserialize_key_from_str!(deserialize_i8, visit_i8); deserialize_key_from_str!(deserialize_i16, visit_i16); deserialize_key_from_str!(deserialize_i32, visit_i32); deserialize_key_from_str!(deserialize_i64, visit_i64); deserialize_key_from_str!(deserialize_i128, visit_i128); deserialize_key_from_str!(deserialize_f32, visit_f32); deserialize_key_from_str!(deserialize_f64, visit_f64); deserialize_string_key!(deserialize_any); deserialize_string_key!(deserialize_ignored_any); deserialize_string_key!(deserialize_str); deserialize_string_key!(deserialize_string); deserialize_string_key!(deserialize_char); deserialize_string_key!(deserialize_identifier); deserialize_bytes_key!(deserialize_bytes); deserialize_bytes_key!(deserialize_byte_buf); fn deserialize_unit>(self, visitor: V) -> Result { let (offset, key) = self.de.parse_key()?; from_str::<()>(&key)?; visitor .visit_unit() .map_err(|err| self.de.with_position(err, offset)) } fn deserialize_unit_struct>( self, _: &'static str, visitor: V, ) -> Result { self.deserialize_unit(visitor) } fn deserialize_option>(self, visitor: V) -> Result { // Consider keys to always be Some, otherwise we don't know if "null" is None or // Some("null"). visitor.visit_some(self) } fn deserialize_newtype_struct>( self, _: &'static str, visitor: V, ) -> Result { visitor.visit_newtype_struct(self) } fn deserialize_enum>( self, _: &'static str, _: &'static [&'static str], visitor: V, ) -> Result { let (offset, _) = self.de.peek_or(ErrorCode::EofParsingObject)?; visitor .visit_enum(UnitVariantAccess { de: self.de, map_key: true, }) .map_err(|err| self.de.with_position(err, offset)) } forward_to_deserialize_any! { seq tuple tuple_struct map struct } } struct VariantAccess<'a, 'de: 'a> { de: &'a mut Deserializer<'de>, } impl<'de> serde::de::EnumAccess<'de> for VariantAccess<'_, 'de> { type Error = Error; type Variant = Self; fn variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant)> where V: serde::de::DeserializeSeed<'de>, { let variant = seed.deserialize(MapKey { de: &mut *self.de })?; self.de.skip_whitespace()?; self.de .expect_char(':', ErrorCode::EofParsingObject, ErrorCode::ExpectedColon)?; Ok((variant, self)) } } impl<'de> serde::de::VariantAccess<'de> for VariantAccess<'_, 'de> { type Error = Error; fn unit_variant(self) -> Result<()> { serde::de::Deserialize::deserialize(self.de) } fn newtype_variant_seed>(self, seed: T) -> Result { seed.deserialize(self.de) } fn tuple_variant>(self, _: usize, visitor: V) -> Result { serde::de::Deserializer::deserialize_seq(self.de, visitor) } fn struct_variant>( self, fields: &'static [&'static str], visitor: V, ) -> Result { serde::de::Deserializer::deserialize_struct(self.de, "", fields, visitor) } } struct UnitVariantAccess<'a, 'de: 'a> { de: &'a mut Deserializer<'de>, map_key: bool, } impl<'de> serde::de::EnumAccess<'de> for UnitVariantAccess<'_, 'de> { type Error = Error; type Variant = Self; fn variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant)> where V: serde::de::DeserializeSeed<'de>, { let variant = if self.map_key { seed.deserialize(MapKey { de: &mut *self.de })? } else { seed.deserialize(&mut *self.de)? }; Ok((variant, self)) } } impl<'de> serde::de::VariantAccess<'de> for UnitVariantAccess<'_, 'de> { type Error = Error; fn unit_variant(self) -> Result<()> { Ok(()) } fn newtype_variant_seed(self, _: T) -> Result where T: serde::de::DeserializeSeed<'de>, { Err(serde::de::Error::invalid_type( serde::de::Unexpected::UnitVariant, &"newtype variant", )) } fn tuple_variant(self, _: usize, _: V) -> Result where V: Visitor<'de>, { Err(serde::de::Error::invalid_type( serde::de::Unexpected::UnitVariant, &"tuple variant", )) } fn struct_variant(self, _: &'static [&'static str], _: V) -> Result where V: Visitor<'de>, { Err(serde::de::Error::invalid_type( serde::de::Unexpected::UnitVariant, &"struct variant", )) } } enum StringResult<'de> { Borrowed(&'de str), Owned(String), } impl Deref for StringResult<'_> { type Target = str; fn deref(&self) -> &Self::Target { match self { StringResult::Borrowed(borrowed) => borrowed, StringResult::Owned(owned) => owned, } } } enum NumberResult { U128(u128), I128(i128), F64(f64), } json5-1.3.1/src/error.rs000064400000000000000000000165401046102023000131600ustar 00000000000000use std::fmt::{Display, Formatter}; pub type Result = std::result::Result; /// An error serializing or deserializing JSON5. #[derive(Debug, PartialEq, Clone)] pub struct Error { inner: Box, } impl Error { #[must_use] pub fn code(&self) -> Option { match self.inner.content { ErrorContent::Code(code) => Some(code), ErrorContent::Custom(_) => None, } } #[must_use] pub fn position(&self) -> Option { self.inner.position } } #[derive(Debug, PartialEq, Clone)] struct ErrorInner { content: ErrorContent, position: Option, } #[derive(Debug, PartialEq, Clone)] enum ErrorContent { Code(ErrorCode), Custom(String), } /// A code identifying an error originating within this crate. #[derive(Debug, PartialEq, Clone, Copy)] pub enum ErrorCode { EofParsingArray, EofParsingBool, EofParsingComment, EofParsingEscapeSequence, EofParsingIdentifier, EofParsingNull, EofParsingNumber, EofParsingObject, EofParsingString, EofParsingValue, ExpectedBool, ExpectedClosingBrace, ExpectedClosingBracket, ExpectedColon, ExpectedComma, ExpectedComment, ExpectedIdentifier, ExpectedNull, ExpectedNumber, ExpectedOpeningBrace, ExpectedOpeningBracket, ExpectedString, ExpectedStringOrObject, ExpectedValue, InvalidBytes, InvalidEscapeSequence, InvalidKey, LeadingZero, LineTerminatorInString, OverflowParsingNumber, TrailingCharacters, } impl Display for ErrorCode { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { match self { ErrorCode::EofParsingArray => write!(f, "EOF parsing array"), ErrorCode::EofParsingBool => write!(f, "EOF parsing bool"), ErrorCode::EofParsingComment => write!(f, "EOF parsing comment"), ErrorCode::EofParsingEscapeSequence => write!(f, "EOF parsing escape sequence"), ErrorCode::EofParsingIdentifier => write!(f, "EOF parsing identifier"), ErrorCode::EofParsingNull => write!(f, "EOF parsing null"), ErrorCode::EofParsingNumber => write!(f, "EOF parsing number"), ErrorCode::EofParsingObject => write!(f, "EOF parsing object"), ErrorCode::EofParsingString => write!(f, "EOF parsing string"), ErrorCode::EofParsingValue => write!(f, "EOF parsing value"), ErrorCode::ExpectedBool => write!(f, "expected bool"), ErrorCode::ExpectedClosingBrace => write!(f, "expected closing brace"), ErrorCode::ExpectedClosingBracket => write!(f, "expected closing bracket"), ErrorCode::ExpectedColon => write!(f, "expected colon"), ErrorCode::ExpectedComma => write!(f, "expected comma"), ErrorCode::ExpectedComment => write!(f, "expected comment"), ErrorCode::ExpectedIdentifier => write!(f, "expected identifier"), ErrorCode::ExpectedNull => write!(f, "expected null"), ErrorCode::ExpectedNumber => write!(f, "expected number"), ErrorCode::ExpectedOpeningBrace => write!(f, "expected opening brace"), ErrorCode::ExpectedOpeningBracket => write!(f, "expected opening bracket"), ErrorCode::ExpectedString => write!(f, "expected string"), ErrorCode::ExpectedStringOrObject => write!(f, "expected string or object"), ErrorCode::ExpectedValue => write!(f, "expected value"), ErrorCode::InvalidBytes => write!(f, "invalid bytes"), ErrorCode::InvalidEscapeSequence => write!(f, "invalid escape sequence"), ErrorCode::InvalidKey => write!(f, "invalid key"), ErrorCode::LeadingZero => write!(f, "leading zero"), ErrorCode::LineTerminatorInString => write!(f, "line terminator in string"), ErrorCode::OverflowParsingNumber => write!(f, "overflow parsing number"), ErrorCode::TrailingCharacters => write!(f, "trailing characters"), } } } impl Display for ErrorContent { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { match self { ErrorContent::Code(code) => write!(f, "{code}"), ErrorContent::Custom(msg) => write!(f, "{msg}"), } } } impl Display for Error { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { if let Some(position) = self.inner.position { write!(f, "{} at {}", self.inner.content, position) } else { write!(f, "{}", self.inner.content) } } } impl Error { #[must_use] pub fn new(code: ErrorCode) -> Self { Self { inner: Box::new(ErrorInner { content: ErrorContent::Code(code), position: None, }), } } #[must_use] pub fn new_at(position: Position, code: ErrorCode) -> Self { Self { inner: Box::new(ErrorInner { content: ErrorContent::Code(code), position: Some(position), }), } } #[must_use] pub fn custom(msg: T) -> Self { Self { inner: Box::new(ErrorInner { content: ErrorContent::Custom(msg.to_string()), position: None, }), } } #[must_use] pub fn custom_at(position: Position, msg: T) -> Self { Self { inner: Box::new(ErrorInner { content: ErrorContent::Custom(msg.to_string()), position: Some(position), }), } } #[must_use] pub fn with_position(mut self, position: Position) -> Self { if self.inner.position.is_none() { self.inner.position = Some(position); } self } } impl serde::de::Error for Error { fn custom(msg: T) -> Self { Self::custom(msg) } } impl serde::ser::Error for Error { fn custom(msg: T) -> Self { Self::custom(msg) } } impl From for Error { fn from(err: std::io::Error) -> Self { Self::custom(err) } } impl std::error::Error for Error {} /// The line and column that an error occured. #[derive(Debug, PartialEq, Clone, Copy)] pub struct Position { /// The first line is line 0. pub line: usize, /// The first column is column 0. pub column: usize, } impl Position { #[must_use] pub fn from_offset(offset: usize, input: &str) -> Self { let mut res = Self { line: 0, column: 0 }; let mut chars = input[..offset].chars().peekable(); while let Some(c) = chars.next() { if crate::char::is_json5_line_terminator(c) { // "The character sequence is commonly used as a line terminator. It // should be considered a single character for the purpose of reporting line // numbers." – https://262.ecma-international.org/5.1/#sec-7.3 if c == '\u{000D}' && chars.peek() == Some(&'\u{000A}') { chars.next(); } res.line += 1; res.column = 0; } else { res.column += 1; } } res } } impl Display for Position { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { write!(f, "line {} column {}", self.line + 1, self.column + 1) } } json5-1.3.1/src/lib.rs000064400000000000000000000077021046102023000125750ustar 00000000000000//! [JSON5][] is a superset of [JSON][] with an expanded syntax including some productions from //! [ECMAScript 5.1][]. It aims to be easier to write and maintain by hand (e.g. for config files). //! It is not intended to be used for machine-to-machine communication, for which you'd be better //! served by [serde-rs/json][]. //! //! In particular, JSON5 allows comments, trailing commas, object keys without quotes, single quoted //! strings, hexadecimal numbers, multi-line strings... //! //! ```json5 //! { //! // comments //! unquoted: 'and you can quote me on that', //! singleQuotes: 'I can use "double quotes" here', //! lineBreaks: "Look, Mom! \ //! No \\n's!", //! hexadecimal: 0xdecaf, //! leadingDecimalPoint: .8675309, andTrailing: 8675309., //! positiveSign: +1, //! trailingComma: 'in objects', andIn: ['arrays',], //! "backwardsCompatible": "with JSON", //! } //! ``` //! //! This crate provides functions for deserializing JSON5 text into a Rust datatype and for //! serializing a Rust datatype as JSON5 text, both via the [Serde framework][]. //! //! # Deserialization //! //! Implementing [`serde::Deserialize`] on your type will allow you to parse JSON5 text into a value //! of that type with [`from_str`]. //! //! ``` //! use serde_derive::Deserialize; //! //! #[derive(Debug, PartialEq, Deserialize)] //! struct Config<'a> { //! foo: u32, //! bar: &'a str, //! } //! //! let config: Config = json5::from_str(" //! { //! // Note unquoted keys, comments, and trailing commas. //! foo: 42, //! bar: 'baz', //! } //! ")?; //! //! assert_eq!(config, Config{ foo: 42, bar: "baz" }); //! # Ok::<(), json5::Error>(()) //! ``` //! //! There are many ways to customize the deserialization (e.g. deserializing `camelCase` field names //! into a struct with `snake_case` fields). See the Serde docs, especially the [Attributes][], //! [Custom serialization][], and [Examples][] sections. //! //! # Serialization //! //! Similarly, implementing [`serde::Serialize`] on a Rust type allows you to produce a JSON5 //! serialization of values of that type with [`to_string`] or [`to_writer`]. The serializer will //! omit quotes around object keys where possible and will indent nested objects and arrays, but is //! otherwise fairly basic. //! //! ``` //! use serde_derive::Serialize; //! //! #[derive(Serialize)] //! struct Config<'a> { //! foo: u32, //! bar: &'a str, //! } //! //! let config = Config { //! foo: 42, //! bar: "baz", //! }; //! //! assert_eq!(&json5::to_string(&config)?, "{ //! foo: 42, //! bar: \"baz\", //! }"); //! # Ok::<(), json5::Error>(()) //! ``` //! //! There are many ways to customize the serialization (e.g. serializing `snake_case` struct fields //! as `camelCase`). See the Serde docs, especially the [Attributes][], [Custom serialization][] and //! [Examples][] sections. //! //! # Byte arrays //! //! All the types of the [Serde data model][] are supported. Byte arrays are encoded as hex strings. //! e.g. //! //! ``` //! use serde_bytes::{Bytes, ByteBuf}; //! //! let s = json5::to_string(&Bytes::new(b"JSON5"))?; //! assert_eq!(&s, "\"4a534f4e35\""); //! assert_eq!(json5::from_str::(&s)?, ByteBuf::from("JSON5")); //! # Ok::<(), json5::Error>(()) //! ``` //! //! [Attributes]: https://serde.rs/attributes.html //! [Custom serialization]: https://serde.rs/custom-serialization.html //! [ECMAScript 5.1]: https://www.ecma-international.org/ecma-262/5.1/ //! [Examples]: https://serde.rs/examples.html //! [JSON]: https://www.json.org/json-en.html //! [JSON5]: https://json5.org/ //! [Serde data model]: https://serde.rs/data-model.html#types //! [Serde framework]: https://serde.rs/ //! [serde-rs/json]: https://github.com/serde-rs/json #![warn(clippy::pedantic)] #[macro_use] mod de; pub mod char; mod error; mod ser; #[allow(clippy::all, clippy::pedantic, dead_code)] mod unicode; pub use de::{Deserializer, from_str}; pub use error::{Error, ErrorCode, Position}; pub use ser::{Serializer, to_string, to_writer}; json5-1.3.1/src/ser.rs000064400000000000000000000376431046102023000126270ustar 00000000000000use std::io::Write; use serde::{Serialize, ser::Impossible}; use crate::{Error, ErrorCode, error::Result}; /// Serialize a type implementing [`Serialize`] to a JSON5 string. /// /// # Example /// ``` /// use serde_derive::Serialize; /// /// #[derive(Serialize)] /// struct Config<'a> { /// foo: u32, /// bar: &'a str, /// } /// /// let config = Config { /// foo: 42, /// bar: "baz", /// }; /// /// assert_eq!(&json5::to_string(&config)?, "{ /// foo: 42, /// bar: \"baz\", /// }"); /// # Ok::<(), json5::Error>(()) /// ``` /// /// # Errors /// Fails if we can't express `T` in JSON5 (e.g. we try to serialize an object key without an /// obvious string representation). pub fn to_string(value: &T) -> Result { let mut w = Vec::new(); to_writer(&mut w, value)?; #[expect(clippy::missing_panics_doc)] Ok(String::from_utf8(w).expect("we only write valid UTF-8")) } /// Serialize a type implementing [`Serialize`] to JSON5 and write it to the given writer. /// /// # Errors /// Fails if we can't express `T` in JSON5 (e.g. we try to serialize an object key without an /// obvious string representation) or if there's an error writing to the writer. pub fn to_writer(w: W, value: &T) -> Result<()> { value.serialize(&mut Serializer::new(w)) } /// A serializer that knows how to serialize types implementing [`Serialize`] as JSON5. pub struct Serializer { w: W, depth: usize, } impl Serializer { pub fn new(w: W) -> Self { Self { w, depth: 0 } } } macro_rules! serialize_display { ($method:ident, $type:ty) => { fn $method(self, v: $type) -> Result { write!(self.w, "{v}").map_err(Into::into) } }; } macro_rules! serialize_float { ($method:ident, $type:ty) => { fn $method(self, v: $type) -> Result { match (v.is_nan(), v.is_infinite(), v.is_sign_negative()) { (true, false, false) => write!(self.w, "NaN"), (true, false, true) => write!(self.w, "-NaN"), (false, true, false) => write!(self.w, "Infinity"), (false, true, true) => write!(self.w, "-Infinity"), _ => write!(self.w, "{v}"), } .map_err(Into::into) } }; } impl<'a, W: Write> serde::ser::Serializer for &'a mut Serializer { type Ok = (); type Error = Error; type SerializeSeq = SerializeCollection<'a, W>; type SerializeTuple = SerializeCollection<'a, W>; type SerializeTupleStruct = SerializeCollection<'a, W>; type SerializeTupleVariant = SerializeCollection<'a, W>; type SerializeMap = SerializeCollection<'a, W>; type SerializeStruct = SerializeCollection<'a, W>; type SerializeStructVariant = SerializeCollection<'a, W>; serialize_display!(serialize_bool, bool); serialize_display!(serialize_u8, u8); serialize_display!(serialize_u16, u16); serialize_display!(serialize_u32, u32); serialize_display!(serialize_u64, u64); serialize_display!(serialize_u128, u128); serialize_display!(serialize_i8, i8); serialize_display!(serialize_i16, i16); serialize_display!(serialize_i32, i32); serialize_display!(serialize_i64, i64); serialize_display!(serialize_i128, i128); serialize_float!(serialize_f32, f32); serialize_float!(serialize_f64, f64); fn serialize_char(self, v: char) -> Result { if v == '"' { write!(self.w, r#"'"'"#) } else if let Some(escaped) = crate::char::escape('"', v) { write!(self.w, r#""{escaped}""#) } else { write!(self.w, r#""{v}""#) } .map_err(Into::into) } fn serialize_str(self, v: &str) -> Result { let delimiter = if v.contains('"') && !v.contains('\'') { '\'' } else { '"' }; write!(self.w, "{delimiter}")?; for c in v.chars() { match crate::char::escape(delimiter, c) { Some(escaped) => write!(self.w, "{escaped}")?, None => write!(self.w, "{c}")?, } } write!(self.w, "{delimiter}")?; Ok(()) } fn serialize_bytes(self, v: &[u8]) -> Result { write!(self.w, "\"")?; for b in v { write!(self.w, "{b:02x}")?; } write!(self.w, "\"")?; Ok(()) } fn serialize_none(self) -> Result { self.serialize_unit() } fn serialize_some(self, v: &T) -> Result where T: ?Sized + Serialize, { v.serialize(self) } fn serialize_unit(self) -> Result { write!(self.w, "null").map_err(Into::into) } fn serialize_unit_struct(self, _: &'static str) -> Result { self.serialize_unit() } fn serialize_unit_variant( self, _: &'static str, _: u32, variant: &'static str, ) -> Result { self.serialize_str(variant) } fn serialize_newtype_struct(self, _: &'static str, v: &T) -> Result where T: ?Sized + Serialize, { v.serialize(self) } fn serialize_newtype_variant( self, _: &'static str, _: u32, variant: &'static str, v: &T, ) -> Result where T: ?Sized + Serialize, { write!(self.w, "{{")?; self.depth += 1; write!(self.w, "\n{:indent$}", "", indent = self.depth * 2)?; MapKey::new(self).serialize_str(variant)?; write!(self.w, ": ")?; v.serialize(&mut *self)?; self.depth -= 1; write!(self.w, ",\n{:indent$}}}", "", indent = self.depth * 2)?; Ok(()) } fn serialize_seq(self, _: Option) -> Result { write!(self.w, "[")?; self.depth += 1; Ok(SerializeCollection::new(self)) } fn serialize_tuple(self, len: usize) -> Result { self.serialize_seq(Some(len)) } fn serialize_tuple_struct( self, _: &'static str, len: usize, ) -> Result { self.serialize_seq(Some(len)) } fn serialize_tuple_variant( self, _: &'static str, _: u32, variant: &'static str, len: usize, ) -> Result { write!(self.w, "{{")?; self.depth += 1; write!(self.w, "\n{:indent$}", "", indent = self.depth * 2)?; MapKey::new(self).serialize_str(variant)?; write!(self.w, ": ")?; self.serialize_seq(Some(len)) } fn serialize_map(self, _: Option) -> Result { write!(self.w, "{{")?; self.depth += 1; Ok(SerializeCollection::new(self)) } fn serialize_struct(self, _: &'static str, len: usize) -> Result { self.serialize_map(Some(len)) } fn serialize_struct_variant( self, _: &'static str, _: u32, variant: &'static str, len: usize, ) -> Result { write!(self.w, "{{")?; self.depth += 1; write!(self.w, "\n{:indent$}", "", indent = self.depth * 2)?; MapKey::new(self).serialize_str(variant)?; write!(self.w, ": ")?; self.serialize_map(Some(len)) } } pub struct SerializeCollection<'a, W: Write> { ser: &'a mut Serializer, empty: bool, } impl<'a, W: Write> SerializeCollection<'a, W> { fn new(ser: &'a mut Serializer) -> Self { Self { ser, empty: true } } fn close(&mut self, delimiter: char) -> Result<()> { self.ser.depth -= 1; if self.empty { write!(self.ser.w, "{delimiter}")?; } else { write!( self.ser.w, "\n{:indent$}{delimiter}", "", indent = self.ser.depth * 2 )?; } Ok(()) } } impl serde::ser::SerializeSeq for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_element(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize, { self.empty = false; write!(self.ser.w, "\n{:indent$}", "", indent = self.ser.depth * 2)?; value.serialize(&mut *self.ser)?; write!(self.ser.w, ",")?; Ok(()) } fn end(mut self) -> Result { self.close(']') } } impl serde::ser::SerializeTuple for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_element(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize, { serde::ser::SerializeSeq::serialize_element(self, value) } fn end(self) -> Result { serde::ser::SerializeSeq::end(self) } } impl serde::ser::SerializeTupleStruct for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_field(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize, { serde::ser::SerializeSeq::serialize_element(self, value) } fn end(self) -> Result { serde::ser::SerializeSeq::end(self) } } impl serde::ser::SerializeTupleVariant for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_field(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize, { serde::ser::SerializeSeq::serialize_element(self, value) } fn end(mut self) -> Result { self.close(']')?; self.ser.depth -= 1; write!( self.ser.w, ",\n{:indent$}}}", "", indent = self.ser.depth * 2 )?; Ok(()) } } impl serde::ser::SerializeMap for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_key(&mut self, key: &T) -> Result<()> where T: ?Sized + Serialize, { self.empty = false; write!(self.ser.w, "\n{:indent$}", "", indent = self.ser.depth * 2)?; key.serialize(MapKey::new(self.ser))?; write!(self.ser.w, ": ")?; Ok(()) } fn serialize_value(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize, { value.serialize(&mut *self.ser)?; write!(self.ser.w, ",")?; Ok(()) } fn end(mut self) -> Result { self.close('}') } } impl serde::ser::SerializeStruct for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<()> where T: ?Sized + Serialize, { serde::ser::SerializeMap::serialize_entry(self, key, value) } fn end(self) -> Result { serde::ser::SerializeMap::end(self) } } impl serde::ser::SerializeStructVariant for SerializeCollection<'_, W> { type Ok = (); type Error = Error; fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<()> where T: ?Sized + Serialize, { serde::ser::SerializeMap::serialize_entry(self, key, value) } fn end(mut self) -> Result { self.close('}')?; self.ser.depth -= 1; write!( self.ser.w, ",\n{:indent$}}}", "", indent = self.ser.depth * 2 )?; Ok(()) } } macro_rules! serialize_quoted { ($method:ident, $type:ty) => { fn $method(self, v: $type) -> Result { write!(self.ser.w, "\"")?; self.ser.$method(v)?; write!(self.ser.w, "\"")?; Ok(()) } }; } struct MapKey<'a, W: Write> { ser: &'a mut Serializer, } impl<'a, W: Write> MapKey<'a, W> { fn new(ser: &'a mut Serializer) -> Self { Self { ser } } } impl serde::ser::Serializer for MapKey<'_, W> { type Ok = (); type Error = Error; type SerializeSeq = Impossible<(), Error>; type SerializeTuple = Impossible<(), Error>; type SerializeTupleStruct = Impossible<(), Error>; type SerializeTupleVariant = Impossible<(), Error>; type SerializeMap = Impossible<(), Error>; type SerializeStruct = Impossible<(), Error>; type SerializeStructVariant = Impossible<(), Error>; serialize_quoted!(serialize_u8, u8); serialize_quoted!(serialize_u16, u16); serialize_quoted!(serialize_u32, u32); serialize_quoted!(serialize_u64, u64); serialize_quoted!(serialize_u128, u128); serialize_quoted!(serialize_i8, i8); serialize_quoted!(serialize_i16, i16); serialize_quoted!(serialize_i32, i32); serialize_quoted!(serialize_i64, i64); serialize_quoted!(serialize_i128, i128); serialize_quoted!(serialize_f32, f32); serialize_quoted!(serialize_f64, f64); fn serialize_bool(self, v: bool) -> Result { self.ser.serialize_bool(v) } fn serialize_char(self, v: char) -> Result { if crate::char::is_json5_identifier_start(v) { write!(self.ser.w, "{v}")?; } else { self.ser.serialize_char(v)?; } Ok(()) } fn serialize_str(self, v: &str) -> Result { let mut chars = v.chars(); if let Some(first) = chars.next() && crate::char::is_json5_identifier_start(first) && chars.all(crate::char::is_json5_identifier) { write!(self.ser.w, "{v}")?; } else { self.ser.serialize_str(v)?; } Ok(()) } fn serialize_unit_variant( self, _: &'static str, _: u32, variant: &'static str, ) -> Result { self.serialize_str(variant) } fn serialize_bytes(self, v: &[u8]) -> Result { self.ser.serialize_bytes(v) } fn serialize_some(self, v: &T) -> Result where T: ?Sized + Serialize, { self.ser.serialize_some(v) } fn serialize_unit(self) -> Result { self.ser.serialize_unit() } fn serialize_unit_struct(self, name: &'static str) -> Result { self.ser.serialize_unit_struct(name) } fn serialize_newtype_struct(self, _: &'static str, value: &T) -> Result where T: ?Sized + Serialize, { value.serialize(self) } fn serialize_none(self) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_newtype_variant( self, _: &'static str, _: u32, _: &'static str, _: &T, ) -> Result where T: ?Sized + Serialize, { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_seq(self, _: Option) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_tuple(self, _: usize) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_tuple_struct( self, _: &'static str, _: usize, ) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_tuple_variant( self, _: &'static str, _: u32, _: &'static str, _: usize, ) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_map(self, _: Option) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_struct(self, _: &'static str, _: usize) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } fn serialize_struct_variant( self, _: &'static str, _: u32, _: &'static str, _: usize, ) -> Result { Err(Error::new(ErrorCode::InvalidKey)) } } json5-1.3.1/src/unicode.rs000064400000000000000000002161411046102023000134540ustar 00000000000000// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: // // ucd-generate general-category /tmp/ucd-latest --chars --trie-set --include Zs,Lu,Ll,Lt,Lm,Lo,Nl,Mn,Mc,Nd,Pc // // Unicode version: 17.0.0. // // ucd-generate 0.3.1 is available on crates.io. pub const BY_NAME: &'static [(&'static str, &'static ::ucd_trie::TrieSet)] = &[ ("Connector_Punctuation", CONNECTOR_PUNCTUATION), ("Decimal_Number", DECIMAL_NUMBER), ("Letter_Number", LETTER_NUMBER), ("Lowercase_Letter", LOWERCASE_LETTER), ("Modifier_Letter", MODIFIER_LETTER), ("Nonspacing_Mark", NONSPACING_MARK), ("Other_Letter", OTHER_LETTER), ("Space_Separator", SPACE_SEPARATOR), ("Spacing_Mark", SPACING_MARK), ("Titlecase_Letter", TITLECASE_LETTER), ("Uppercase_Letter", UPPERCASE_LETTER), ]; pub const CONNECTOR_PUNCTUATION: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0x80000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 1, 0, 0, 0, ], tree2_level2: &[ 0, 0x8000000000000000, 0x100001, 0x18000000000000, 0xE000, ], tree3_level1: &[ ], tree3_level2: &[ ], tree3_level3: &[ ], }; pub const DECIMAL_NUMBER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0x3FF000000000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3FF00000000, 0, 0x3FF000000000000, 0, 0, 0, 0x3FF, ], tree2_level1: &[ 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 2, 3, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 5, 0, 2, 0, 0, 6, 0, 0, 2, 7, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, ], tree2_level2: &[ 0, 0xFFC000000000, 0x3FF0000, 0x3FF00000000, 0x3FF, 0xFFC0, 0x3FF03FF, 0x3FF000000000000, 0x3FF000003FF0000, ], tree3_level1: &[ 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 6, 7, 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, 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, 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, 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, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 5, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 6, 0, 0, 0, 0, 0, 6, 0, 7, 2, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 6, 0, 0, 0, 6, 1, 1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0x3FF00000000, 0x3FF000000000000, 0x3FF, 0xFFC000000000, 0xFFC0000000000000, 0x3FF0000, 0xFFFFF03FF, 0xFFFFFFFFFFFFC000, 0x7FE000000000000, ], }; pub const LETTER_NUMBER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level2: &[ 0, 0x1C00000000000, 0xFFFFFFFF00000000, 0x1E7, 0x70003FE00000080, 0xFFC000000000, ], tree3_level1: &[ 0, 1, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], tree3_level2: &[ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, ], tree3_level3: &[ 0, 0x1FFFFFFFFFFFFF, 0x402, 0x3E0000, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFF, 0x70000000000000, ], }; pub const LOWERCASE_LETTER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0x7FFFFFE00000000, 0x20000000000000, 0xFF7FFFFF80000000, 0x55AAAAAAAAAAAAAA, 0xD4AAAAAAAAAAAB55, 0xE6512D2A4E243129, 0xAA29AAAAB5555240, 0x93FAAAAAAAAAAAAA, 0xFFFFFFFFFFFFAA85, 0xFFFFFFCFFFFF, 0, 0, 0x388A000000000000, 0xFFFFF00000010000, 0x192FAAAAAAE37FFF, 0xFFFF000000000000, 0xAAAAAAAAFFFFFFFF, 0xAAAAAAAAAAAAA802, 0xAAAAAAAAAAAAD554, 0xAAAAAAAAAAAA, 0xFFFFFFFF00000000, 0x1FF, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 5, 6, 0, 7, 7, 8, 7, 9, 10, 11, 12, 0, 0, 0, 0, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 7, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, ], tree2_level2: &[ 0, 0xE7FFFFFFFFFF0000, 0x3F00000000000000, 0x5FF, 0xFFFFFFFFFFF, 0xFEFFF80000000000, 0x7FFFFFF, 0xAAAAAAAAAAAAAAAA, 0xAAAAAAAABFEAAAAA, 0xFF00FF003F00FF, 0x3FFF00FF00FF003F, 0x40DF00FF00FF00FF, 0xDC00FF00CF00DC, 0x321080000008C400, 0x43C0, 0x10, 0xFFFF000000000000, 0xFDA1562FFFFFFFF, 0x8501AAAAAAAAA, 0x20BFFFFFFFFF, 0x2AAAAAAAAAAA, 0xAAAAAAA, 0xAAABAAA800000000, 0x95FEAAAAAAAAAAAA, 0xAAA082AAAABA50AA, 0x44000000AAAA50A, 0xFFFF01FF07FFFFFF, 0xFFFFFFFFFFFFFFFF, 0xF8007F, 0x7FFFFFE, ], tree3_level1: &[ 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 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, 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, 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, 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, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0xFFFFFF0000000000, 0xFFFF, 0xFFFFFFFFF000000, 0x1BFBFFFBFF800000, 0x7FFFFFFFFFFFF, 0xFFFF000000000000, 0x3F, 0xFFFFFFFF, 0xFFFFFFFF00000000, 0xF800000000000000, 0xFFFFF, 0xFFFFFFC000000, 0xFFFFDFC000, 0xEBC000000FFFFFFC, 0xFFFFFC000000FFEF, 0xFFFFFFC000000F, 0xFFFFFFC0000, 0xFC000000FFFFFFC0, 0xFFFFC000000FFFFF, 0xFFFFFFC000000FF, 0xFFFFFFC00000, 0x3FFFFFFC00, 0xF0000003F7FFFFFC, 0xFFC000000FDFFFFF, 0xFFFF0000003F7FFF, 0xFFFFFC000000FDFF, 0xBF7, 0x7E07FFFFBFF, 0xFFFFFFFC00000000, 0xF, ], }; pub const MODIFIER_LETTER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFF000000000000, 0x501F0003FFC3, 0, 0x410000000000000, 0, 0, 0, 0, 0, 0, 0, 0x2000000, 0, 0, 0, 0x1, 0, 0x6000000000, 0, 0, 0, 0x430000000000000, ], tree2_level1: &[ 0, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 9, 1, 1, 10, 11, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 1, 1, 1, 16, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 17, 1, 18, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 21, 22, 23, 1, 24, 25, 26, 27, 1, 1, 1, 1, 1, 1, 1, 28, 1, 25, 1, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 31, 1, ], tree2_level2: &[ 0x11004000000, 0, 0x200, 0x2000000000000, 0x40, 0x1000000000000000, 0x800000, 0x8, 0x8000000000, 0x3F00000000000000, 0xFFFFF00000000000, 0x10007FFFFFFFFFF, 0xFFFFFFFFF8000000, 0x8002000000000000, 0x1FFF0000, 0x3000000000000000, 0x800000000000, 0x83E000000000020, 0x60000000, 0x7000000000000000, 0x200000, 0x1000, 0x8000000000000000, 0x30000000, 0xFF800000, 0x1000000000000, 0x100, 0x31E000000000000, 0x4000008000, 0x18000020000000, 0x200F0000000, 0xC0000000, ], tree3_level1: &[ 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 5, 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, 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, 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, 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, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0x7FDFFFFFFFFFFBF, 0x800000004000, 0x20, 0x2000000, 0xF, 0x180000000007, 0xFFF80000, 0xC000B00000000, 0x6FEF000000000000, 0xFFFF000000000000, 0x3FFFFFFFFFFF, 0x3F80000000000000, 0x80000000000, 0x8000000000000000, 0x800, ], }; pub const NONSPACING_MARK: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF, 0, 0, 0, 0, 0xF8, 0, 0, 0, 0xBFFFFFFFFFFE0000, 0xB6, 0x7FF0000, 0x10000FFFFF800, 0, 0x3D9F9FC00000, 0xFFFF000000020000, 0x7FF, 0x1FFC000000000, 0x200FF80000000000, ], tree2_level1: &[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 10, 11, 12, 13, 14, 15, 16, 11, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 35, 36, 37, 38, 39, 33, 40, 33, 41, 33, 33, 33, 42, 43, 44, 45, 46, 47, 48, 49, 50, 33, 33, 51, 33, 33, 33, 52, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 53, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 54, 33, 55, 33, 56, 33, 33, 33, 33, 33, 33, 33, 33, 57, 33, 58, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 59, 60, 61, 33, 33, 33, 33, 62, 33, 33, 63, 64, 65, 66, 67, 68, 69, 70, 71, 33, 33, 33, 72, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 73, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 74, 33, 33, 33, 33, 33, 33, 33, ], tree2_level2: &[ 0x3EEFFBC00000, 0xE000000, 0xFF800000, 0xFFFFFFFBFFFFFC00, 0x1400000000000007, 0xC00FE21FE, 0x1000000000000002, 0x4000000C0000201E, 0x1000000000000006, 0x23000000023986, 0xFC00000C000021BE, 0x9000000000000002, 0xC0060201E, 0x4, 0x2001, 0xD000000000000011, 0xC00603DC1, 0xC00003040, 0x1800000000000003, 0xC0000201E, 0x2, 0x5C0400, 0x7F2000000000000, 0x7F80, 0x1FF2000000000000, 0x7F00, 0x2A0000003000000, 0x7FFE000000000000, 0x1FFFFFFFFEFFE0DF, 0x40, 0x66FDE00000000000, 0x1E0001C3000000, 0x20002064, 0, 0xE0000000, 0xC0000001C0000, 0xC0000000C0000, 0x3FB0000000000000, 0x200FFE40, 0xB800, 0x20000000060, 0xE04018700000000, 0x9800000, 0x9FF81FE57F400000, 0xBFFF000000000000, 0xFFF3FFFFFFF, 0x17D000000000000F, 0xFF80000000004, 0x3B3C00000003, 0x3A34000000000, 0xCFF00000000000, 0x31021FDFFF70000, 0xFFFFFFFFFFFFFFFF, 0x1FFE21FFF0000, 0x3800000000000, 0x8000000000000000, 0xFFFFFFFF00000000, 0x3C0000000000, 0x6000000, 0x3FF0800000000000, 0xC0000000, 0x3000000000000, 0x106000000844, 0x8003FFFF00000030, 0x3FC000000000, 0x3FF80, 0x33C8000000000007, 0x2000000000, 0x667E0000000000, 0x1000000000001008, 0xC19D000000000000, 0x40300000000002, 0x212000000000, 0x40000000, 0xFFFF0000FFFF, ], tree3_level1: &[ 0, 1, 2, 3, 2, 2, 4, 2, 2, 2, 2, 5, 6, 7, 8, 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, 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, 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, 2, 2, 2, 2, 9, 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, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 8, 9, 0, 10, 11, 0, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 33, 34, 35, 0, 36, 0, 0, 0, 37, 0, 0, 0, 38, 39, 0, 40, 41, 42, 43, 0, 0, 44, 0, 0, 45, 0, 46, 0, 47, 48, 49, 0, 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 57, 0, 56, 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 74, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0x2000000000000000, 0x100000000, 0x7C0000000000000, 0x870000000000F06E, 0x6000000000, 0xF000000000, 0x3E0000000000, 0x180000000000, 0xFC00000000000000, 0x1FFC0, 0x3C, 0xFF00000000000002, 0x801900000000007F, 0x678000000000003, 0x4, 0x1FEF8000000007, 0x8000000000000, 0x7FC0000000000003, 0x9E00, 0x40D3800000000000, 0x2, 0x7F880000000, 0x1800000000000003, 0x1F1FC000000001, 0xF800000000000000, 0x600054001, 0xFF00000000000000, 0x4000005C, 0x85F8000000000000, 0xD, 0xB03C000000000000, 0x30000001, 0xA7F8000000000000, 0x1, 0xBF280000000000, 0xFBCA0000000, 0x6FF800000000000, 0x5800000000000000, 0x8, 0x10CF00000, 0x79F80000000007FE, 0xE7E0080, 0x37FFC00, 0x5D00000000, 0xBF7F000000000000, 0x6DFCFFFFFC0000, 0xB47E000000000000, 0xBF, 0xA30000, 0x18000000000000, 0x7C0000000000003, 0x4000005, 0x3FFF81, 0xE3FFC0000000, 0x1F000000000000, 0x7F000000000000, 0x8000, 0x78000, 0x1000000000, 0x60000000, 0xFFFF3FFFFFFFFFFF, 0x7F, 0xF800038000000000, 0x3C0000000FE7, 0x1C, 0xF87FFFFFFFFFFFFF, 0x201FFFFFFFFFFF, 0xFFFEF8000010, 0x7DBF9FFFF7F, 0x400000000000, 0xF00000000000, 0xC00000000000, 0x20C04800000000, 0x7F0000, 0x7F0, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF, ], }; pub const OTHER_LETTER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0x400040000000000, 0, 0, 0, 0x800000000000000, 0xF, 0, 0, 0x300000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x787FFFFFF0000, 0xFFFFFFFF00000000, 0xFFFEC000000007FE, 0xFFFFFFFFFFFFFFFF, 0x9C00C000002FFFFF, 0xFFFFFFFD0000, 0xFFFFFFFFFFFFE000, 0x2003FFFFFFFFF, 0x7FFFFFFFC00, ], tree2_level1: &[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 31, 35, 35, 35, 35, 35, 36, 37, 38, 39, 40, 41, 31, 42, 35, 35, 35, 35, 35, 35, 35, 35, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 31, 31, 60, 61, 62, 63, 64, 65, 31, 66, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 67, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 68, 69, 70, 71, 31, 31, 31, 31, 31, 31, 31, 31, 72, 42, 73, 74, 75, 35, 76, 68, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 77, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 78, 79, 35, 35, 35, 35, 80, 81, 50, 63, 31, 31, 82, 83, 84, 48, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 31, 31, 96, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 97, 98, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 35, 35, 35, 35, 99, 35, 100, 101, 102, 103, 104, 35, 35, 35, 35, 105, 106, 107, 108, 31, 109, 35, 110, 31, 111, 112, 113, ], tree2_level2: &[ 0x3FFFFF, 0xFFFF07FF01FFFFFF, 0xFFFFFFFF0000FEFF, 0x1FF, 0x23FFFFFFFFFFFFF0, 0xFFFC0003FF010000, 0x23C5FDFFFFF99FE1, 0x10030003B0004000, 0x36DFDFFFFF987E0, 0x1C00005E000000, 0x23EDFDFFFFFBBFE0, 0x200000300010000, 0x23EDFDFFFFF99FE0, 0x20003B0000000, 0x3FFC718D63DC7E8, 0x10000, 0x23FFFDFFFFFDDFE0, 0x337000000, 0x23EFFDFFFFFDDFE1, 0x6000370000000, 0x27FFFFFFFFFDDFF0, 0xFC00000380704000, 0x2FFBFFFFFC7FFFE0, 0x7F, 0xDFFFFFFFFFFFE, 0x3F, 0x200DFFAFFFFFF7D6, 0xF000001F, 0x1, 0x1FFFFFFFFEFF, 0x1F00, 0, 0x800007FFFFFFFFFF, 0xFFE1C0623C3F0000, 0x4003, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF3D7F3DFF, 0x7F3DFFFFFFFF3DFF, 0xFFFFFFFFFF7FFF3D, 0xFFFFFFFFFF3DFFFF, 0x7FFFFFF, 0xFFFF, 0xFFFFFFFFFFFFFFFE, 0xFFFF9FFFFFFFFFFF, 0xFFFFFFFF07FFFFFE, 0x1FE07FFFFFFFFFF, 0x3FFFF8003FFFF, 0x1DFFF0003FFFF, 0xFFFFFFFFFFFFF, 0x10000000, 0xFFFFFFFF00000000, 0x1FFFFFFFFFFFFF7, 0xFFFF05FFFFFFFF9F, 0x3FFFFFFFFFFFFF, 0x7FFFFFFF, 0x1F3FFFFFFF0000, 0xFFFF0FFFFFFFFFFF, 0x3FF, 0xFFFFFFFF007FFFFF, 0x1FFFFF, 0xFFFFFFFFFFFE0, 0x1FE0, 0xFC00C001FFFFFFF8, 0x3FFFFFFFFF, 0xFFFFFFFFF, 0xFFFFFFFC00E000, 0x46FDE0000000000, 0x1E0000000000000, 0xFFFF000000000000, 0xFFFFFFFFFF, 0x7F7F7F7F007FFFFF, 0x7F7F7F7F, 0x1000000000000040, 0xFFFFFFFE807FFFFF, 0x87FFFFFFFFFFFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF, 0xFFFFFFFFFFDFFFFF, 0x1FFF, 0xFFFFFFFFFF0000, 0xC00FFFF0FFF, 0x400000000000, 0x8000, 0xF880000000000000, 0x7FFFFF7BB, 0xFFFFFFFFFFFFC, 0x68FC000000000000, 0xFFFF003FFFFFFC00, 0x1FFFFFFF0000007F, 0x7FFFFFFFFFFF0, 0x7C00FF9F00000000, 0x1FFFFFFFFFF, 0xC47EFFFF00000FF7, 0x3E62FFFFFFFFFFFF, 0x407FF18000005, 0x7F7F007E7E7E, 0x7FFFFFFFF, 0xFFFF000FFFFFFFFF, 0xFFFFFFFFFFFF87F, 0xFFFF3FFFFFFFFFFF, 0x3FFFFFF, 0x5F7FFDFFA0000000, 0xFFFFFFFFFFFFFFDB, 0x3FFFFFFFFFFFF, 0xFFFFFFFFFFF80000, 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFCFFFF, 0xFFF0000000000FF, 0xFFDF000000000000, 0x1FFFFFFFFFFFFFFF, 0xFFFEFFC000000000, 0x7FFFFFFF3FFFFFFF, 0x1CFCFCFC, ], tree3_level1: &[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 5, 9, 5, 10, 11, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 13, 14, 7, 15, 16, 7, 17, 7, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, ], tree3_level2: &[ 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, 4, 11, 12, 4, 13, 14, 4, 15, 2, 2, 2, 2, 16, 17, 4, 4, 18, 19, 20, 21, 22, 23, 24, 4, 25, 26, 27, 28, 29, 30, 31, 4, 2, 32, 4, 4, 14, 33, 4, 4, 4, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 20, 51, 52, 53, 54, 55, 56, 57, 58, 4, 4, 59, 60, 57, 61, 62, 4, 63, 64, 4, 4, 65, 4, 4, 66, 67, 68, 69, 70, 71, 72, 73, 74, 4, 4, 4, 75, 76, 77, 78, 4, 79, 80, 81, 82, 4, 4, 4, 83, 84, 4, 85, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 23, 4, 4, 4, 2, 2, 2, 86, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 88, 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, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 74, 89, 90, 91, 57, 92, 78, 4, 4, 4, 4, 4, 4, 93, 4, 4, 4, 4, 4, 4, 2, 94, 4, 4, 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, 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, 95, 20, 4, 2, 96, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 97, 98, 2, 2, 2, 2, 2, 99, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 100, 101, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 102, 4, 4, 4, 4, 4, 4, 4, 103, 104, 4, 4, 4, 4, 91, 65, 4, 4, 4, 4, 4, 4, 4, 105, 4, 4, 4, 106, 4, 4, 4, 107, 4, 4, 4, 108, 2, 2, 2, 109, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 110, 111, 112, 4, 4, 4, 4, 4, 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, 113, 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, 2, 2, 2, 2, 2, 9, 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, 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, 114, 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, 115, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 116, 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, 2, 2, 2, 2, 117, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ], tree3_level3: &[ 0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0, 0xFFFFFFFF1FFFFFFF, 0x1FFFF, 0xFFFFE000FFFFFFFF, 0x3FFFFFFFFF03FD, 0xFFFFFFFF3FFFFFFF, 0xFF0F, 0xFFFFFFFFFFFF0000, 0x3FFFFFFF, 0xFFFF00FFFFFFFFFF, 0xFFFFFFFFF, 0xFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFF, 0xFF003FFFFF, 0x91BFFFFFFFFFFD3F, 0x7FFFFF003FFFFF, 0x7FFFFFFF, 0x37FFFF00000000, 0x3FFFFFF003FFFFF, 0x3FFFFFF, 0xC0FFFFFFFFFFFFFF, 0x3FFFFFFEEF0001, 0x1FFFFFFF00000000, 0x1FFFFFFF, 0x1FFFFFFEFF, 0x3FFFFFFFFFFFFF, 0x7FFFF003FFFFF, 0x3FFFF, 0x1FF, 0xBC00, 0x303FFFFFFFFFF, 0xDC, 0xFFFF00801FFFFFFF, 0xFFFF00000000003F, 0xFFFF000000000003, 0x7FFFFF0000001F, 0xFFFFFFFFFFFFF8, 0x26000000000000, 0xFFFFFFFFFFF8, 0x1FFFFFF0000, 0x7FFFFFFFF8, 0x47FFFFFFFF0090, 0x7FFFFFFFFFFF8, 0x1400001E, 0x80000FFFFFFBFFFF, 0x1, 0xFFFF01FFBFFFBD7F, 0x23EDFDFFFFF99FE0, 0x3E0010000, 0xBFFFFFFFFF4BFF, 0xA0000, 0x1FFFFFFFFFFFFF, 0x380000780, 0xFFFFFFFFFFFF, 0xB0, 0x7FFFFFFFFFFF, 0xF000000, 0x10, 0x10007FFFFFFFFFF, 0x7FFFFFF, 0x7F, 0xFFFFFFFFFFF, 0x8000000000000000, 0x8000FFFFFF6FF27F, 0x2, 0xFFFFFCFF00000000, 0xA0001FFFF, 0x407FFFFFFFFF801, 0xFFFFFFFFF0010000, 0xFFFF0000200003FF, 0x1FFFFFFFFFFFFFF, 0x1FFFFFFFF, 0x7FFFFFFFFDFF, 0xFFFC000000000001, 0xFFFF, 0x1FFFFFFFFFB7F, 0xFFFFFDBF00000040, 0xFFFF0000010003FF, 0xDFFFFFF, 0x7FFFF00000000, 0xFFFFFFFFDFFF4, 0x1000000000000, 0xF, 0x1FFFFFFFFFFFF, 0xFFFFFFFF0000007E, 0xFFFF00007FFFFFFF, 0x7FFFFFFFFFFFFFFF, 0x3FFFFFFF0000, 0xE0FFFFF800000000, 0x7FFFFFFFFF8, 0x107FF, 0x80000000003FFFFF, 0x7FFFFFFFFFFFF, 0x40007FFFFFFFF, 0xFFFF00F000270000, 0xFFFFFFFFFFFFFFF, 0x1FFF07FFFFFFFFFF, 0x3FF01FF, 0x400, 0x1FFFFFFFFFFF, 0x4000, 0x7FFFFFF0000, 0x13FFFFFFF0000, 0x401F3FB77FFFFFFF, 0x7FFF6F7F00000000, 0x1F, 0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF, 0xFFFFFFFF, 0xFFFF3FFFFFFFFFFF, 0xFFFF0001FFFFFFFF, 0xFFFFFFFFFFFF07FF, 0x3FFFFFFFFFFFFFF, ], }; pub const SPACE_SEPARATOR: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0x100000000, 0, 0x100000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level2: &[ 0, 0x1, 0x8000000007FF, 0x80000000, ], tree3_level1: &[ ], tree3_level2: &[ ], tree3_level3: &[ ], }; pub const SPACING_MARK: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 5, 7, 8, 4, 9, 10, 11, 12, 8, 13, 3, 14, 15, 16, 0, 0, 0, 0, 9, 17, 0, 0, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 22, 23, 0, 0, 0, 0, 24, 0, 0, 0, 25, 26, 0, 0, 27, 28, 29, 30, 31, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 36, 0, 37, 38, 6, 39, 40, 0, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level2: &[ 0, 0xC800000000000008, 0xDE01, 0xC00000000000000C, 0x801981, 0xC000000000000008, 0x1, 0x1A01, 0x400000000000000C, 0xC000000000000000, 0x801DC6, 0xE, 0x1E, 0x8000000600D9F, 0x801DC1, 0xC, 0xC0000FF038000, 0x8000000000000000, 0x1902180000000000, 0x3F9C00C00000, 0x1C009F98, 0x10000000200000, 0xC040000000000000, 0x1BF, 0x1FB0E7800000000, 0x6000000, 0x7E01A00A00000, 0xE820000000000010, 0x1B, 0x4C200000004, 0xC5C8000000000, 0x300FF000000000, 0x80000200000000, 0xC00000000000, 0x9800000000, 0xFFF0000000000003, 0xF, 0xC0000, 0xCC30000000000008, 0x19800000000000, 0x2800000000002000, 0x20C80000000000, 0x16D800000000, ], tree3_level1: &[ 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, 4, 5, 6, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 17, 0, 18, 0, 19, 0, 20, 0, 0, 0, 21, 0, 0, 0, 22, 1, 0, 23, 24, 25, 26, 0, 0, 27, 0, 0, 28, 0, 29, 0, 0, 0, 30, 0, 0, 0, 0, 31, 32, 16, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0x5, 0x187000000000004, 0x100000000000, 0x60, 0x8038000000000004, 0x4001, 0x2C700000000000, 0x700000000, 0xC00000000000000C, 0xC0080399E, 0x700000000000000, 0xB7A4, 0xE0000000000000, 0x23, 0x7A07000000000000, 0x2, 0x4F03800000000000, 0x5807000000000000, 0x40D00000000000, 0x4340000000, 0x100700000000000, 0x21BF000000000000, 0x10F00E0000, 0x200000000000000, 0x1800000, 0x800000, 0xA200000000, 0x4000800000000000, 0x12020000000000, 0x587C00, 0x60000000000000, 0xC030000000000008, 0x1C0000000000, 0xFFFFFFFFFFFE0000, 0xFF, 0x3000000000000, 0x7E06000000000, ], }; pub const TITLECASE_LETTER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0x4000000000920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level2: &[ 0, 0x1000FF00FF00FF00, 0x1000000000001000, ], tree3_level1: &[ ], tree3_level2: &[ ], tree3_level3: &[ ], }; pub const UPPERCASE_LETTER: &'static ::ucd_trie::TrieSet = &::ucd_trie::TrieSet { tree1_level1: &[ 0, 0x7FFFFFE, 0, 0x7F7FFFFF, 0xAA55555555555555, 0x2B555555555554AA, 0x11AED2D5B1DBCED6, 0x55D255554AAAA490, 0x6C05555555555555, 0x557A, 0, 0, 0, 0x8045000000000000, 0xFFBFFFED740, 0xE6905555551C8000, 0xFFFFFFFFFFFF, 0x5555555500000000, 0x5555555555555401, 0x5555555555552AAB, 0xFFFE555555555555, 0x7FFFFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree2_level1: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 5, 6, 5, 7, 8, 9, 10, 0, 0, 0, 0, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 5, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, ], tree2_level2: &[ 0, 0xFFFFFFFF00000000, 0x20BF, 0x3FFFFFFFFFFFFF, 0xE7FFFFFFFFFF0200, 0x5555555555555555, 0x5555555540155555, 0xFF00FF003F00FF00, 0xFF00AA003F00, 0xF00000000000000, 0xF001F000F000F00, 0xC00F3D503E273884, 0x20, 0x8, 0xFFFFFFFFFFFF, 0xC025EA9D00000000, 0x4280555555555, 0x155555555555, 0x5555555, 0x5554555400000000, 0x6A00555555555555, 0x555F7D5555452855, 0x20000015555AF5, 0x7FFFFFE00000000, ], tree3_level1: &[ 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 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, 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, 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, 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, ], tree3_level2: &[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0xFFFFFFFFFF, 0xFFFF000000000000, 0xFFFFF, 0xF7FF000000000000, 0x37F7FF, 0x7FFFFFFFFFFFF, 0x3FFFFF0000, 0xFFFFFFFF00000000, 0xFFFFFFFF, 0x1FFFFFF00000000, 0xFFF0000003FFFFFF, 0xFFFFFF0000003FFF, 0x3FDE64D0000003, 0x3FFFFFF0000, 0x7B0000001FDFE7B0, 0xFFFFF0000001FC5F, 0x3FFFFFF0000003F, 0x3FFFFFF00000, 0xF0000003FFFFFF00, 0xFFFF0000003FFFFF, 0xFFFFFF00000003FF, 0x7FFFFFC00000001, 0x1FFFFFF0000000, 0x7FFFFFC00000, 0x1FFFFFF0000, 0x400, 0x3FFFFFFFF, ], }; json5-1.3.1/tests/chromium_example.json5000064400000000000000000005512061046102023000163550ustar 00000000000000// From https://github.com/chromium/chromium/blob/d1987ba98386e8a455c0b983650dfd9687d14636/third_party/blink/renderer/platform/runtime_enabled_features.json5 { // See third_party/blink/renderer/platform/RuntimeEnabledFeatures.md // // This list is used to generate runtime_enabled_features.h/cc which contains // a class that stores static enablers for all experimental features. parameters: { // Each feature can be assigned a "status". The "status" can be either // one of the values in the |valid_values| list or a dictionary of // the platforms listed in |valid_keys| to |valid_values|. // Use "default" as the key if you want to specify the status of // the platforms other than the ones declared in the dictionary. // ** Omitting "default" means the feature is not enabled on // the platforms not listed in the status dictionary // // Definition of each status: // * status=stable: Enable this in all Blink configurations. We are // committed to these APIs indefinitely. // * status=experimental: In-progress features, Web Developers might play // with, but are not on by default in stable. These features may be // turned on using the "Experimental Web Platform features" flag in // chrome://flags/#enable-experimental-web-platform-features. // * status=test: Enabled in ContentShell for testing, otherwise off. // Features without a status are not enabled anywhere by default. // // Example of the dictionary value use: // { // name: "ExampleFeature", // status: {"Android": "stable", "Win": "experimental"}, // } // "ExampleFeature" will be stable on Android/WebView, experimental // on Windows and not enabled on any other platform. // // Note that the Android status key implies Chrome for Android and WebView. // // "stable" features listed here should be rare, as anything which we've // shipped stable can have its runtime flag removed soon after. status: { valid_values: ["stable", "experimental", "test"], valid_keys: ["Android", "Win", "ChromeOS", "Mac", "Linux", "iOS"] }, // "implied_by" or "depends_on" specifies relationship to other features: // * implied_by: ["feature1","feature2",...] // The feature is automatically enabled if any implied_by features is // enabled. To effectively disable the feature, you must disable the // feature and all the implied_by features. // * depends_on: ["feature1","feature2",...] // The feature can be enabled only if all depends_on features are enabled. // Only one of "implied_by" and "depends_on" can be specified. implied_by: { default: [], valid_type: "list", }, // *DO NOT* specify features that depend on origin trial features. // It is NOT supported. As a workaround, you can either specify the same // |origin_trial_feature_name| for the feature or add the OT feature to // the |implied_by| list. // TODO(https://crbug.com/954679): Add support for origin trial features in 'depends_on' list depends_on: { default: [], valid_type: "list", }, // origin_trial_feature_name: "FEATURE_NAME" is used to integrate the // feature with the Origin Trials framework. The framework allows the // feature to be enabled at runtime on a per-page basis through a signed // token for the corresponding feature name. Declaring the // origin_trial_feature_name will modify the generation of the static // methods in runtime_enabled_features.h/cpp -- the no-parameter version // will not be generated, so all callers have to use the version that takes // a const FeatureContext* argument. origin_trial_feature_name: { }, // origin_trial_os specifies the platforms where the trial is available. // The default is empty, meaning all platforms. origin_trial_os: { default: [], valid_type: "list", }, // origin_trial_type specifies the unique type of the trial, when not the // usual trial for a new experimental feature. origin_trial_type: { default: "", valid_type: "str", valid_values: ["deprecation", "intervention", ""], }, // origin_trial_allows_insecure specifies whether the trial can be enabled // in an insecure context, with default being false. This can only be set // to true for a "deprecation" type trial. origin_trial_allows_insecure: { valid_type: "bool", }, // origin_trial_allows_third_party specifies whether the trial can be enabled // from third party origins, with default being false. origin_trial_allows_third_party: { valid_type: "bool", }, // settable_from_internals specifies whether a feature can be set from // internals.runtimeFlags, with the default being false. settable_from_internals: { valid_type: "bool", }, // public specifies whether a feature can be accessed via // third_party/blink/public/platform/web_runtime_features.h with dedicated // methods. The default is false. This should be rare because // WebRuntimeFeatures::EnableFeatureFromString() works in most cases. public: { valid_type: "bool", }, // Feature policy IDL extended attribute (see crrev.com/2247923004). feature_policy: { }, // The string name of a base::Feature. The C++ variable name in // blink::features is built with this string by prepending 'k'. // As long as this field isn't "none", a base::Feature is automatically // generated in features_generated.{h,cc}. By default the "name" field // is used for the feature name, but can be overridden here. // // The default value of the base::Feature instance is: // base::FEATURE_ENABLED_BY_DEFAULT if 'status' field is 'stable", and // base::FEATURE_DISABLED_BY_DEFAULT otherwise. // It can be overridden by 'base_feature_status' field. // // If the flag should be associated with a feature not in blink::features, // we need to specify `base_feature: "none"` and map the features in // content/child/runtime_features.cc. `base_feature: "none"` is strongly // discouraged if the feature doesn't have an associated base feature // because the feature would lack a killswitch controllable via finch. base_feature: { valid_type: "str", default: "", }, // Specify the default value of the base::Feature instance. This field // works only if base_feature is not "none". // If the field is missing or "", the default value depends on the 'status' // field. See the comment above. // "disabled" sets base::FEATURE_DISABLED_BY_DEFAULT, and "enabled" sets // base::FEATURE_ENABLED_BY_DEFAULT. base_feature_status: { valid_type: "str", valid_values: ["", "disabled", "enabled"], default: "", }, // Specify how the flag value is updated from the base::Feature value. This // field is used only if base_feature is not empty. // // * "enabled_or_overridden" // - If the base::Feature status is overridden to the enabled or disabled // state by field trial or command line, set Blink feature to the state // of the base::Feature. Note: "Override to Default" doesn't affect the // Blink feature. // - Otherwise if the base::Feature is enabled, enable the Blink feature. // - Otherwise no change. // // * "overridden" // Enables the Blink feature when the base::Feature status is overridden // to the enabled or disabled state by field trial or command line. // Otherwise no change. Its difference from "enabled_or_overridden" is // that the Blink feature isn't affected by the default state of the // base::Feature. Note: "Override to Default" deosn't affect the Blink // feature. // // This is useful for Blink origin trial features especially those // implemented in both Chromium and Blink. As origin trial only controls // the Blink features, for now we require the base::Feature to be enabled // by default, but we don't want the default enabled status affect the // Blink feature. See also https://crbug.com/1048656#c10. // This can also be used for features that are enabled by default in // Chromium but not in Blink on all platforms and we want to use the Blink // status. However, we would prefer consistent Chromium and Blink status // to this. copied_from_base_feature_if: { valid_type: "str", valid_values: ["enabled_or_overridden", "overridden"], default: "enabled_or_overridden", }, // browser_process_read_access indicates the runtime feature state should be // readable in the browserprocess via RuntimeFeatureStateReadContext. // TODO(crbug.com/1377000): this feature does not support origin trial // tokens provided in HTTP headers. Any tokens provided via HTTP header will // be dropped. Please inform developers they must embed the token in HTML. browser_process_read_access: { default: false, value_type: "bool", }, // browser_process_read_write_access indicates the runtime feature state // should be writable in the browserprocess via RuntimeFeatureStateContext. // TODO(crbug.com/1377000): this feature does not support origin trial // tokens provided in HTTP headers. Any tokens provided via HTTP header will // be dropped. Please inform developers they must embed the token in HTML. browser_process_read_write_access: { default: false, value_type: "bool", }, // is_protected_feature indicates whether the feature enablement state should // be tracked using a base::ProtectedMemory value or just a regular bool // value. is_protected_feature: { default: false, value_type: "bool", } }, data: [ { // crbug.com/439682405 name: "AbortByPlaceholderLayout", status: "stable", }, { // This flag changes about:blank to dark in dark mode on user action. name: "AboutBlankPageRespectsDarkModeOnUserAction", status: "stable", }, { name: "Accelerated2dCanvas", settable_from_internals: true, status: "stable", }, { name: "AcceleratedSmallCanvases", status: "stable", }, { name: "AccessibilityAriaVirtualContent", public: true, status: "experimental", base_feature: "none", }, { name: "AccessibilityCustomElementRoleNone", public: true, status: "test", base_feature: "none", }, { name: "AccessibilityExposeDisplayNone", status: "test", }, { // If the author did not define aria-actions, surface button and link // children inside option and menuitem elements as implicit actions. name: "AccessibilityImplicitActions", status: "experimental", }, { // Use a minimum role of group on elements that are keyboard-focusable. // See https://w3c.github.io/html-aam/#minimum-role. name: "AccessibilityMinRoleTabbable", }, { name: "AccessibilityOSLevelBoldText", status: "experimental", public: true, }, { // Enforce no accessible name on objects that have a role where names are // prohibited (listed in https://w3c.github.io/aria/#namefromprohibited): // log a friendly error in the developer console, and trigger a DCHECK(). // The incorrect markup situation will be repaired, and the name will // be exposed as a description instead. // TODO(crbug.com/350528330, // https://github.com/web-platform-tests/interop-accessibility/issues/133, // https://github.com/w3c/accname/issues/240, // https://github.com/w3c/accname/issues/241): If community feedback is // positive, and WPT + accname testable statements are updated to allow // this, then add status: test. name: "AccessibilityProhibitedNames", }, { name: "AccessibilitySerializationSizeMetrics", status: "experimental", }, { name: "AccessibilityUseAXPositionForDocumentMarkers", base_feature: "none", public: true, }, { // https://chromestatus.com/feature/5113389252739072 // https://issues.chromium.org/issues/41119923 name: "AccessKeyLabel", status: "experimental", }, { name: "AddressSpace", status: "experimental", implied_by: ["CorsRFC1918"], }, { // Interest Group JS API/runtimeflag. name: "AdInterestGroupAPI", status: "stable", origin_trial_feature_name: "AdInterestGroupAPI", implied_by: ["Fledge", "Parakeet"], public: true, }, // Fix for crbug.com/403358869 { name: "AdjustDOMOffsetToLayoutOffsetForSecureText", status: "stable", }, // Adjust the end of the next paragraph if the end position for the // paragraph is updated while moving the paragraph. See // https://crbug.com/329121649 { name: "AdjustEndOfNextParagraphIfMovedParagraphIsUpdated", status: "stable", }, { name: "AdTagging", public: true, status: "test", base_feature: "none", }, { name: "AIPageContentPaidContentAnnotation", status: "stable" }, // In AIPageContentAgent::ComputeHitTestableNodesInViewport, the hit test // may hit the same node multiple times, which causes issues with computing // the final z-order of page elements. This flag will filter those // duplicate results first before doing any further processing. { name: "AIPageContentZOrderEarlyFiltering", status: "stable" }, { name: "AIPromptAPI", public: true, status: { "Win": "experimental", "Mac": "experimental", "Linux": "experimental", "ChromeOS": "experimental", "default": "", }, origin_trial_feature_name: "AIPromptAPIMultimodalInput", origin_trial_os: ["win", "mac", "linux", "chromeos"], origin_trial_allows_third_party: true, implied_by: ["AIPromptAPIMultimodalInput"], }, { // Extension access to "AIPromptAPI". name: "AIPromptAPIForExtension", public: true, status: { "Win": "stable", "Mac": "stable", "Linux": "stable", "ChromeOS": "stable", "default": "", }, }, { name: "AIPromptAPIForWorkers", public: true, }, { name: "AIPromptAPIMultimodalInput", status: { "Win": "experimental", "Mac": "experimental", "Linux": "experimental", "ChromeOS": "experimental", "default": "", }, origin_trial_feature_name: "AIPromptAPIMultimodalInput", origin_trial_os: ["win", "mac", "linux", "chromeos"], origin_trial_allows_third_party: true, base_feature_status: "enabled", copied_from_base_feature_if: "overridden", }, { // Gates access to the responseConstraint enhancement for "AIPromptAPI". // This feature alone does not expose any "AIPromptAPI" feature access. name: "AIPromptAPIStructuredOutput", status: "stable", }, { // Gates access to the tool use (function calling) enhancement for // "AIPromptAPI". This feature alone does not expose any "AIPromptAPI" // feature access. name: "AIPromptAPIToolUse", status: { "Win": "experimental", "Mac": "experimental", "Linux": "experimental", "ChromeOS": "experimental", "default": "", }, }, { name: "AIProofreadingAPI", status: { "Win": "experimental", "Mac": "experimental", "Linux": "experimental", "ChromeOS": "experimental", "default": "", }, origin_trial_feature_name: "AIProofreaderAPI", origin_trial_os: ["win", "mac", "linux", "chromeos"], origin_trial_allows_third_party: true, base_feature_status: "enabled", copied_from_base_feature_if: "overridden", }, { name: "AIRewriterAPI", status: { "Win": "experimental", "Mac": "experimental", "Linux": "experimental", "ChromeOS": "experimental", "default": "", }, origin_trial_feature_name: "AIRewriterAPI", origin_trial_os: ["win", "mac", "linux", "chromeos"], origin_trial_allows_third_party: true, base_feature_status: "enabled", copied_from_base_feature_if: "overridden", }, { name: "AIRewriterAPIForWorkers", public: true, }, { name: "AISummarizationAPI", status: { "Win": "stable", "Mac": "stable", "Linux": "stable", "ChromeOS": "stable", "default": "", }, }, { name: "AISummarizationAPIForWorkers", public: true, }, { name: "AIWriterAPI", status: { "Win": "experimental", "Mac": "experimental", "Linux": "experimental", "ChromeOS": "experimental", "default": "", }, origin_trial_feature_name: "AIWriterAPI", origin_trial_os: ["win", "mac", "linux", "chromeos"], origin_trial_allows_third_party: true, base_feature_status: "enabled", copied_from_base_feature_if: "overridden", }, { name: "AIWriterAPIForWorkers", public: true, }, { name: "AlignZoomToCenter", status: "stable", }, { name: "AllowContentInitiatedDataUrlNavigations", base_feature: "none", }, { name: "AllowPreloadingWithCSPMetaTag", status: "experimental", }, { name: "AllowSameSiteNoneCookiesInSandbox", base_feature: "none", // No status because this blink runtime feature doesn't work by itself. // It's controlled by the corresponding Chromium feature, // net::features::kAllowSameSiteNoneCookiesInSandbox, which needs to be // enabled to make the whole feature work. }, { // https://crbug.com/40681200 name: "AllowSkippingEditingBoundaryToMergeEnd", status: "stable", }, { name: "AllowSvgUseToReferenceExternalDocumentRoot", status: "stable", }, { name: "AllowSyntheticTimingForCanvasCapture", base_feature: "none", status: { "Mac": "stable", "default": "" } }, { name: "AllowURNsInIframes", base_feature: "none", }, { // Enables the new behavior for this spec change: // https://github.com/whatwg/html/pull/11457 // https://issues.chromium.org/issues/433545121 // https://chromestatus.com/feature/5179013869993984 name: "AncestorRevealingNewSpec", status: "stable", }, { // Kill switch for https://crbug.com/415834974 which changes anchor // positioning adjustments to occur even in cases where there is no // scrollable overflow. name: "AnchorPositionAdjustmentWithoutOverflow", status: "stable", }, { // Switch for https://crbug.com/445371140 which changes the initial value // for position-visibility to 'anchors-visible' per current spec. name: "AnchorsVisibleInitialValue", status: "stable", }, { name: "AndroidDownloadableFontsMatching", base_feature: "none", public: true, }, { // https://chromestatus.com/feature/5083257285378048 name: "AnimationProgressAPI", status: "stable", }, { // https://drafts.csswg.org/web-animations-2/#triggers name: "AnimationTrigger", status: "experimental", implied_by: ["EventTrigger", "TimelineTrigger"], }, { name: "AnimationWorklet", }, { name: "AnonymousIframe", status: "stable", }, { name: "AOMAriaRelationshipProperties", public: true, status: "stable", }, { name: "AOMAriaRelationshipPropertiesAriaOwns", public: true, status: "experimental", depends_on: ["AOMAriaRelationshipProperties"], }, { // appearance:base for in-page form controls. // https://drafts.csswg.org/css-forms-1/ // https://issues.chromium.org/issues/450139531 // https://chromestatus.com/feature/5104958101913600 name: "AppearanceBase", status: "experimental", }, { name: "ApproximateGeolocationPermission", // This feature is controlled by the kApproximateGeolocationPermission // base::Feature in the browser process. base_feature: "none", }, { name: "AppTitle", status: "experimental", origin_trial_feature_name: "AppTitle", origin_trial_os: ["win", "mac", "linux", "chromeos"], base_feature: "WebAppEnableAppTitle", }, { name: "AriaActions", status: "experimental", }, { name: "AriaNotify", status: {"Android": "stable", "Win": "stable", "Mac": "stable", "Linux": "stable"}, implied_by: ["AriaNotifyV2"], }, { name: "AriaNotifyV2", status: {"Android": "test", "Win": "test", "Mac": "test", "Linux": "test"}, }, { name: "AriaRowColIndexText", status: "stable", }, { // Fix Asymmetric word navigation behavior on Windows when punctuation follows whitespace // See https://crbug.com/40252703 name: "AsymmetricWordBoundaryFix", status: "stable", }, { // When enabled, perform async IPCs from CookieJar::SetCookie to the // network service. name: "AsyncSetCookie", status: "stable", }, { name: "AttributionReporting", status: "stable", base_feature: "none", public: true, }, { // AudioContext.playoutStats interface. // https://chromestatus.com/feature/5172818344148992 name: "AudioContextPlayoutStats", origin_trial_feature_name: "AudioContextPlayoutStats", status: "experimental", }, { name: "AudioContextSetSinkId", status: "stable", }, { name: "AudioOutputDevices", // Android support for switching audio output devices is not stable status: {"Android": "", "default": "stable"}, public: true, base_feature: "none" }, { name: "AudioVideoTracks", status: "experimental", }, { name: "AuthenticatorPasswordsOnlyImmediateRequests", base_feature: "none", public: true, }, { name: "AutoDarkMode", base_feature: "none", origin_trial_feature_name: "AutoDarkMode", }, { name: "Autofill", public: true, status: "test", base_feature: "none", }, { name: "AutomationControlled", base_feature: "none", public: true, settable_from_internals: true, }, { name: "AutoPictureInPictureVideoHeuristics", status: "experimental", }, { name: "AvoidForcedLayoutOnInvisibleDocumentClose", status: "test", }, { // If the start and end positions are the same in MoveParagraph, // there is no need to collapse the whitespace between them. // https://crbug.com/406053617 name: "AvoidNormalizingVisiblePositionsWhenStartEqualsEnd", status: "stable", }, { // Killswitch for https://crbug.com/40947850. name: "BackdropRootForClipPathWithBackdropFilter", status: "stable", }, // When enabled, enforces new interoperable semantics for 3D transforms. // See crbug.com/1008483. { name: "BackfaceVisibilityInterop", }, { name: "BackForwardCache", base_feature: "none", public: true, }, { name: "BackForwardCacheExperimentHTTPHeader", origin_trial_feature_name: "BackForwardCacheExperimentHTTPHeader", status: "experimental", base_feature: "none", }, { name: "BackForwardCacheNotRestoredReasons", status: "stable", origin_trial_feature_name: "BackForwardCacheNotRestoredReasons", base_feature: "BackForwardCacheSendNotRestoredReasons", base_feature_status: "enabled", copied_from_base_feature_if: "overridden", }, { name: "BackForwardCacheRestorationPerformanceEntry", status: "experimental", }, { name: "BackForwardCacheUpdateNotRestoredReasonsName", status: "stable", }, { name: "BackgroundClipTextDecoration", status: "stable", }, { name: "BackgroundFetch", public: true, status: "stable", base_feature: "none", }, // A developer opt-out for background page freezing. { name: "BackgroundPageFreezeOptOut", base_feature: "none", origin_trial_feature_name: "BackgroundPageFreezeOptOut", origin_trial_type: "deprecation", }, { name: "BarcodeDetector", status: { // Built-in barcode detection APIs are only available from some // platforms. See //services/shape_detection. "Android": "stable", "ChromeOS": "stable", "Mac": "stable", "default": "test", }, }, { name: "BidiCaretAffinity", }, { name: "BlinkExtensionChromeOS", browser_process_read_write_access: true, }, { name: "BlinkExtensionChromeOSKiosk", depends_on: ["BlinkExtensionChromeOS"], browser_process_read_write_access: true, }, { name: "BlinkExtensionWebView", public: true, }, { name: "BlinkExtensionWebViewMediaIntegrity", public: true, }, { name: "BlinkLifecycleScriptForbidden", }, { name: "BlinkRuntimeCallStats", }, { // https://chromestatus.com/feature/4830298126417920 name: "BlobBytes", status: "stable", }, { name: "BlockingFocusWithoutUserActivation", status: "experimental", }, // https://chromestatus.com/feature/5176753681203200 { name: "BorderRadiusCorrectionCoverageFactor", status: "test", }, // https://crbug.com/415304289: Mouse and Pointer boundary event dispatch // (i.e. dispatch of enter, leave, over, out events) tracks DOM node removal // to fix event pairing on ancestor nodes. { name: "BoundaryEventDispatchTracksNodeRemoval", public: true, status: "stable", }, { name: "BrowserInitiatedAutomaticPictureInPicture", public: true, status: "experimental", }, { name: "BrowserVerifiedUserActivationKeyboard", base_feature: "none", public: true, }, { name: "BrowserVerifiedUserActivationMouse", base_feature: "none", public: true, }, { name: "BufferedBytesConsumerLimitSize", status: "stable", }, { // Bypasses the enforcement of the Page Embedded Permission Control // security checks. This flag is disabled by default and should only be // enabled in automated tests in order to allow them to avoid needing to // wait until the PEPC is validated and also to use JS-initiated clicks. name: "BypassPepcSecurityForTesting", }, { // Enables RFC 7234-compliant Cache-Control header parsing, removing RFC // 2616 separators that are not valid in RFC 7234. // https://crbug.com/42050325 name: "CacheControlRFC7234Parsing", status: "experimental", }, { // Enables metrics collection comparing RFC 7234 vs RFC 2616 Cache-Control // parsing. Performs double parsing on every Cache-Control header to // measure behavioral differences. Can be disabled as a kill switch if // performance issues arise. // https://crbug.com/42050325 name: "CacheControlRFC7234ParsingMetrics", status: "experimental", }, { name: "CacheStorageCodeCacheHint", origin_trial_feature_name: "CacheStorageCodeCacheHint", status: "experimental", base_feature: "none", }, { name: "CallExitNodeWithoutLayoutObject", status: "stable", }, { name: "Canvas2dCanvasFilter", status: "experimental", }, { name: "Canvas2dGPUTransfer", status: "experimental", }, { name: "Canvas2dImageChromium", base_feature: "none", public: true, }, { name: "Canvas2dLayers", }, { name: "Canvas2dLayersWithOptions", status: "experimental", depends_on: ["Canvas2dLayers"], }, { name: "Canvas2dMesh", origin_trial_feature_name: "Canvas2dMesh", origin_trial_allows_third_party: true, status: "test", }, { // https://github.com/WICG/html-in-canvas/blob/main/README.md // Note the API name has changed to `drawElementImage`. name: "CanvasDrawElement", status: "test", }, { // Remove the restriction that drawElementImage can only draw immediate children // of the canvas, and allow drawing canvas descendants. name: "CanvasDrawElementInSubtree", depends_on: ["CanvasDrawElement"], }, { name: "CanvasFloatingPoint", status: "stable", }, { // Canvas2D API for specifying HDR headroom for drawing operations. // https:/crbug.com/428575083, https://github.com/whatwg/html/issues/11165 name: "CanvasGlobalHDRHeadroom", status: "experimental", }, { // https://crbug.com/394052224 name: "CanvasGradientCSSColor4", status: "experimental", }, { name: "CanvasHDR", status: "experimental", }, { // crbug.com/389726691. name: "CanvasTextMemoryPressure", status: "stable", }, { // crbug.com/450531794. name: "CanvasTextSwitchFrameOnFinalize", status: "stable", }, { // crbug.com/450531794. name: "CanvasTextTexImage2DFix", status: "stable", }, { // Canvas2D API for specifying HDR tone mapping behavior. // https:/crbug.com/448552449, https://github.com/whatwg/html/issues/11424 name: "CanvasToneMapping", status: "experimental", }, { // Kill switch for https://crbug.com/330506337. name: "CanvasUsesArcPaintOp", status: "stable", }, { name: "CapabilityDelegationDisplayCaptureRequest", status: "experimental", }, { name: "CaptureController", status: {"Android": "", "default": "stable"}, }, { // TODO(crbug.com/1444712): Before enabling that flag by default, // make sure MouseCursorOverlayController does not transmit mouse // events to a CaptureController that don't have any // capturedmousechange listener attached to it. // See https://github.com/screen-share/mouse-events/issues/14 name: "CapturedMouseEvents", "depends_on": ["CaptureController"], status: {"Android": "", "default": "test"}, }, { name: "CapturedSurfaceControl", status: {"Android": "", "default": "stable"} }, { name: "CapturedSurfaceResolution", status: { "Win": "stable", "Mac": "stable", "ChromeOS": "stable", "default": ""}, }, { name: "CaptureHandle", depends_on: ["GetDisplayMedia"], status: {"Android": "", "default": "stable"}, }, { // crbug.com/446475645 name: "CaretPositionFromPointTextareaFix", status: "stable", }, { // Changes the caret's affinity to upstream, preventing spaces // from appearing in the previous line when typing at the start // of a wrapped line. See https://crbug.com/40677155 name: "CaretWithTextAffinityUpstream", status: "stable", }, { // Kill switch for changes to RenderFrameMetadataObserverImpl in connection with Engagement // Signals. See https://crrev.com/c/4544201 and https://crbug.com/1458640. name: "CCTNewRFMPushBehavior", base_feature_status: "enabled", }, { // If focus is not at canonical position then spellcheck should be deactivated. // crbug.com/396485529 name: "CheckForCanonicalPositionInIdleSpellCheck", status: "stable", }, { name: "CheckVisibilityExtraProperties", status: "stable", }, { // Set currentTarget to null after dispatch for EventTarget. // This was added in M142 and can be removed after M144. // https://issues.chromium.org/issues/346766786 name: "ClearCurrentTargetAfterDispatch", status: "stable", }, { // Determine clearing of target and relatedTarget by checking // if the top node is in shadow tree. // This was added in M142 and can be removed after M144. // https://issues.chromium.org/issues/373655918 // https://issues.chromium.org/issues/40253359 name: "ClearTargetOnlyIfInShadowTree", status: "stable", }, { // Allows top-level sites to restrict collection of high-entropy UA client // hints (from 3Ps, or itself) via the getHighEntropyValues API. // crbug.com/385161047 name: "ClientHintUAHighEntropyValuesPermissionPolicy", status: "stable", }, { // Enables clipboardchange event API for listening for changes to the // system clipboard // https://chromestatus.com/feature/5085102657503232 name: "ClipboardChangeEvent", origin_trial_feature_name: "ClipboardChangeEvent", status: "stable", }, // This ensures that clipboard event fires on a target node which is // focused in case no visible selection is present. // crbug.com/40735783 { name: "ClipboardEventTargetCanBeFocusedElement", status: "stable", }, { // Allows usecounter in `ClipboardItem` name: "ClipboardItemGetTypeCounter", status: "stable", }, { // Support ClipboardItemData of Promise type according to spec // https://w3c.github.io/clipboard-apis/#typedefdef-clipboarditemdata name: "ClipboardItemWithDOMStringSupport", status: "stable", }, { // TODO(crbug.com/440374239): Disabled due to https://crbug.com/440374239. name: "ClipElementVisibleBoundsInLocalRoot", }, { name: "ClipPathNestedRasterOptimization", status: "stable", }, { // Avoid queuing a task to fire a selectionchange event when there is already a task scheduled // to do that for the target according to the new spec: // https://w3c.github.io/selection-api/#scheduling-selectionhange-event name: "CoalesceSelectionchangeEvent", status: "stable", }, { name: "CoepReflection", status: "test", }, { name: "CollapseZeroWidthSpaceWhenReuseItem", status: "stable", }, { name: "CollectWidthAndHeightAsPresentationAttributesForUse", status: "stable", }, { name: "CollectWidthAndHeightAsStylesForNestedSvg", status: "stable", }, // Enable the display-p3-linear color space in CSS. // https://chromestatus.com/feature/5162372125818880 { name: "ColorSpaceDisplayP3Linear", status: "stable", }, // Enable the srgb-linear and display-p3-linear color spaces in // PredefinedColorSpace. // https://chromestatus.com/feature/5122501071994880 { name: "ColorSpacePredefinedLinearSpaces", status: "experimental", }, // Enable the rec2100-linear color space in CSS and PredefinedColorSpace. // https://chromestatus.com/feature/5204024772788224 { name: "ColorSpaceRec2100Linear", status: "experimental", }, { // Makes the command event not composed. Launched in M141. // https://github.com/whatwg/html/pull/11255 // https://issues.chromium.org/issues/414826954 name: "CommandEventNotComposed", status: "stable", }, { // Return the current target from composedPath() while // dispatching. // This was added in M142 and can be removed after M144. // https://issues.chromium.org/issues/444932649 // https://issues.chromium.org/issues/346766786 name: "ComposedPathReturnTargetBeingDispatched", status: "stable", }, { name: "CompositeBGColorAnimation", public: true, status: "stable", base_feature: "none", }, { name: "CompositeBoxShadowAnimation", }, { name: "CompositeClipPathAnimation", status: "experimental", public: true, }, { name: "CompositedAnimationsCancelledAsynchronously", status: "stable" }, { name: "CompositedSelectionUpdate", public: true, status: {"Android": "stable"}, base_feature: "none", }, { name: "CompositingDecisionAtAnimationPhaseBoundaries" }, { name: "CompositionForegroundMarkers", status: { "Android": "stable", "default": "", } }, { // When enabled, EventTriggers[1] will function via cc::EventTrigger // objects that live on the compositor thread. // [1] https://drafts.csswg.org/css-animations-2/#event-triggers name: "CompositorEventTrigger" }, { // When enabled, TimelineTriggers[1] will function via cc::TimelineTrigger // objects that live on the compositor thread. // [1] https://drafts.csswg.org/css-animations-2/#timeline-triggers name: "CompositorTimelineTrigger", }, { name: "CompressionDictionaryTransport", base_feature: "none", public: true, }, { name: "ComputedAccessibilityInfo", status: "experimental", }, { name: "ComputeInlineContentsSafeRetarget", status: "stable", }, { name: "ComputePressure", status: { "Android": "", "default": "stable", } }, { name: "ComputePressureOwnContributionEstimate", status: { "Android": "", "default": "experimental", } }, { // Fix for https://crbug.com/40659076. When enabled, queryCommandState for // 'subscript' or 'superscript' with a caret selection will consider // ancestor or elements, matching the behavior for range // selections. name: "ConsiderSubOrSuperScriptAncestorAlignForCaretSelection", status: "stable" }, { name: "ContactsManager", status: {"Android": "stable", "default": "test"}, }, { name: "ContactsManagerExtraProperties", status: {"Android": "stable", "default": "test"}, }, { name: "ContainerTiming", status: "experimental", }, { name: "ContentIndex", status: {"Android": "stable", "default": "experimental"}, }, { name: "ContextMenu", status: "experimental", }, { // Enable support for Controlled Frame, providing the Controlled // Frame tag to IWA apps and other contexts. See // https://github.com/WICG/controlled-frame/blob/main/README.md for more // info. name: "ControlledFrame", public: true, status: "stable", }, { // Experimental support for requesting SecurityInfo // in WebRequest API for controlled frames. name: "ControlledFrameWebRequestSecurityInfo", status: "test", depends_on: ["ControlledFrame"], }, { name: "CookieDeprecationFacilitatedTesting", base_feature: "none", }, { // Enables setting the `maxAge` option when creating a cookie in the // Cookie Store API. name: "CookieStoreAPIMaxAge", status: "experimental", }, { name: "CoopRestrictProperties", origin_trial_feature_name: "CoopRestrictProperties", base_feature: "none", }, { // Corrects the handling of
elements nested within