termwiz-0.22.0/.cargo_vcs_info.json0000644000000001450000000000100126160ustar { "git": { "sha1": "fdcf1a794baf5703a200dcc06d94da8332059617" }, "path_in_vcs": "termwiz" }termwiz-0.22.0/CHANGELOG.md000064400000000000000000000020531046102023000132170ustar 00000000000000## termwiz-0.20.0: * Support for horizontal scroll wheel event decoding. Thanks to [@tlinford](https://github.com/tlinford)! [#2813](https://github.com/wez/wezterm/issues/2813) * Correctly recognize `Alt-[` keyboard events. Thanks to [@imsnif](https://github.com/imsnif)! [#3009](https://github.com/wez/wezterm/pull/3009) * Adjusted Line clustering when bidi is disabled to improve perf when used in wezterm * Fix crash bug when using to TeenyString inside Cell with Rust 1.67 * Updated nerdfonts metadata for v2.3.3 ## termwiz-0.19.0: * Added `Action::PrintString` to more efficiently accumulate sequences of printed characters. * Fixed build on 32-bit platforms * Fixed build on Android systems * Updates for Unicode 15 * Widgets can now control cursor visibility * BREAKING: We now request modifyOtherKeys when setting up the unix terminal. As a consequence, CTRL keys like `CTRL-C` are now reported as `CTRL-lower-case-c` rather than `CTRL-upper-case-C`. We do this even when modifyOtherKeys isn't active for the sake of overall consistency. termwiz-0.22.0/Cargo.lock0000644000001347700000000000100106050ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "anes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "atomic" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi 0.1.19", "libc", "winapi", ] [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bit-set" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bit_field" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" dependencies = [ "serde", ] [[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.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytemuck" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cassowary" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "cast" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "ciborium" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", "serde", ] [[package]] name = "ciborium-io" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half 1.8.2", ] [[package]] name = "clap" version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "bitflags 1.3.2", "clap_lex", "indexmap", "textwrap", ] [[package]] name = "clap_lex" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" dependencies = [ "os_str_bytes", ] [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355" dependencies = [ "is-terminal", "lazy_static", "winapi", ] [[package]] name = "cpufeatures" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "criterion" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" dependencies = [ "anes", "atty", "cast", "ciborium", "clap", "criterion-plot", "itertools", "lazy_static", "num-traits", "oorandom", "plotters", "rayon", "regex", "serde", "serde_derive", "serde_json", "tinytemplate", "walkdir", ] [[package]] name = "criterion-plot" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", "itertools", ] [[package]] name = "crossbeam-deque" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 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.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "csscolorparser" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" dependencies = [ "lab", "phf", ] [[package]] name = "deltae" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[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 = "dirs" version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", "winapi", ] [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "env_filter" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" dependencies = [ "log", "regex", ] [[package]] name = "env_logger" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9eeb342678d785662fd2514be38c459bb925f02b68dd2a3e0f21d7ef82d979dd" dependencies = [ "anstream", "anstyle", "env_filter", "humantime", "log", ] [[package]] name = "errno" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", "windows-sys", ] [[package]] name = "euclid" version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" dependencies = [ "num-traits", ] [[package]] name = "exr" version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "279d3efcc55e19917fff7ab3ddd6c14afb6a90881a0078465196fe2f99d08c56" dependencies = [ "bit_field", "flume", "half 2.3.1", "lebe", "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", ] [[package]] name = "fancy-regex" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" dependencies = [ "bit-set", "regex", ] [[package]] name = "fastrand" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] [[package]] name = "filedescriptor" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" dependencies = [ "libc", "thiserror", "winapi", ] [[package]] name = "finl_unicode" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" [[package]] name = "fixedbitset" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "flume" version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" dependencies = [ "futures-core", "futures-sink", "nanorand", "pin-project", "spin", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-sink" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[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 = "getrandom" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", "libc", "wasi", "wasm-bindgen", ] [[package]] name = "gif" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" dependencies = [ "color_quant", "weezl", ] [[package]] name = "half" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "half" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" dependencies = [ "cfg-if", "crunchy", ] [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hermit-abi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "image" version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", "color_quant", "exr", "gif", "jpeg-decoder", "num-traits", "png", "qoi", "tiff", ] [[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", ] [[package]] name = "is-terminal" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ "hermit-abi 0.3.4", "rustix", "windows-sys", ] [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] [[package]] name = "js-sys" version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] [[package]] name = "k9" version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32ddb58b0079a063218472916af599f2753ccb40942cdaba9d1f3fefccef17a9" dependencies = [ "anyhow", "colored", "diff", "lazy_static", "libc", "proc-macro2", "regex", "syn 1.0.109", "term_size", ] [[package]] name = "lab" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "leb128" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "lebe" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libredox" version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ "bitflags 2.4.2", "libc", "redox_syscall", ] [[package]] name = "linux-raw-sys" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "mac_address" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4863ee94f19ed315bf3bc00299338d857d4b5bc856af375cc97d237382ad3856" dependencies = [ "nix 0.23.2", "winapi", ] [[package]] name = "memchr" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmem" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" [[package]] name = "memoffset" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] [[package]] name = "memoffset" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", "simd-adler32", ] [[package]] name = "nanorand" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ "getrandom", ] [[package]] name = "nix" version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" dependencies = [ "bitflags 1.3.2", "cc", "cfg-if", "libc", "memoffset 0.6.5", ] [[package]] name = "nix" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", ] [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "num-derive" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "num-traits" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "ordered-float" version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" dependencies = [ "num-traits", ] [[package]] name = "os_str_bytes" version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "pest" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" dependencies = [ "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" dependencies = [ "pest", "pest_generator", ] [[package]] name = "pest_generator" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", "syn 2.0.48", ] [[package]] name = "pest_meta" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" dependencies = [ "once_cell", "pest", "sha2", ] [[package]] name = "phf" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", "phf_shared", ] [[package]] name = "phf_codegen" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" dependencies = [ "phf_generator", "phf_shared", ] [[package]] name = "phf_generator" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", "rand", ] [[package]] name = "phf_macros" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", "syn 2.0.48", ] [[package]] name = "phf_shared" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ "siphasher", ] [[package]] name = "pin-project" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", "syn 2.0.48", ] [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "plotters" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" [[package]] name = "plotters-svg" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" dependencies = [ "plotters-backend", ] [[package]] name = "png" version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] [[package]] name = "proc-macro2" version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "qoi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ "bytemuck", ] [[package]] name = "quote" version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "rayon" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", "libredox", "thiserror", ] [[package]] name = "regex" version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rustix" version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", "windows-sys", ] [[package]] name = "ryu" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[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 = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ "semver-parser", ] [[package]] name = "semver-parser" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ "pest", ] [[package]] name = "serde" version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", "syn 2.0.48", ] [[package]] name = "serde_json" version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "signal-hook" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-registry" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smallvec" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ "lock_api", ] [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "tempfile" version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", "windows-sys", ] [[package]] name = "term_size" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" dependencies = [ "libc", "winapi", ] [[package]] name = "terminfo" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" dependencies = [ "dirs", "fnv", "nom", "phf", "phf_codegen", ] [[package]] name = "termios" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" dependencies = [ "libc", ] [[package]] name = "termwiz" version = "0.22.0" dependencies = [ "anyhow", "base64", "bitflags 2.4.2", "cassowary", "criterion", "env_logger", "fancy-regex", "filedescriptor", "finl_unicode", "fixedbitset", "fnv", "hex", "image", "k9", "lazy_static", "libc", "log", "memmem", "nix 0.26.4", "num-derive", "num-traits", "ordered-float", "pest", "pest_derive", "phf", "semver", "serde", "sha2", "signal-hook", "siphasher", "tempfile", "terminfo", "termios", "thiserror", "ucd-trie", "unicode-segmentation", "varbincode", "vtparse", "wezterm-bidi", "wezterm-blob-leases", "wezterm-color-types", "wezterm-dynamic", "wezterm-input-types", "winapi", ] [[package]] name = "textwrap" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", "syn 2.0.48", ] [[package]] name = "tiff" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", "weezl", ] [[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.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-segmentation" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "atomic", "getrandom", "serde", ] [[package]] name = "varbincode" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b712fa900b441e2d5226a094ca37ca70c0d26d26b79822a5cf34a853a9e26f9f" dependencies = [ "byteorder", "leb128", "serde", ] [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vtparse" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" dependencies = [ "utf8parse", ] [[package]] name = "walkdir" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "web-sys" version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "weezl" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wezterm-bidi" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" dependencies = [ "log", "wezterm-dynamic", ] [[package]] name = "wezterm-blob-leases" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5a5e0adf7eed68976410def849a4bdab6f6e9f6163f152de9cb89deea9e60b" dependencies = [ "getrandom", "mac_address", "once_cell", "serde", "sha2", "thiserror", "uuid", ] [[package]] name = "wezterm-color-types" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" dependencies = [ "csscolorparser", "deltae", "lazy_static", "serde", "wezterm-dynamic", ] [[package]] name = "wezterm-dynamic" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfb128bacfa86734e07681fb6068e34c144698e84ee022d6e009145d1abb77b5" dependencies = [ "log", "ordered-float", "strsim", "thiserror", "wezterm-dynamic-derive", ] [[package]] name = "wezterm-dynamic-derive" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9f5ef318442d07b3d071f9f43ea40b80992f87faee14bb4d017b6991c307f0" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] [[package]] name = "wezterm-input-types" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" dependencies = [ "bitflags 1.3.2", "euclid", "lazy_static", "serde", "wezterm-dynamic", ] [[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] [[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-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "zune-inflate" version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] termwiz-0.22.0/Cargo.toml0000644000000070040000000000100106150ustar # 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 = "2018" name = "termwiz" version = "0.22.0" authors = ["Wez Furlong"] description = "Terminal Wizardry for Unix and Windows" documentation = "https://docs.rs/termwiz" readme = "README.md" keywords = [ "terminal", "readline", "console", "curses", ] license = "MIT" repository = "https://github.com/wez/wezterm" resolver = "2" [package.metadata.docs.rs] features = ["docs"] rustdoc-args = [ "--cfg", "feature=\"docs\"", ] [[bench]] name = "wcwidth" harness = false [[bench]] name = "cell" harness = false [dependencies.anyhow] version = "1.0" [dependencies.base64] version = "0.21" [dependencies.bitflags] version = "2.0" [dependencies.cassowary] version = "0.3" optional = true [dependencies.fancy-regex] version = "0.11" [dependencies.filedescriptor] version = "0.8" [dependencies.finl_unicode] version = "1.2" [dependencies.fixedbitset] version = "0.4" [dependencies.fnv] version = "1.0" optional = true [dependencies.hex] version = "0.4" [dependencies.image] version = "0.24.6" optional = true [dependencies.lazy_static] version = "1.4" [dependencies.libc] version = "0.2" [dependencies.log] version = "0.4" [dependencies.memmem] version = "0.1" [dependencies.num-derive] version = "0.3" features = ["full-syntax"] [dependencies.num-traits] version = "0.2" [dependencies.ordered-float] version = "4.1" [dependencies.pest] version = "2.1" [dependencies.pest_derive] version = "2.1" [dependencies.phf] version = "0.11" [dependencies.semver] version = "0.11" [dependencies.serde] version = "1.0" features = [ "rc", "derive", ] optional = true [dependencies.sha2] version = "0.10" [dependencies.siphasher] version = "0.3" [dependencies.tempfile] version = "3.4" [dependencies.terminfo] version = "0.8" [dependencies.thiserror] version = "1.0" [dependencies.ucd-trie] version = "0.1" [dependencies.unicode-segmentation] version = "1.8" [dependencies.vtparse] version = "0.6.2" [dependencies.wezterm-bidi] version = "0.2.1" [dependencies.wezterm-blob-leases] version = "0.1" [dependencies.wezterm-color-types] version = "0.3" [dependencies.wezterm-dynamic] version = "0.2" [dependencies.wezterm-input-types] version = "0.1" default-features = false [dev-dependencies.criterion] version = "0.4" [dev-dependencies.env_logger] version = "0.11" [dev-dependencies.k9] version = "0.11" [dev-dependencies.varbincode] version = "0.1" [features] docs = [ "widgets", "use_serde", ] use_image = ["image"] use_serde = [ "serde", "wezterm-color-types/use_serde", "wezterm-blob-leases/serde", "bitflags/serde", "wezterm-input-types/serde", ] widgets = [ "cassowary", "fnv", ] [target."cfg(unix)".dependencies.nix] version = "0.26" [target."cfg(unix)".dependencies.signal-hook] version = "0.3" [target."cfg(unix)".dependencies.termios] version = "0.3" [target."cfg(windows)".dependencies.winapi] version = "0.3.9" features = [ "winbase", "winerror", "winnls", "winuser", "consoleapi", "handleapi", "fileapi", "synchapi", "memoryapi", "winnt", "impl-default", ] termwiz-0.22.0/Cargo.toml.orig0000644000000044370000000000100115630ustar [package] authors = ["Wez Furlong"] name = "termwiz" version = "0.22.0" edition = "2018" repository = "https://github.com/wez/wezterm" description = "Terminal Wizardry for Unix and Windows" license = "MIT" documentation = "https://docs.rs/termwiz" keywords = ["terminal", "readline", "console", "curses"] readme = "README.md" [dependencies] # backtrace = "0.3" base64 = "0.21" bitflags = "2.0" cassowary = {version="0.3", optional=true} anyhow = "1.0" fancy-regex = "0.11" filedescriptor = { version="0.8", path = "../filedescriptor" } finl_unicode = "1.2" fixedbitset = "0.4" fnv = {version="1.0", optional=true} hex = "0.4" image = {version="0.24.6", optional=true} lazy_static = "1.4" libc = "0.2" log = "0.4" memmem = "0.1" num-traits = "0.2" ordered-float = "4.1" pest = "2.1" pest_derive = "2.1" phf = "0.11" semver = "0.11" serde = {version="1.0", features = ["rc", "derive"], optional=true} siphasher = "0.3" sha2 = "0.10" tempfile = "3.4" terminfo = "0.8" thiserror = "1.0" unicode-segmentation = "1.8" ucd-trie = "0.1" vtparse = { version="0.6.2", path="../vtparse" } wezterm-bidi = { path = "../bidi", version="0.2.1" } wezterm-blob-leases = { path = "../wezterm-blob-leases", version="0.1" } wezterm-color-types = { path = "../color-types", version="0.3" } wezterm-input-types = { path = "../wezterm-input-types", version="0.1", default-features=false } wezterm-dynamic = { path = "../wezterm-dynamic", version="0.2" } [features] widgets = ["cassowary", "fnv"] use_serde = ["serde", "wezterm-color-types/use_serde", "wezterm-blob-leases/serde", "bitflags/serde", "wezterm-input-types/serde"] use_image = ["image"] docs = ["widgets", "use_serde"] [dev-dependencies] criterion = "0.4" varbincode = "0.1" k9 = "0.11" env_logger = "0.11" [dependencies.num-derive] features = ["full-syntax"] version = "0.3" [target."cfg(unix)".dependencies] signal-hook = "0.3" termios = "0.3" nix = "0.26" [target."cfg(windows)".dependencies.winapi] features = [ "winbase", "winerror", "winnls", "winuser", "consoleapi", "handleapi", "fileapi", "synchapi", "memoryapi", "winnt", "impl-default" ] version = "0.3.9" [package.metadata.docs.rs] features = ["docs"] rustdoc-args = ["--cfg", "feature=\"docs\""] [[bench]] name = "wcwidth" harness = false [[bench]] name = "cell" harness = false termwiz-0.22.0/Cargo.toml.orig000064400000000000000000000044371046102023000143050ustar 00000000000000[package] authors = ["Wez Furlong"] name = "termwiz" version = "0.22.0" edition = "2018" repository = "https://github.com/wez/wezterm" description = "Terminal Wizardry for Unix and Windows" license = "MIT" documentation = "https://docs.rs/termwiz" keywords = ["terminal", "readline", "console", "curses"] readme = "README.md" [dependencies] # backtrace = "0.3" base64 = "0.21" bitflags = "2.0" cassowary = {version="0.3", optional=true} anyhow = "1.0" fancy-regex = "0.11" filedescriptor = { version="0.8", path = "../filedescriptor" } finl_unicode = "1.2" fixedbitset = "0.4" fnv = {version="1.0", optional=true} hex = "0.4" image = {version="0.24.6", optional=true} lazy_static = "1.4" libc = "0.2" log = "0.4" memmem = "0.1" num-traits = "0.2" ordered-float = "4.1" pest = "2.1" pest_derive = "2.1" phf = "0.11" semver = "0.11" serde = {version="1.0", features = ["rc", "derive"], optional=true} siphasher = "0.3" sha2 = "0.10" tempfile = "3.4" terminfo = "0.8" thiserror = "1.0" unicode-segmentation = "1.8" ucd-trie = "0.1" vtparse = { version="0.6.2", path="../vtparse" } wezterm-bidi = { path = "../bidi", version="0.2.1" } wezterm-blob-leases = { path = "../wezterm-blob-leases", version="0.1" } wezterm-color-types = { path = "../color-types", version="0.3" } wezterm-input-types = { path = "../wezterm-input-types", version="0.1", default-features=false } wezterm-dynamic = { path = "../wezterm-dynamic", version="0.2" } [features] widgets = ["cassowary", "fnv"] use_serde = ["serde", "wezterm-color-types/use_serde", "wezterm-blob-leases/serde", "bitflags/serde", "wezterm-input-types/serde"] use_image = ["image"] docs = ["widgets", "use_serde"] [dev-dependencies] criterion = "0.4" varbincode = "0.1" k9 = "0.11" env_logger = "0.11" [dependencies.num-derive] features = ["full-syntax"] version = "0.3" [target."cfg(unix)".dependencies] signal-hook = "0.3" termios = "0.3" nix = "0.26" [target."cfg(windows)".dependencies.winapi] features = [ "winbase", "winerror", "winnls", "winuser", "consoleapi", "handleapi", "fileapi", "synchapi", "memoryapi", "winnt", "impl-default" ] version = "0.3.9" [package.metadata.docs.rs] features = ["docs"] rustdoc-args = ["--cfg", "feature=\"docs\""] [[bench]] name = "wcwidth" harness = false [[bench]] name = "cell" harness = false termwiz-0.22.0/LICENSE.md000064400000000000000000000020541046102023000130130ustar 00000000000000MIT License Copyright (c) 2018 Wez Furlong 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. termwiz-0.22.0/README.md000064400000000000000000000035501046102023000126700ustar 00000000000000# Terminal Wizardry This is a rust crate that provides a number of support functions for applications interested in either displaying data to a terminal or in building a terminal emulator. It is currently in active development and subject to fairly wild sweeping changes. Included functionality: * `Surface` models a terminal display and its component `Cell`s * Terminal attributes are aware of modern features such as True Color, [Hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda) and will also support sixel and iterm style terminal graphics display. * `Surface`s include a log of `Change`s and an API for consuming and applying deltas. This is a powerful building block for synchronizing screen instances. * Escape sequence parser decodes inscrutable escape sequences and gives them semantic meaning, making the code that uses them clearer. The decoded escapes can be re-encoded, allowing applications to start with the semantic meaning and emit the appropriate escape sequence without embedding obscure binary bytes. * `Capabilities` allows probing for terminal capabilities that may not be included in the system terminfo database, and overriding them in an embedding application. * `Terminal` trait provides an abstraction over unix style ttys and Windows style console APIs. `Change`s from `Surface` can be rendered to `Terminal`s. `Terminal`s allow decoding mouse and keyboard inputs in both blocking or non-blocking mode. * `Widget` trait allows composition of UI elements at a higher level. * `LineEditor` implements shell-like line editing functionality. # Windows Support Termwiz understands how to work with both the legacy console APIs and the new PTY and virtual terminal features available in Windows 10, allowing for true color terminal applications on Windows 10. # Documentation https://docs.rs/termwiz termwiz-0.22.0/benches/cell.rs000064400000000000000000000015351046102023000143060ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, Criterion}; use termwiz::cell::{Cell, CellAttributes}; pub fn criterion_benchmark(c: &mut Criterion) { c.bench_function("Cell::blank", |b| b.iter(|| black_box(Cell::blank()))); c.bench_function("Cell::new", |b| { b.iter(|| Cell::new(black_box('a'), CellAttributes::default())) }); c.bench_function("Cell::new_grapheme", |b| { b.iter(|| Cell::new_grapheme(black_box("a"), CellAttributes::default(), None)) }); c.bench_function("Cell::new_grapheme_with_width", |b| { b.iter(|| Cell::new_grapheme_with_width(black_box("a"), 1, CellAttributes::default())) }); c.bench_function("CellAttributes::blank", |b| { b.iter(|| black_box(CellAttributes::blank())) }); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); termwiz-0.22.0/benches/wcwidth.rs000064400000000000000000000060601046102023000150360ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, Criterion}; use termwiz::cell::{grapheme_column_width, UnicodeVersion}; include!("../src/widechar_width.rs"); pub fn criterion_benchmark(c: &mut Criterion) { let table = WcLookupTable::new(); { let mut group = c.benchmark_group("Classify ASCII"); group.bench_function("WcWidth", |b| b.iter(|| WcWidth::from_char(black_box('a')))); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('a'))) }); group.finish(); } { let mut group = c.benchmark_group("Classify DoubleWidth"); group.bench_function("WcWidth", |b| { b.iter(|| WcWidth::from_char(black_box('\u{1100}'))) }); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('\u{1100}'))) }); group.finish(); } { let mut group = c.benchmark_group("Classify WidenedIn9"); group.bench_function("WcWidth", |b| { b.iter(|| WcWidth::from_char(black_box('\u{231a}'))) }); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('\u{231a}'))) }); group.finish(); } { let mut group = c.benchmark_group("Classify Unassigned"); group.bench_function("WcWidth", |b| { b.iter(|| WcWidth::from_char(black_box('\u{fbc9}'))) }); group.bench_function("WcLookupTable", |b| { b.iter(|| table.classify(black_box('\u{fbc9}'))) }); group.finish(); } { let mut group = c.benchmark_group("column_width ASCII"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("a"), None)) }); group.finish(); } { let mut group = c.benchmark_group("column_width variation selector"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{00a9}\u{FE0F}"), None)) }); group.finish(); } { let mut group = c.benchmark_group("column_width variation selector unicode 14"); let version = UnicodeVersion { version: 14, ambiguous_are_wide: false, }; group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{00a9}\u{FE0F}"), Some(version))) }); group.finish(); } { let mut group = c.benchmark_group("column_width WidenedIn9"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{231a}"), None)) }); group.finish(); } { let mut group = c.benchmark_group("column_width Unassigned"); group.bench_function("grapheme_column_width", |b| { b.iter(|| grapheme_column_width(black_box("\u{fbc9}"), None)) }); group.finish(); } } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); termwiz-0.22.0/data/wezterm000064400000000000000000000054351046102023000137460ustar 00000000000000 wezterm|Wez's terminal emulatorPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&*.ÿÿ9JLPWÿÿYfÿÿjnx|€ÿÿ‡‹•ÿÿ§¬±ÿÿ¶»ÀÅÎÒÙÿÿëðöüÿÿÿÿÿÿÿÿÿÿ#ÿÿ'ÿÿÿÿÿÿ)ÿÿ.ÿÿÿÿÿÿÿÿ26<@DHNTZ`fjÿÿoÿÿsx}ˆÿÿ“›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£¬ÿÿÿÿµ¾ÇÐÙâëôýÿÿÿÿÿÿ1:ÿÿÿÿLOZ]_b¿ÿÿÂÄÿÿÿÿÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÍÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿÿ(/6ÿÿÿÿ=ÿÿDÿÿÿÿÿÿKÿÿÿÿÿÿÿÿÿÿRX^elsz‚Š’š¢ª²ºÁÈÏÖÞæîöþ$+2:BJRZbjry€‡Ž–ž¦®¶¾ÆÎÕÜãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèóø ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿŒËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  [%i%p1%d;%p2%dr[%i%p1%dG[%i%p1%d;%p2%dH [?25l[?12l[?25h[?12;25h]2;\(0[?1049h[%p1%dX(B(B[?1049l[?5h$<100/>[?5l\[!p[?3;4l>[3~OBOP[21~OQOROS[15~[17~[18~[19~[20~OH[2~OD[6~[5~OCOA[?1l>[?1h=[?1034l[?1034h[%p1%dP[%p1%dM[%p1%dB[%p1%d@[%p1%dS[%p1%dL[%p1%dD[%p1%dC[%p1%dT[%p1%dA%p1%c[%p2%{1}%-%dbc]104[!p[?3;4l>8[%i%p1%dd7 M%?%p9%t(0%e(B%;[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;mH ]0;OE``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~[?7h[?7lOFOM[3;2~[2;2~[6;2~[5;2~[23~[24~[15;2~[17;2~[18;2~[19;2~[20;2~[21;2~[23;2~[24;2~[15;5~[17;5~[18;5~[19;5~[20;5~[21;5~[23;5~[24;5~[15;6~[17;6~[18;6~[19;6~[20;6~[21;6~[23;6~[24;6~[15;3~[17;3~[18;3~[19;3~[20;3~[21;3~[23;3~[24;3~[%i%d;%dR[?%[;0123456789]c]104]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\[<[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;mlm '%+jp{…ž¾ÄÉ !$),16]112]12;%p1%s]52;%p1%s;%p2%s[2 q[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m[4:%p1%dm[%p1%d q[?2026%?%p1%{1}%-%tl%eh[?1006;1000%?%p1%{1}%=%th%el%;[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;TcCrCsMsSeSetulcSmolSmulxSsSyncXMrmxxsmxxxmtermwiz-0.22.0/data/wezterm.terminfo000064400000000000000000000107011046102023000155600ustar 00000000000000# This is Wez's term definition for wezterm. # It was reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color # and then has some additions in the top few lines (until the line starting # with am). # Tc: true color boolean for tmux # sitm/ritm: italics # Ms modifies the selection/clipboard. Its parameters are # p1 = the storage unit (clipboard, selection or cut buffer) # p2 = the base64-encoded clipboard content. # # Ss is used to set the cursor style as described by the DECSCUSR # function to a block or underline. # Se resets the cursor style to the terminal power-on default. # Smulx defines kitty style underline escape sequence support # # hs, dsl, fsl, tsl are used by nvim to amend the "status line". # These are not normally present for xterm and have assumed values # when TERM==xterm. When using this terminfo file that assumption is not # true and that functionality is broken. # We follow the foot's terminfo settings for these, based on # https://codeberg.org/dnkl/foot/pulls/243/files # although we use OSC 0 for the title rather than OSC 2. # https://github.com/neovim/neovim/issues/20706 # https://github.com/wez/wezterm/issues/2635 wezterm|Wez's terminal emulator, Tc, hs, sitm=\E[3m, ritm=\E[23m, Cr=\E]112\007, Cs=\E]12;%p1%s\007, Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2\sq, Ss=\E[%p1%d\sq, Smulx=\E[4:%p1%dm, Sync=\E[?2026%?%p1%{1}%-%tl%eh%;, Setulc=\E[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m, Smol=\E[53m, am, bce, ccc, km, mc5i, mir, msgr, npc, xenl, colors#0x100, cols#80, it#8, lines#24, pairs#0x7fff, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, dsl=\E]2;\E\\, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, fsl=\E\\, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=^?, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~, kind=\E[1;2B, knp=\E[6~, kpp=\E[5~, kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em, oc=\E]104\007, op=\E[39;49m, rc=\E8, rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l, rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rmxx=\E[29m, rs1=\Ec\E]104\007, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h\E[22;0;0t, smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m, smxx=\E[9m, tbc=\E[3g, tsl=\E]0;, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd, XM=\E[?1003;1006%?%p1%{1}%=%th%el%;, kmous=\E[<, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;, termwiz-0.22.0/data/xterm-256color000064400000000000000000000050211046102023000147500ustar 00000000000000%xterm-256color|xterm with 256 colorsPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&*.ÿÿ9JLPWÿÿYfÿÿjnx|ÿÿÿÿ€„‰Žÿÿ ¥ªÿÿ¯´¹¾ÇËÒÿÿäéïõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$ÿÿÿÿÿÿÿÿ(,26:>DJPV\`ÿÿeÿÿinsw~ÿÿ…‰‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™¢ÿÿÿÿ«´½ÆÏØáêóüÿÿÿÿÿÿ '0ÿÿÿÿBEPSUXµÿÿ¸ÿÿÿÿÿÿÿÿÿÿÿÿºÿÿÿÿÿÿÿÿ¾ÿÿóÿÿÿÿ÷ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ 'ÿÿÿÿ.ÿÿ5ÿÿÿÿÿÿ<ÿÿÿÿÿÿÿÿÿÿCIOV]dks{ƒ‹“›£«²¹ÀÇÏ×ßçï÷ÿ#+3;CKS[cjqx‡—Ÿ§¯·¿ÆÍÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙäéü ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÿÿÿÿÿÿ}¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ [%i%p1%d;%p2%dr[%i%p1%dG[%i%p1%d;%p2%dH [?25l[?12l[?25h[?12;25h(0[?1049h[%p1%dX(B(B[?1049l[?5h$<100/>[?5l[!p[?3;4l>[3~OBOP[21~OQOROS[15~[17~[18~[19~[20~OH[2~OD[6~[5~OCOA[?1l>[?1h=[?1034l[?1034h[%p1%dP[%p1%dM[%p1%dB[%p1%d@[%p1%dS[%p1%dL[%p1%dD[%p1%dC[%p1%dT[%p1%dA%p1%c[%p2%{1}%-%dbc]104[!p[?3;4l>8[%i%p1%dd7 M%?%p9%t(0%e(B%;[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;mH OE``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~[?7h[?7lOFOM[3;2~[2;2~[6;2~[5;2~[23~[24~[15;2~[17;2~[18;2~[19;2~[20;2~[21;2~[23;2~[24;2~[15;5~[17;5~[18;5~[19;5~[20;5~[21;5~[23;5~[24;5~[15;6~[17;6~[18;6~[19;6~[20;6~[21;6~[23;6~[24;6~[15;3~[17;3~[18;3~[19;3~[20;3~[21;3~[23;3~[24;3~[%i%d;%dR[?%[;0123456789]c]104]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;mlm G%+ ]112]12;%p1%s]52;%p1%s;%p2%s[2 q[%p1%d qTcCrCsMsSeSstermwiz-0.22.0/data/xterm-256color-italic.terminfo000064400000000000000000000074051046102023000200450ustar 00000000000000# This is Wez's augmented term definition for xterm. # It was reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color # and then has some additions in the top few lines (until the line starting # with am). # Tc: true color boolean for tmux # sitm/ritm: italics # Ms modifies the selection/clipboard. Its parameters are # p1 = the storage unit (clipboard, selection or cut buffer) # p2 = the base64-encoded clipboard content. # # Ss is used to set the cursor style as described by the DECSCUSR # function to a block or underline. # Se resets the cursor style to the terminal power-on default. xterm-256color|xterm with 256 colors, Tc, sitm=\E[3m, ritm=\E[23m, Cr=\E]112\007, Cs=\E]12;%p1%s\007, Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2\sq, Ss=\E[%p1%d\sq, am, bce, ccc, km, mc5i, mir, msgr, npc, xenl, colors#0x100, cols#80, it#8, lines#24, pairs#0x7fff, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=^?, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, knp=\E[6~, kpp=\E[5~, kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em, oc=\E]104\007, op=\E[39;49m, rc=\E8, rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l, rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec\E]104\007, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h\E[22;0;0t, smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd, # A xterm-256color based TERMINFO that adds the escape sequences for italic. xterm-256color-italic|xterm with 256 colors and italic, Tc, sitm=\E[3m, ritm=\E[23m, use=xterm-256color, termwiz-0.22.0/examples/buffered_terminal.rs000064400000000000000000000020041046102023000172430ustar 00000000000000//! This example shows how to use `BufferedTerminal` to queue //! up changes and then flush them. `BufferedTerminal` enables //! optimizing the output sequence to update the screen, which is //! important on links with poor connectivity. use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::AnsiColor; use termwiz::surface::Change; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let mut terminal = new_terminal(caps)?; terminal.set_raw_mode()?; let mut buf = BufferedTerminal::new(terminal)?; buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Maroon.into(), ))); buf.add_change("Hello world\r\n"); buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Red.into(), ))); buf.add_change("and in red here\r\n"); buf.flush()?; Ok(()) } termwiz-0.22.0/examples/gennerdfonts.rs000064400000000000000000000004641046102023000162720ustar 00000000000000//! This is used to generate a table in the wezterm docs fn main() { println!("| | |"); println!("|-|-|"); for &(label, c) in termwiz::nerdfonts::NERD_FONT_GLYPHS { println!( "|&#x{:x};|{}|", c as u32, label ); } } termwiz-0.22.0/examples/hello.rs000064400000000000000000000035571046102023000147070ustar 00000000000000use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::AnsiColor; use termwiz::input::{InputEvent, KeyCode, KeyEvent}; use termwiz::surface::{Change, Position, Surface}; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let terminal = new_terminal(caps)?; let mut buf = BufferedTerminal::new(terminal)?; let mut block = Surface::new(5, 5); block.add_change(Change::ClearScreen(AnsiColor::Blue.into())); buf.draw_from_screen(&block, 10, 10); buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Maroon.into(), ))); buf.add_change("Hello world\r\n"); buf.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Red.into(), ))); buf.add_change("and in red here\r\n"); buf.add_change(Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(20), }); buf.flush()?; buf.terminal().set_raw_mode()?; loop { match buf.terminal().poll_input(None) { Ok(Some(input)) => match input { InputEvent::Key(KeyEvent { key: KeyCode::Escape, .. }) => { break; } InputEvent::Key(KeyEvent { key: KeyCode::Char(c), .. }) => { buf.add_change(format!("{}", c)); buf.flush()?; } _ => { print!("{:?}\r\n", input); } }, Ok(None) => {} Err(e) => { print!("{:?}\r\n", e); break; } } } Ok(()) } termwiz-0.22.0/examples/key_tester.rs000064400000000000000000000011411046102023000157450ustar 00000000000000use termwiz::caps::Capabilities; use termwiz::input::{InputEvent, KeyCode, KeyEvent, Modifiers}; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; const CTRL_C: KeyEvent = KeyEvent { key: KeyCode::Char('c'), modifiers: Modifiers::CTRL, }; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let mut terminal = new_terminal(caps)?; terminal.set_raw_mode()?; while let Some(event) = terminal.poll_input(None)? { print!("{:?}\r\n", event); if event == InputEvent::Key(CTRL_C) { break; } } Ok(()) } termwiz-0.22.0/examples/line_editor.rs000064400000000000000000000071201046102023000160670ustar 00000000000000use std::str::FromStr; use termwiz::cell::AttributeChange; use termwiz::color::{AnsiColor, ColorAttribute, SrgbaTuple}; use termwiz::lineedit::*; #[derive(Default)] struct Host { history: BasicHistory, } impl LineEditorHost for Host { // Render the prompt with a darkslateblue background color if // the terminal supports true color, otherwise render it with // a navy blue ansi color. fn render_prompt(&self, prompt: &str) -> Vec { vec![ OutputElement::Attribute(AttributeChange::Background( ColorAttribute::TrueColorWithPaletteFallback( SrgbaTuple::from_str("darkslateblue").unwrap(), AnsiColor::Navy.into(), ), )), OutputElement::Text(prompt.to_owned()), ] } fn history(&mut self) -> &mut dyn History { &mut self.history } /// Demo of the completion API for words starting with "h" or "he" fn complete(&self, line: &str, cursor_position: usize) -> Vec { let mut candidates = vec![]; if let Some((range, word)) = word_at_cursor(line, cursor_position) { let words = &["hello", "help", "he-man"]; for w in words { if w.starts_with(word) { candidates.push(CompletionCandidate { range: range.clone(), text: w.to_string(), }); } } } candidates } } /// This is a conceptually simple function that computes the bounds /// of the whitespace delimited word at the specified cursor position /// in the supplied line string. /// It returns the range and the corresponding slice out of the line. /// This function is sufficient for example purposes; in a real application /// the equivalent function would need to be aware of quoting and other /// application specific context. fn word_at_cursor(line: &str, cursor_position: usize) -> Option<(std::ops::Range, &str)> { let char_indices: Vec<(usize, char)> = line.char_indices().collect(); if char_indices.is_empty() { return None; } let char_position = char_indices .iter() .position(|(idx, _)| *idx == cursor_position) .unwrap_or(char_indices.len()); // Look back until we find whitespace let mut start_position = char_position; while start_position > 0 && start_position <= char_indices.len() && !char_indices[start_position - 1].1.is_whitespace() { start_position -= 1; } // Look forwards until we find whitespace let mut end_position = char_position; while end_position < char_indices.len() && !char_indices[end_position].1.is_whitespace() { end_position += 1; } if end_position > start_position { let range = char_indices[start_position].0 ..char_indices .get(end_position) .map(|c| c.0 + 1) .unwrap_or(line.len()); Some((range.clone(), &line[range])) } else { None } } fn main() -> termwiz::Result<()> { println!("Type `exit` to quit this example, or start a word with `h` and press Tab."); let mut terminal = line_editor_terminal()?; let mut editor = LineEditor::new(&mut terminal); let mut host = Host::default(); loop { if let Some(line) = editor.read_line(&mut host)? { println!("read line: {:?}", line); if line == "exit" { break; } host.history().add(&line); } } Ok(()) } termwiz-0.22.0/examples/strip-ansi-escapes.rs000064400000000000000000000015731046102023000173120ustar 00000000000000//! This is a little utility that strips escape sequences from //! stdin and prints the result on stdout. //! It preserves only printable characters and CR, LF and HT. use std::io::{Read, Result}; use termwiz::escape::parser::Parser; use termwiz::escape::{Action, ControlCode}; fn main() -> Result<()> { let mut buf = [0u8; 4096]; let mut parser = Parser::new(); loop { let len = std::io::stdin().read(&mut buf)?; if len == 0 { return Ok(()); } parser.parse(&buf[0..len], |action| match action { Action::Print(c) => print!("{}", c), Action::Control(c) => match c { ControlCode::HorizontalTab | ControlCode::LineFeed | ControlCode::CarriageReturn => print!("{}", c as u8 as char), _ => {} }, _ => {} }); } } termwiz-0.22.0/examples/terminal_direct.rs000064400000000000000000000017101046102023000167360ustar 00000000000000//! This example shows how to render `Change`s directly to //! an instance of `Terminal`. When used in this way, the //! library performas no optimization on the change stream. //! Consider using the `Surface` struct to enable optimization; //! the `buffered_terminal.rs` example demonstrates a simple //! way to enable optimizations. use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::AnsiColor; use termwiz::surface::Change; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::Error; fn main() -> Result<(), Error> { let caps = Capabilities::new_from_env()?; let mut terminal = new_terminal(caps)?; terminal.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Text("Hello world\r\n".into()), Change::Attribute(AttributeChange::Foreground(AnsiColor::Red.into())), Change::Text("and in red here\r\n".into()), ])?; Ok(()) } termwiz-0.22.0/examples/widgets_basic.rs000064400000000000000000000124111046102023000164000ustar 00000000000000//! This example shows how to make a basic widget that accumulates //! text input and renders it to the screen #![allow(unused)] use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::{AnsiColor, ColorAttribute}; use termwiz::input::*; use termwiz::surface::Change; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; #[cfg(feature = "widgets")] use termwiz::widgets::*; use termwiz::Error; /// This is a widget for our application struct MainScreen<'a> { /// Holds the input text that we wish the widget to display text: &'a mut String, } impl<'a> MainScreen<'a> { /// Initialize the widget with the input text pub fn new(text: &'a mut String) -> Self { Self { text } } } #[cfg(feature = "widgets")] impl<'a> Widget for MainScreen<'a> { fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool { match event { WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Char(c), .. })) => self.text.push(*c), WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Enter, .. })) => { self.text.push_str("\r\n"); } WidgetEvent::Input(InputEvent::Paste(s)) => { self.text.push_str(&s); } _ => {} } true // handled it all } /// Draw ourselves into the surface provided by RenderArgs fn render(&mut self, args: &mut RenderArgs) { args.surface.add_change(Change::ClearScreen( ColorAttribute::TrueColorWithPaletteFallback( (0x31, 0x1B, 0x92).into(), AnsiColor::Black.into(), ), )); args.surface .add_change(Change::Attribute(AttributeChange::Foreground( ColorAttribute::TrueColorWithPaletteFallback( (0xB3, 0x88, 0xFF).into(), AnsiColor::Purple.into(), ), ))); let dims = args.surface.dimensions(); args.surface .add_change(format!("🤷 surface size is {:?}\r\n", dims)); args.surface.add_change(self.text.clone()); // Place the cursor at the end of the text. // A more advanced text editing widget would manage the // cursor position differently. *args.cursor = CursorShapeAndPosition { coords: args.surface.cursor_position().into(), shape: termwiz::surface::CursorShape::SteadyBar, ..Default::default() }; } fn get_size_constraints(&self) -> layout::Constraints { layout::Constraints::with_fixed_width_height(80, 24) } } #[cfg(feature = "widgets")] fn main() -> Result<(), Error> { // Start with an empty string; typing into the app will // update this string. let mut typed_text = String::new(); { // Create a terminal and put it into full screen raw mode let caps = Capabilities::new_from_env()?; let mut buf = BufferedTerminal::new(new_terminal(caps)?)?; buf.terminal().set_raw_mode()?; buf.terminal().enter_alternate_screen()?; // Set up the UI let mut ui = Ui::new(); ui.set_root(MainScreen::new(&mut typed_text)); loop { ui.process_event_queue()?; // After updating and processing all of the widgets, compose them // and render them to the screen. if ui.render_to_screen(&mut buf)? { // We have more events to process immediately; don't block waiting // for input below, but jump to the top of the loop to re-run the // updates. continue; } // Compute an optimized delta to apply to the terminal and display it buf.flush()?; // Wait for user input match buf.terminal().poll_input(None) { Ok(Some(InputEvent::Resized { rows, cols })) => { // FIXME: this is working around a bug where we don't realize // that we should redraw everything on resize in BufferedTerminal. buf.add_change(Change::ClearScreen(Default::default())); buf.resize(cols, rows); } Ok(Some(input)) => match input { InputEvent::Key(KeyEvent { key: KeyCode::Escape, .. }) => { // Quit the app when escape is pressed break; } input @ _ => { // Feed input into the Ui ui.queue_event(WidgetEvent::Input(input)); } }, Ok(None) => {} Err(e) => { print!("{:?}\r\n", e); break; } } } } // After we've stopped the full screen raw terminal, // print out the final edited value of the input text. println!("The text you entered: {}", typed_text); Ok(()) } #[cfg(not(feature = "widgets"))] fn main() { println!("recompile with --features widgets"); } termwiz-0.22.0/examples/widgets_nested.rs000064400000000000000000000164051046102023000166100ustar 00000000000000//! This example shows how to make an app that uses parent/child widgets #[cfg(feature = "widgets")] mod inner { use termwiz::caps::Capabilities; use termwiz::cell::AttributeChange; use termwiz::color::{AnsiColor, ColorAttribute}; use termwiz::input::*; use termwiz::surface::Change; use termwiz::terminal::buffered::BufferedTerminal; use termwiz::terminal::{new_terminal, Terminal}; use termwiz::widgets::layout::{ChildOrientation, VerticalAlignment}; use termwiz::widgets::*; use termwiz::Error; /// This is the main container widget for the app struct MainScreen {} impl MainScreen { pub fn new() -> Self { Self {} } } impl Widget for MainScreen { fn render(&mut self, _args: &mut RenderArgs) {} fn get_size_constraints(&self) -> layout::Constraints { // Switch from default horizontal layout to vertical layout let mut c = layout::Constraints::default(); c.child_orientation = ChildOrientation::Vertical; c } } /// This is the main text input area for the app struct TextInput<'a> { /// Holds the input text that we wish the widget to display text: &'a mut String, } impl<'a> TextInput<'a> { /// Initialize the widget with the input text pub fn new(text: &'a mut String) -> Self { Self { text } } } impl<'a> Widget for TextInput<'a> { fn process_event(&mut self, event: &WidgetEvent, _args: &mut UpdateArgs) -> bool { match event { WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Char(c), .. })) => self.text.push(*c), WidgetEvent::Input(InputEvent::Key(KeyEvent { key: KeyCode::Enter, .. })) => { self.text.push_str("\r\n"); } WidgetEvent::Input(InputEvent::Paste(s)) => { self.text.push_str(&s); } _ => {} } true // handled it all } /// Draw ourselves into the surface provided by RenderArgs fn render(&mut self, args: &mut RenderArgs) { args.surface.add_change(Change::ClearScreen( ColorAttribute::TrueColorWithPaletteFallback( (0x31, 0x1B, 0x92).into(), AnsiColor::Black.into(), ), )); args.surface .add_change(Change::Attribute(AttributeChange::Foreground( ColorAttribute::TrueColorWithPaletteFallback( (0xB3, 0x88, 0xFF).into(), AnsiColor::Purple.into(), ), ))); args.surface.add_change(self.text.clone()); // Place the cursor at the end of the text. // A more advanced text editing widget would manage the // cursor position differently. *args.cursor = CursorShapeAndPosition { coords: args.surface.cursor_position().into(), shape: termwiz::surface::CursorShape::SteadyBar, ..Default::default() }; } fn get_size_constraints(&self) -> layout::Constraints { let mut c = layout::Constraints::default(); c.set_valign(VerticalAlignment::Top); c } } // This is a little status line widget that we render at the bottom struct StatusLine {} impl StatusLine { pub fn new() -> Self { Self {} } } impl Widget for StatusLine { /// Draw ourselves into the surface provided by RenderArgs fn render(&mut self, args: &mut RenderArgs) { let dims = args.surface.dimensions(); args.surface .add_change(Change::ClearScreen(AnsiColor::Grey.into())); args.surface .add_change(format!("🤷 status surface size is {:?}", dims)); } fn get_size_constraints(&self) -> layout::Constraints { let mut c = layout::Constraints::default(); c.set_fixed_height(1); c.set_valign(VerticalAlignment::Bottom); c } } pub fn run() -> Result<(), Error> { // Start with an empty string; typing into the app will // update this string. let mut typed_text = String::new(); { // Create a terminal and put it into full screen raw mode let caps = Capabilities::new_from_env()?; let mut buf = BufferedTerminal::new(new_terminal(caps)?)?; buf.terminal().set_raw_mode()?; // Set up the UI let mut ui = Ui::new(); let root_id = ui.set_root(MainScreen::new()); let buffer_id = ui.add_child(root_id, TextInput::new(&mut typed_text)); ui.add_child(root_id, StatusLine::new()); ui.set_focus(buffer_id); loop { ui.process_event_queue()?; // After updating and processing all of the widgets, compose them // and render them to the screen. if ui.render_to_screen(&mut buf)? { // We have more events to process immediately; don't block waiting // for input below, but jump to the top of the loop to re-run the // updates. continue; } // Compute an optimized delta to apply to the terminal and display it buf.flush()?; // Wait for user input match buf.terminal().poll_input(None) { Ok(Some(InputEvent::Resized { rows, cols })) => { // FIXME: this is working around a bug where we don't realize // that we should redraw everything on resize in BufferedTerminal. buf.add_change(Change::ClearScreen(Default::default())); buf.resize(cols, rows); } Ok(Some(input)) => match input { InputEvent::Key(KeyEvent { key: KeyCode::Escape, .. }) => { // Quit the app when escape is pressed break; } input @ _ => { // Feed input into the Ui ui.queue_event(WidgetEvent::Input(input)); } }, Ok(None) => {} Err(e) => { print!("{:?}\r\n", e); break; } } } } // After we've stopped the full screen raw terminal, // print out the final edited value of the input text. println!("The text you entered: {}", typed_text); Ok(()) } } #[cfg(not(feature = "widgets"))] mod inner { pub fn run() -> termwiz::Result<()> { println!("recompile with --features widgets"); Ok(()) } } fn main() -> termwiz::Result<()> { inner::run() } termwiz-0.22.0/src/caps/mod.rs000064400000000000000000000445641046102023000142650ustar 00000000000000//! # Terminal Capabilities //! //! There are a few problems in the world of terminal capability //! detection today; the terminal is typically local to a machine //! running very up to date software, but applications may be running //! on a remote system with relatively stale system software, or //! even different operating systems. //! //! There are two well-specified standard approaches to querying terminal //! capabilities: `termcap` and `terminfo`. The databases for the //! capabilities are typically deployed with the operating system //! software and suffers from splay and freshness issues: they may //! be different on different systems and out of date. //! //! A further complication is that the terminal may be connected //! via a series of intermediaries or multiplexers (mosh, tmux, screen) //! which hides or perturbs the true capabilities of the terminal. //! //! `terminfo` and `termcap` both allow for the user to supply a local //! override. `terminfo` needs a locally available compiled database, //! and that database may have different binary representations on disk //! depending on the operating system software, making it difficult for //! users that need to login to many remote machines; the burden is on //! the user to configure a local profile on many machines or solve the //! challenge of having a `$HOME/.terminfo` directory that is NFS mountable //! and readable to all potential machines. //! //! `termcap` defines a `TERMCAP` environment variable that can contain //! overrides and be passed via SSH to the remote systems much more simply //! than the `terminfo` database, but `termcap` is the old obsolete database //! and lacks a way to express support for the newer, more interesting //! features. //! //! It's a bit of a mess. //! //! There's more: `slang` defined the concept of `COLORTERM` to workaround //! some of these concerns so that it was possible to influence the //! availability of relatively recent higher color palette extensions. //! This allows the user the ability to "know better" about their terminal //! than the local configuration allows. `COLORTERM` has the advantage of //! being able to be passed on to remote systems via SSH. //! //! Regarding environment variables: on macOS the two main terminal //! emulators export `TERM_PROGRAM` and `TERM_PROGRAM_VERSION` into the //! environment, and if this were transported via SSH and adopted by //! more terminal emulators then newer software could potentially also //! look at this information too. //! //! Is there or will there ever be an ideal solution to this stuff? //! Probably not. //! //! With all this in mind, this module presents a `Capabilities` struct //! that holds information about a terminal. The `new_from_env` method //! implements some heuristics (a fancy word for guessing) to compute //! the terminal capabilities, but also offers a `ProbeHints` //! that can be used by the embedding application to override those choices. use crate::{builder, Result}; use semver::Version; use std::env::var; use terminfo::{self, capability as cap}; pub mod probed; builder! { /// Use the `ProbeHints` to configure an instance of /// the `ProbeHints` struct. `ProbeHints` are passed to the `Capabilities` /// constructor to influence the effective set of terminal capabilities. #[derive(Debug, Default, Clone)] pub struct ProbeHints { /// The contents of the TERM environment variable term: Option, /// The contents of the COLORTERM environment variable. /// colorterm: Option, /// The contents of the TERM_PROGRAM environment variable term_program: Option, /// Override the choice of the number of colors color_level: Option, /// The contents of the TERM_PROGRAM_VERSION environment variable term_program_version: Option, /// Definitively set whether hyperlinks are supported. /// The default is to assume yes as this is mostly harmless. hyperlinks: Option, /// Configure whether sixel graphics are supported. sixel: Option, /// Configure whether iTerm2 style graphics embedding is supported /// See iterm2_image: Option, /// Specify whether `bce`, background color erase, is supported. bce: Option, /// The contents of the COLORTERM_BCE environment variable /// colorterm_bce: Option, /// A loaded terminfo database entry terminfo_db: Option, /// Whether bracketed paste mode is supported bracketed_paste: Option, /// Whether mouse support is present and should be used mouse_reporting: Option, /// When true, rather than using the terminfo `sgr` or `sgr0` entries, /// assume that the terminal is ANSI/ECMA-48 compliant for the /// common SGR attributes of bold, dim, reverse, underline, blink, /// invisible and reset, and directly emit those sequences. /// This can improve rendered text compatibility with pagers. force_terminfo_render_to_use_ansi_sgr: Option, } } impl ProbeHints { pub fn new_from_env() -> Self { ProbeHints::default() .term(var("TERM").ok()) .colorterm(var("COLORTERM").ok()) .colorterm_bce(var("COLORTERM_BCE").ok()) .term_program(var("TERM_PROGRAM").ok()) .term_program_version(var("TERM_PROGRAM_VERSION").ok()) } } /// Describes the level of color support available #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ColorLevel { /// Basic ANSI colors; 8 colors + bright versions Sixteen, /// In addition to the ANSI 16 colors, this has 24 levels of grey /// and 216 colors typically 6x6x6 color cube with 5 bits. There /// is some variance in implementations: the precise color cube is /// different in different emulators. TwoFiftySix, /// Commonly accepted as 24-bit RGB color. The implementation may /// display these exactly as specified or it may match to an internal /// palette with fewer than the theoretical maximum 16 million colors. /// What we care about here is whether the terminal supports the escape /// sequence to specify RGB values rather than a palette index. TrueColor, } /// `Capabilities` holds information about the capabilities of a terminal. /// On POSIX systems this is largely derived from an available terminfo /// database, but there are some newish capabilities that are not yet /// described by the majority of terminfo installations and thus have some /// additional handling in this struct. #[derive(Debug, Clone)] pub struct Capabilities { color_level: ColorLevel, hyperlinks: bool, sixel: bool, iterm2_image: bool, bce: bool, terminfo_db: Option, bracketed_paste: bool, mouse_reporting: bool, force_terminfo_render_to_use_ansi_sgr: bool, } impl Capabilities { /// Detect the capabilities of the terminal and return the /// Capability object holding the outcome. /// This function inspects the environment variables to build /// up configuration hints. pub fn new_from_env() -> Result { Self::new_with_hints(ProbeHints::new_from_env()) } /// Return modified capabilities with the assumption that we're /// using an xterm compatible terminal and the built-in xterm /// terminfo database. This is used on Windows when the TERM /// is set to xterm-256color and we didn't find an equivalent /// terminfo on the local filesystem. We're using this as a /// way to opt in to using terminal escapes rather than the /// legacy win32 console API. #[cfg(windows)] pub(crate) fn apply_builtin_terminfo(mut self) -> Self { let data = include_bytes!("../../data/xterm-256color"); let db = terminfo::Database::from_buffer(data.as_ref()).unwrap(); self.terminfo_db = Some(db); self.color_level = ColorLevel::TrueColor; self } /// Build a `Capabilities` object based on the provided `ProbeHints` object. pub fn new_with_hints(hints: ProbeHints) -> Result { let terminfo_db = hints.terminfo_db.as_ref().cloned(); let terminfo_db = if cfg!(test) { // Don't load from the system terminfo in tests, as it is unpredictable terminfo_db } else { terminfo_db.or_else(|| match hints.term.as_ref() { Some(t) => terminfo::Database::from_name(t).ok(), None => terminfo::Database::from_env().ok(), }) }; let color_level = hints.color_level.unwrap_or_else(|| { // If set, COLORTERM overrides any other source of information match hints.colorterm.as_ref().map(String::as_ref) { Some("truecolor") | Some("24bit") => ColorLevel::TrueColor, Some(_) => ColorLevel::TwoFiftySix, _ => { // COLORTERM isn't set, so look at the terminfo. if let Some(ref db) = terminfo_db.as_ref() { let has_true_color = db .get::() .unwrap_or(cap::TrueColor(false)) .0; if has_true_color { ColorLevel::TrueColor } else if let Some(cap::MaxColors(n)) = db.get::() { if n >= 16777216 { ColorLevel::TrueColor } else if n >= 256 { ColorLevel::TwoFiftySix } else { ColorLevel::Sixteen } } else { ColorLevel::Sixteen } } else if let Some(ref term) = hints.term { // if we don't have TERMINFO, use a somewhat awful // substring test against the TERM name. if term.contains("256color") { ColorLevel::TwoFiftySix } else { ColorLevel::Sixteen } } else { ColorLevel::Sixteen } } } }); // I don't know of a way to detect SIXEL support, so we // assume no by default. let sixel = hints.sixel.unwrap_or(false); // The use of OSC 8 for hyperlinks means that it is generally // safe to assume yes: if the terminal doesn't support it, // the text will look "OK", although some versions of VTE based // terminals had a bug where it look like garbage. let hyperlinks = hints.hyperlinks.unwrap_or(true); let bce = hints.bce.unwrap_or_else(|| { // Use the COLORTERM_BCE variable to override any terminfo match hints.colorterm_bce.as_ref().map(String::as_ref) { Some("1") => true, _ => { // Look it up from terminfo terminfo_db .as_ref() .map(|db| { db.get::() .unwrap_or(cap::BackColorErase(false)) .0 }) .unwrap_or(false) } } }); let iterm2_image = hints.iterm2_image.unwrap_or_else(|| { match hints.term_program.as_ref().map(String::as_ref) { Some("iTerm.app") => { // We're testing whether it has animated gif support // here because the iTerm2 docs don't say when the // image protocol was first implemented, but do mention // the gif version. Version::parse( hints .term_program_version .as_ref() .unwrap_or(&"0.0.0".to_owned()), ) >= Version::parse("2.9.20150512") } Some("WezTerm") => true, _ => false, } }); let bracketed_paste = hints.bracketed_paste.unwrap_or(true); let mouse_reporting = hints.mouse_reporting.unwrap_or(true); let force_terminfo_render_to_use_ansi_sgr = hints.force_terminfo_render_to_use_ansi_sgr.unwrap_or(false); Ok(Self { color_level, sixel, hyperlinks, iterm2_image, bce, terminfo_db, bracketed_paste, mouse_reporting, force_terminfo_render_to_use_ansi_sgr, }) } /// Indicates how many colors are supported pub fn color_level(&self) -> ColorLevel { self.color_level } /// Does the terminal support SIXEL graphics? pub fn sixel(&self) -> bool { self.sixel } /// Does the terminal support hyperlinks? /// See pub fn hyperlinks(&self) -> bool { self.hyperlinks } /// Does the terminal support the iTerm2 image protocol? /// See pub fn iterm2_image(&self) -> bool { self.iterm2_image } /// Is `bce`, background color erase supported? /// pub fn bce(&self) -> bool { self.bce } /// Returns a reference to the loaded terminfo, if any. pub fn terminfo_db(&self) -> Option<&terminfo::Database> { self.terminfo_db.as_ref() } /// Whether bracketed paste is supported pub fn bracketed_paste(&self) -> bool { self.bracketed_paste } /// Whether mouse reporting is supported pub fn mouse_reporting(&self) -> bool { self.mouse_reporting } /// Whether to emit standard ANSI/ECMA-48 codes, overriding any /// SGR terminfo capabilities. pub fn force_terminfo_render_to_use_ansi_sgr(&self) -> bool { self.force_terminfo_render_to_use_ansi_sgr } } #[cfg(test)] mod test { use super::*; fn load_terminfo() -> terminfo::Database { // Load our own compiled data so that the tests have an // environment that doesn't vary machine by machine. let data = include_bytes!("../../data/xterm-256color"); terminfo::Database::from_buffer(data.as_ref()).unwrap() } #[test] fn empty_hint() { let caps = Capabilities::new_with_hints(ProbeHints::default()).unwrap(); assert_eq!(caps.color_level(), ColorLevel::Sixteen); assert_eq!(caps.sixel(), false); assert_eq!(caps.hyperlinks(), true); assert_eq!(caps.iterm2_image(), false); assert_eq!(caps.bce(), false); } #[test] fn bce() { let caps = Capabilities::new_with_hints(ProbeHints::default().colorterm_bce(Some("1".into()))) .unwrap(); assert_eq!(caps.bce(), true); } #[test] fn bce_terminfo() { let caps = Capabilities::new_with_hints(ProbeHints::default().terminfo_db(Some(load_terminfo()))) .unwrap(); assert_eq!(caps.bce(), true); } #[test] fn terminfo_color() { let caps = Capabilities::new_with_hints(ProbeHints::default().terminfo_db(Some(load_terminfo()))) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); } #[test] fn term_but_not_colorterm() { let caps = Capabilities::new_with_hints(ProbeHints::default().term(Some("xterm-256color".into()))) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TwoFiftySix); } #[test] fn colorterm_but_no_term() { let caps = Capabilities::new_with_hints(ProbeHints::default().colorterm(Some("24bit".into()))) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); } #[test] fn term_and_colorterm() { let caps = Capabilities::new_with_hints( ProbeHints::default() .term(Some("xterm-256color".into())) // bogus value .colorterm(Some("24bot".into())), ) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TwoFiftySix); let caps = Capabilities::new_with_hints( ProbeHints::default() .term(Some("xterm-256color".into())) .colorterm(Some("24bit".into())), ) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); let caps = Capabilities::new_with_hints( ProbeHints::default() .term(Some("xterm-256color".into())) .colorterm(Some("truecolor".into())), ) .unwrap(); assert_eq!(caps.color_level(), ColorLevel::TrueColor); } #[test] fn iterm2_image() { let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("1.0.0".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), false); let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("2.9.0".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), false); let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("2.9.20150512".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), true); let caps = Capabilities::new_with_hints( ProbeHints::default() .term_program(Some("iTerm.app".into())) .term_program_version(Some("3.2.0beta5".into())), ) .unwrap(); assert_eq!(caps.iterm2_image(), true); } } termwiz-0.22.0/src/caps/probed.rs000064400000000000000000000214701046102023000147500ustar 00000000000000use crate::escape::csi::{Device, Window}; use crate::escape::parser::Parser; use crate::escape::{Action, DeviceControlMode, Esc, EscCode, CSI}; use crate::terminal::ScreenSize; use crate::{bail, Result}; use std::io::{Read, Write}; const TMUX_BEGIN: &str = "\u{1b}Ptmux;\u{1b}"; const TMUX_END: &str = "\u{1b}\\"; /// Represents a terminal name and version. /// The name XtVersion is because this value is produced /// by querying the terminal using the XTVERSION escape /// sequence, which was defined by xterm. #[derive(Debug, Clone, PartialEq, Eq)] pub struct XtVersion(String); impl XtVersion { /// Split the version string into a name component and a version /// component. Currently it recognizes `Name(Version)` and /// `Name Version` forms. If a form is not recognized, returns None. pub fn name_and_version(&self) -> Option<(&str, &str)> { if self.0.ends_with(")") { let paren = self.0.find('(')?; Some((&self.0[0..paren], &self.0[paren + 1..self.0.len() - 1])) } else { let space = self.0.find(' ')?; Some((&self.0[0..space], &self.0[space + 1..])) } } /// Returns true if this represents tmux pub fn is_tmux(&self) -> bool { self.0.starts_with("tmux ") } /// Return the full underlying version string pub fn full_version(&self) -> &str { &self.0 } } #[cfg(test)] mod test { use super::*; #[test] fn test_xtversion_name() { for (input, result) in [ ("WezTerm something", Some(("WezTerm", "something"))), ("xterm(something)", Some(("xterm", "something"))), ("something-else", None), ] { let version = XtVersion(input.to_string()); assert_eq!(version.name_and_version(), result, "{input}"); } } } /// This struct is a helper that uses probing to determine specific capabilities /// of the associated Terminal instance. /// It will write and read data to and from the associated Terminal. pub struct ProbeCapabilities<'a> { read: Box<&'a mut dyn Read>, write: Box<&'a mut dyn Write>, } impl<'a> ProbeCapabilities<'a> { pub fn new(read: &'a mut R, write: &'a mut W) -> Self { Self { read: Box::new(read), write: Box::new(write), } } /// Probe for the XTVERSION response pub fn xt_version(&mut self) -> Result { self.xt_version_impl(false) } /// Assuming that we are talking to tmux, probe for the XTVERSION response /// of its outer terminal. pub fn outer_xt_version(&mut self) -> Result { self.xt_version_impl(true) } fn xt_version_impl(&mut self, tmux_escape: bool) -> Result { let xt_version = CSI::Device(Box::new(Device::RequestTerminalNameAndVersion)); let dev_attributes = CSI::Device(Box::new(Device::RequestPrimaryDeviceAttributes)); if tmux_escape { write!(self.write, "{TMUX_BEGIN}{xt_version}{TMUX_END}")?; self.write.flush()?; std::thread::sleep(std::time::Duration::from_millis(100)); write!(self.write, "{dev_attributes}")?; } else { write!(self.write, "{xt_version}{dev_attributes}")?; } self.write.flush()?; let mut term = vec![]; let mut parser = Parser::new(); let mut done = false; while !done { let mut byte = [0u8]; self.read.read(&mut byte)?; parser.parse(&byte, |action| { // print!("{action:?}\r\n"); match action { Action::Esc(Esc::Code(EscCode::StringTerminator)) => {} Action::DeviceControl(dev) => { if let DeviceControlMode::Data(b) = dev { term.push(b); } } _ => { done = true; } } }); } Ok(XtVersion(String::from_utf8_lossy(&term).into())) } /// Probe the terminal and determine the ScreenSize. pub fn screen_size(&mut self) -> Result { let xt_version = self.xt_version()?; let is_tmux = xt_version.is_tmux(); // some tmux versions have their rows/cols swapped in ReportTextAreaSizeCells let swapped_cols_rows = match xt_version.full_version() { "tmux 3.2" | "tmux 3.2a" | "tmux 3.3" | "tmux 3.3a" => true, _ => false, }; let query_cells = CSI::Window(Box::new(Window::ReportTextAreaSizeCells)); let query_pixels = CSI::Window(Box::new(Window::ReportCellSizePixels)); let dev_attributes = CSI::Device(Box::new(Device::RequestPrimaryDeviceAttributes)); write!(self.write, "{query_cells}{query_pixels}")?; // tmux refuses to directly support responding to 14t or 16t queries // for pixel dimensions, so we need to jump through to the outer // terminal and see what it says if is_tmux { write!(self.write, "{TMUX_BEGIN}{query_pixels}{TMUX_END}")?; } if is_tmux || cfg!(windows) { self.write.flush()?; // I really wanted to avoid a delay here, but tmux and conpty will // both re-order the response to dev_attributes before sending the // response for the passthru of query_pixels if we don't delay. // The delay is potentially imperfect for things like a laggy ssh // connection. The consequence of the timing being wrong is that // we won't be able to reason about the pixel dimensions, which is // "OK", but that was kinda the whole point of probing this way // vs. termios. std::thread::sleep(std::time::Duration::from_millis(100)); } write!(self.write, "{dev_attributes}")?; self.write.flush()?; let mut parser = Parser::new(); let mut done = false; let mut size = ScreenSize { rows: 0, cols: 0, xpixel: 0, ypixel: 0, }; while !done { let mut byte = [0u8]; self.read.read(&mut byte)?; parser.parse(&byte, |action| { // print!("{action:?}\r\n"); match action { // ConPTY appears to trigger 1 or more xtversion queries // to wezterm in response to this probe, so we need to // prepared to accept and discard data of that shape // here, so that we keep going until we get our reports Action::DeviceControl(_) => {} Action::Esc(Esc::Code(EscCode::StringTerminator)) => {} // and now look for the actual responses we're expecting Action::CSI(csi) => match csi { CSI::Window(win) => match *win { Window::ResizeWindowCells { width, height } => { let width = width.unwrap_or(1); let height = height.unwrap_or(1); if width > 0 && height > 0 { let width = width as usize; let height = height as usize; if swapped_cols_rows { size.rows = width; size.cols = height; } else { size.rows = height; size.cols = width; } } } Window::ReportCellSizePixelsResponse { width, height } => { let width = width.unwrap_or(1); let height = height.unwrap_or(1); if width > 0 && height > 0 { let width = width as usize; let height = height as usize; size.xpixel = width; size.ypixel = height; } } _ => { done = true; } }, _ => { done = true; } }, _ => { done = true; } } }); } if size.rows == 0 && size.cols == 0 { bail!("no size information available"); } Ok(size) } } termwiz-0.22.0/src/cell.rs000064400000000000000000001167661046102023000135030ustar 00000000000000//! Model a cell in the terminal display use crate::color::{ColorAttribute, PaletteIndex}; pub use crate::emoji::Presentation; use crate::emoji_variation::WCWIDTH_TABLE; pub use crate::escape::osc::Hyperlink; use crate::image::ImageCell; use crate::widechar_width::WcWidth; use finl_unicode::grapheme_clusters::Graphemes; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::hash::{Hash, Hasher}; use std::mem; use std::sync::Arc; use wezterm_dynamic::{FromDynamic, ToDynamic}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] enum SmallColor { Default, PaletteIndex(PaletteIndex), } impl Default for SmallColor { fn default() -> Self { Self::Default } } impl Into for SmallColor { fn into(self) -> ColorAttribute { match self { Self::Default => ColorAttribute::Default, Self::PaletteIndex(idx) => ColorAttribute::PaletteIndex(idx), } } } /// Holds the attributes for a cell. /// Most style attributes are stored internally as part of a bitfield /// to reduce per-cell overhead. /// The setter methods return a mutable self reference so that they can /// be chained together. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Clone, Eq, PartialEq)] pub struct CellAttributes { attributes: u32, /// The foreground color foreground: SmallColor, /// The background color background: SmallColor, /// Relatively rarely used attributes spill over to a heap /// allocated struct in order to keep CellAttributes /// smaller in the common case. fat: Option>, } impl std::fmt::Debug for CellAttributes { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fmt.debug_struct("CellAttributes") .field("attributes", &self.attributes) .field("intensity", &self.intensity()) .field("underline", &self.underline()) .field("blink", &self.blink()) .field("italic", &self.italic()) .field("reverse", &self.reverse()) .field("strikethrough", &self.strikethrough()) .field("invisible", &self.invisible()) .field("wrapped", &self.wrapped()) .field("overline", &self.overline()) .field("semantic_type", &self.semantic_type()) .field("foreground", &self.foreground) .field("background", &self.background) .field("fat", &self.fat) .finish() } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Default, Clone, Eq, PartialEq)] struct FatAttributes { /// The hyperlink content, if any hyperlink: Option>, /// The image data, if any image: Vec>, /// The color of the underline. If None, then /// the foreground color is to be used underline_color: ColorAttribute, foreground: ColorAttribute, background: ColorAttribute, } impl FatAttributes { pub fn compute_shape_hash(&self, hasher: &mut H) { if let Some(link) = &self.hyperlink { link.compute_shape_hash(hasher); } for cell in &self.image { cell.compute_shape_hash(hasher); } self.underline_color.hash(hasher); self.foreground.hash(hasher); self.background.hash(hasher); } } /// Define getter and setter for the attributes bitfield. /// The first form is for a simple boolean value stored in /// a single bit. The $bitnum parameter specifies which bit. /// The second form is for an integer value that occupies a range /// of bits. The $bitmask and $bitshift parameters define how /// to transform from the stored bit value to the consumable /// value. macro_rules! bitfield { ($getter:ident, $setter:ident, $bitnum:expr) => { #[inline] pub fn $getter(&self) -> bool { (self.attributes & (1 << $bitnum)) == (1 << $bitnum) } #[inline] pub fn $setter(&mut self, value: bool) -> &mut Self { let attr_value = if value { 1 << $bitnum } else { 0 }; self.attributes = (self.attributes & !(1 << $bitnum)) | attr_value; self } }; ($getter:ident, $setter:ident, $bitmask:expr, $bitshift:expr) => { #[inline] pub fn $getter(&self) -> u32 { (self.attributes >> $bitshift) & $bitmask } #[inline] pub fn $setter(&mut self, value: u32) -> &mut Self { let clear = !($bitmask << $bitshift); let attr_value = (value & $bitmask) << $bitshift; self.attributes = (self.attributes & clear) | attr_value; self } }; ($getter:ident, $setter:ident, $enum:ident, $bitmask:expr, $bitshift:expr) => { #[inline] pub fn $getter(&self) -> $enum { unsafe { mem::transmute(((self.attributes >> $bitshift) & $bitmask) as u8) } } #[inline] pub fn $setter(&mut self, value: $enum) -> &mut Self { let value = value as u32; let clear = !($bitmask << $bitshift); let attr_value = (value & $bitmask) << $bitshift; self.attributes = (self.attributes & clear) | attr_value; self } }; } /// Describes the semantic "type" of the cell. /// This categorizes cells into Output (from the actions the user is /// taking; this is the default if left unspecified), /// Input (that the user typed) and Prompt (effectively, "chrome" provided /// by the shell or application that the user is interacting with. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, FromDynamic, ToDynamic)] #[repr(u8)] pub enum SemanticType { Output = 0, Input = 1, Prompt = 2, } impl Default for SemanticType { fn default() -> Self { Self::Output } } /// The `Intensity` of a cell describes its boldness. Most terminals /// implement `Intensity::Bold` by either using a bold font or by simply /// using an alternative color. Some terminals implement `Intensity::Half` /// as a dimmer color variant. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] #[repr(u8)] pub enum Intensity { Normal = 0, Bold = 1, Half = 2, } impl Default for Intensity { fn default() -> Self { Self::Normal } } /// Specify just how underlined you want your `Cell` to be #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromDynamic, ToDynamic)] #[repr(u8)] pub enum Underline { /// The cell is not underlined None = 0, /// The cell is underlined with a single line Single = 1, /// The cell is underlined with two lines Double = 2, /// Curly underline Curly = 3, /// Dotted underline Dotted = 4, /// Dashed underline Dashed = 5, } impl Default for Underline { fn default() -> Self { Self::None } } /// Allow converting to boolean; true means some kind of /// underline, false means none. This is used in some /// generic code to determine whether to enable underline. impl Into for Underline { fn into(self) -> bool { self != Underline::None } } /// Specify whether you want to slowly or rapidly annoy your users #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] #[repr(u8)] pub enum Blink { None = 0, Slow = 1, Rapid = 2, } /// Allow converting to boolean; true means some kind of /// blink, false means none. This is used in some /// generic code to determine whether to enable blink. impl Into for Blink { fn into(self) -> bool { self != Blink::None } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] #[repr(u8)] pub enum VerticalAlign { BaseLine = 0, SuperScript = 1, SubScript = 2, } impl Default for CellAttributes { fn default() -> Self { Self::blank() } } impl CellAttributes { bitfield!(intensity, set_intensity, Intensity, 0b11, 0); bitfield!(underline, set_underline, Underline, 0b111, 2); bitfield!(blink, set_blink, Blink, 0b11, 5); bitfield!(italic, set_italic, 7); bitfield!(reverse, set_reverse, 8); bitfield!(strikethrough, set_strikethrough, 9); bitfield!(invisible, set_invisible, 10); bitfield!(wrapped, set_wrapped, 11); bitfield!(overline, set_overline, 12); bitfield!(semantic_type, set_semantic_type, SemanticType, 0b11, 13); bitfield!(vertical_align, set_vertical_align, VerticalAlign, 0b11, 15); pub const fn blank() -> Self { Self { attributes: 0, foreground: SmallColor::Default, background: SmallColor::Default, fat: None, } } /// Returns true if the attribute bits in both objects are equal. /// This can be used to cheaply test whether the styles of the two /// cells are the same, and is used by some `Renderer` implementations. pub fn attribute_bits_equal(&self, other: &Self) -> bool { self.attributes == other.attributes } pub fn compute_shape_hash(&self, hasher: &mut H) { self.attributes.hash(hasher); self.foreground.hash(hasher); self.background.hash(hasher); if let Some(fat) = &self.fat { fat.compute_shape_hash(hasher); } } /// Set the foreground color for the cell to that specified pub fn set_foreground>(&mut self, foreground: C) -> &mut Self { let foreground: ColorAttribute = foreground.into(); match foreground { ColorAttribute::Default => { self.foreground = SmallColor::Default; if let Some(fat) = self.fat.as_mut() { fat.foreground = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } ColorAttribute::PaletteIndex(idx) => { self.foreground = SmallColor::PaletteIndex(idx); if let Some(fat) = self.fat.as_mut() { fat.foreground = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } foreground => { self.foreground = SmallColor::Default; self.allocate_fat_attributes(); self.fat.as_mut().unwrap().foreground = foreground; } } self } pub fn foreground(&self) -> ColorAttribute { if let Some(fat) = self.fat.as_ref() { if fat.foreground != ColorAttribute::Default { return fat.foreground; } } self.foreground.into() } pub fn set_background>(&mut self, background: C) -> &mut Self { let background: ColorAttribute = background.into(); match background { ColorAttribute::Default => { self.background = SmallColor::Default; if let Some(fat) = self.fat.as_mut() { fat.background = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } ColorAttribute::PaletteIndex(idx) => { self.background = SmallColor::PaletteIndex(idx); if let Some(fat) = self.fat.as_mut() { fat.background = ColorAttribute::Default; } self.deallocate_fat_attributes_if_none(); } background => { self.background = SmallColor::Default; self.allocate_fat_attributes(); self.fat.as_mut().unwrap().background = background; } } self } pub fn background(&self) -> ColorAttribute { if let Some(fat) = self.fat.as_ref() { if fat.background != ColorAttribute::Default { return fat.background; } } self.background.into() } fn allocate_fat_attributes(&mut self) { if self.fat.is_none() { self.fat.replace(Box::new(FatAttributes { hyperlink: None, image: vec![], underline_color: ColorAttribute::Default, foreground: ColorAttribute::Default, background: ColorAttribute::Default, })); } } fn deallocate_fat_attributes_if_none(&mut self) { let deallocate = self .fat .as_ref() .map(|fat| { fat.image.is_empty() && fat.hyperlink.is_none() && fat.underline_color == ColorAttribute::Default && fat.foreground == ColorAttribute::Default && fat.background == ColorAttribute::Default }) .unwrap_or(false); if deallocate { self.fat.take(); } } pub fn set_hyperlink(&mut self, link: Option>) -> &mut Self { if link.is_none() && self.fat.is_none() { self } else { self.allocate_fat_attributes(); self.fat.as_mut().unwrap().hyperlink = link; self.deallocate_fat_attributes_if_none(); self } } /// Assign a single image to a cell. pub fn set_image(&mut self, image: Box) -> &mut Self { self.allocate_fat_attributes(); self.fat.as_mut().unwrap().image = vec![image]; self } /// Clear all images from a cell pub fn clear_images(&mut self) -> &mut Self { if let Some(fat) = self.fat.as_mut() { fat.image.clear(); } self.deallocate_fat_attributes_if_none(); self } pub fn detach_image_with_placement(&mut self, image_id: u32, placement_id: Option) { if let Some(fat) = self.fat.as_mut() { fat.image .retain(|im| !im.matches_placement(image_id, placement_id)); } self.deallocate_fat_attributes_if_none(); } /// Add an image attachement, preserving any existing attachments. /// The list of images is maintained in z-index order pub fn attach_image(&mut self, image: Box) -> &mut Self { self.allocate_fat_attributes(); let fat = self.fat.as_mut().unwrap(); let z_index = image.z_index(); match fat .image .binary_search_by(|probe| probe.z_index().cmp(&z_index)) { Ok(idx) | Err(idx) => fat.image.insert(idx, image), } self } pub fn set_underline_color>( &mut self, underline_color: C, ) -> &mut Self { let underline_color = underline_color.into(); if underline_color == ColorAttribute::Default && self.fat.is_none() { self } else { self.allocate_fat_attributes(); self.fat.as_mut().unwrap().underline_color = underline_color; self.deallocate_fat_attributes_if_none(); self } } /// Clone the attributes, but exclude fancy extras such /// as hyperlinks or future sprite things pub fn clone_sgr_only(&self) -> Self { let mut res = Self { attributes: self.attributes, foreground: self.foreground, background: self.background, fat: None, }; if let Some(fat) = self.fat.as_ref() { if fat.background != ColorAttribute::Default || fat.foreground != ColorAttribute::Default { res.allocate_fat_attributes(); let new_fat = res.fat.as_mut().unwrap(); new_fat.foreground = fat.foreground; new_fat.background = fat.background; } } // Reset the semantic type; clone_sgr_only is used primarily // to create a "blank" cell when clearing and we want that to // be deterministically tagged as Output so that we have an // easier time in get_semantic_zones. res.set_semantic_type(SemanticType::default()); res.set_underline_color(self.underline_color()); // Turn off underline because it can have surprising results // if underline is on, then we get CRLF and then SGR reset: // If the CRLF causes a line to scroll, we'll call clone_sgr_only() // to get a blank cell for the new line and it would be filled // with underlines. // clone_sgr_only() is primarily for preserving the background // color when erasing rather than other attributes, so it should // be fine to clear out the actual underline attribute. // Let's extend this to other line attribute types as well. // res.set_underline(Underline::None); res.set_overline(false); res.set_strikethrough(false); res } pub fn hyperlink(&self) -> Option<&Arc> { self.fat.as_ref().and_then(|fat| fat.hyperlink.as_ref()) } /// Returns the list of attached images in z-index order. /// Returns None if there are no attached images; will /// never return Some(vec![]). pub fn images(&self) -> Option> { let fat = self.fat.as_ref()?; if fat.image.is_empty() { return None; } Some(fat.image.iter().map(|im| im.as_ref().clone()).collect()) } pub fn underline_color(&self) -> ColorAttribute { self.fat .as_ref() .map(|fat| fat.underline_color) .unwrap_or(ColorAttribute::Default) } pub fn apply_change(&mut self, change: &AttributeChange) { use AttributeChange::*; match change { Intensity(value) => { self.set_intensity(*value); } Underline(value) => { self.set_underline(*value); } Italic(value) => { self.set_italic(*value); } Blink(value) => { self.set_blink(*value); } Reverse(value) => { self.set_reverse(*value); } StrikeThrough(value) => { self.set_strikethrough(*value); } Invisible(value) => { self.set_invisible(*value); } Foreground(value) => { self.set_foreground(*value); } Background(value) => { self.set_background(*value); } Hyperlink(value) => { self.set_hyperlink(value.clone()); } } } } #[cfg(feature = "use_serde")] fn deserialize_teenystring<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let text = String::deserialize(deserializer)?; Ok(TeenyString::from_str(&text, None, None)) } #[cfg(feature = "use_serde")] fn serialize_teenystring(value: &TeenyString, serializer: S) -> Result where S: Serializer, { // unsafety: this is safe because the Cell constructor guarantees // that the storage is valid utf8 let s = unsafe { std::str::from_utf8_unchecked(value.as_bytes()) }; s.serialize(serializer) } /// TeenyString encodes string storage in a single u64. /// The scheme is simple but effective: strings that encode into a /// byte slice that is 1 less byte than the machine word size can /// be encoded directly into the usize bits stored in the struct. /// A marker bit (LSB for big endian, MSB for little endian) is /// set to indicate that the string is stored inline. /// If the string is longer than this then a `Vec` is allocated /// from the heap and the usize holds its raw pointer address. /// /// When the string is inlined, the next-MSB is used to short-cut /// calling grapheme_column_width; if it is set, then the TeenyString /// has length 2, otherwise, it has length 1 (we don't allow zero-length /// strings). struct TeenyString(u64); struct TeenyStringHeap { bytes: Vec, width: usize, } impl TeenyString { const fn marker_mask() -> u64 { if cfg!(target_endian = "little") { 0x80000000_00000000 } else { 0x1 } } const fn double_wide_mask() -> u64 { if cfg!(target_endian = "little") { 0xc0000000_00000000 } else { 0x3 } } const fn is_marker_bit_set(word: u64) -> bool { let mask = Self::marker_mask(); word & mask == mask } const fn is_double_width(word: u64) -> bool { let mask = Self::double_wide_mask(); word & mask == mask } const fn set_marker_bit(word: u64, width: usize) -> u64 { if width > 1 { word | Self::double_wide_mask() } else { word | Self::marker_mask() } } pub fn from_str( s: &str, width: Option, unicode_version: Option, ) -> Self { // De-fang the input text such that it has no special meaning // to a terminal. All control and movement characters are rewritten // as a space. let s = if s.is_empty() || s == "\r\n" { " " } else if s.len() == 1 { let b = s.as_bytes()[0]; if b < 0x20 || b == 0x7f { " " } else { s } } else { s }; let bytes = s.as_bytes(); let len = bytes.len(); let width = width.unwrap_or_else(|| grapheme_column_width(s, unicode_version)); if len < std::mem::size_of::() && width < 3 { let mut word = 0u64; unsafe { std::ptr::copy_nonoverlapping( bytes.as_ptr(), &mut word as *mut u64 as *mut u8, len, ); } let word = Self::set_marker_bit(word as u64, width); Self(word) } else { let vec = Box::new(TeenyStringHeap { bytes: bytes.to_vec(), width, }); let ptr = Box::into_raw(vec); Self(ptr as u64) } } pub const fn space() -> Self { Self(if cfg!(target_endian = "little") { 0x80000000_00000020 } else { 0x20000000_00000001 }) } pub fn from_char(c: char) -> Self { let mut bytes = [0u8; 8]; Self::from_str(c.encode_utf8(&mut bytes), None, None) } pub fn width(&self) -> usize { if Self::is_marker_bit_set(self.0) { if Self::is_double_width(self.0) { 2 } else { 1 } } else { let heap = self.0 as *const u64 as *const TeenyStringHeap; unsafe { (*heap).width } } } pub fn str(&self) -> &str { // unsafety: this is safe because the constructor guarantees // that the storage is valid utf8 unsafe { std::str::from_utf8_unchecked(self.as_bytes()) } } pub fn as_bytes(&self) -> &[u8] { if Self::is_marker_bit_set(self.0) { let bytes = &self.0 as *const u64 as *const u8; let bytes = unsafe { std::slice::from_raw_parts(bytes, std::mem::size_of::() - 1) }; let len = bytes .iter() .position(|&b| b == 0) .unwrap_or(std::mem::size_of::() - 1); &bytes[0..len] } else { let heap = self.0 as *const u64 as *const TeenyStringHeap; unsafe { (*heap).bytes.as_slice() } } } } impl Drop for TeenyString { fn drop(&mut self) { if !Self::is_marker_bit_set(self.0) { let vec = unsafe { Box::from_raw(self.0 as *mut usize as *mut TeenyStringHeap) }; drop(vec); } } } impl std::clone::Clone for TeenyString { fn clone(&self) -> Self { if Self::is_marker_bit_set(self.0) { Self(self.0) } else { Self::from_str(self.str(), None, None) } } } impl std::cmp::PartialEq for TeenyString { fn eq(&self, rhs: &Self) -> bool { self.as_bytes().eq(rhs.as_bytes()) } } impl std::cmp::Eq for TeenyString {} /// Models the contents of a cell on the terminal display #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Clone, Eq, PartialEq)] pub struct Cell { #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_teenystring", serialize_with = "serialize_teenystring" ) )] text: TeenyString, attrs: CellAttributes, } impl std::fmt::Debug for Cell { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fmt.debug_struct("Cell") .field("text", &self.str()) .field("width", &self.width()) .field("attrs", &self.attrs) .finish() } } impl Default for Cell { fn default() -> Self { Self::blank() } } impl Cell { /// Create a new cell holding the specified character and with the /// specified cell attributes. /// All control and movement characters are rewritten as a space. pub fn new(text: char, attrs: CellAttributes) -> Self { let storage = TeenyString::from_char(text); Self { text: storage, attrs, } } pub const fn blank() -> Self { Self { text: TeenyString::space(), attrs: CellAttributes::blank(), } } pub const fn blank_with_attrs(attrs: CellAttributes) -> Self { Self { text: TeenyString::space(), attrs, } } /// Indicates whether this cell has text or emoji presentation. /// The width already reflects that choice; this information /// is also useful when selecting an appropriate font. pub fn presentation(&self) -> Presentation { match Presentation::for_grapheme(self.str()) { (_, Some(variation)) => variation, (presentation, None) => presentation, } } /// Create a new cell holding the specified grapheme. /// The grapheme is passed as a string slice and is intended to hold /// double-width characters, or combining unicode sequences, that need /// to be treated as a single logical "character" that can be cursored /// over. This function technically allows for an arbitrary string to /// be passed but it should not be used to hold strings other than /// graphemes. pub fn new_grapheme( text: &str, attrs: CellAttributes, unicode_version: Option, ) -> Self { let storage = TeenyString::from_str(text, None, unicode_version); Self { text: storage, attrs, } } pub fn new_grapheme_with_width(text: &str, width: usize, attrs: CellAttributes) -> Self { let storage = TeenyString::from_str(text, Some(width), None); Self { text: storage, attrs, } } /// Returns the textual content of the cell pub fn str(&self) -> &str { self.text.str() } /// Returns the number of cells visually occupied by this grapheme pub fn width(&self) -> usize { self.text.width() } /// Returns the attributes of the cell pub fn attrs(&self) -> &CellAttributes { &self.attrs } pub fn attrs_mut(&mut self) -> &mut CellAttributes { &mut self.attrs } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct UnicodeVersion { pub version: u8, pub ambiguous_are_wide: bool, } impl UnicodeVersion { pub const fn new(version: u8) -> Self { Self { version, ambiguous_are_wide: false, } } #[inline] fn width(&self, c: WcWidth) -> usize { // Special case for symbol fonts that are naughtly and use // the unassigned range instead of the private use range. // if c == WcWidth::Unassigned { 1 } else if c == WcWidth::Ambiguous && self.ambiguous_are_wide { 2 } else if self.version >= 9 { c.width_unicode_9_or_later() as usize } else { c.width_unicode_8_or_earlier() as usize } } #[inline] pub fn idx(&self) -> usize { (if self.version > 9 { 2 } else { 0 }) | (if self.ambiguous_are_wide { 1 } else { 0 }) } } pub const LATEST_UNICODE_VERSION: UnicodeVersion = UnicodeVersion { version: 14, ambiguous_are_wide: false, }; /// Returns the number of cells visually occupied by a sequence /// of graphemes. /// Calls through to `grapheme_column_width` for each grapheme /// and sums up the length. pub fn unicode_column_width(s: &str, version: Option) -> usize { Graphemes::new(s) .map(|g| grapheme_column_width(g, version)) .sum() } /// Returns the number of cells visually occupied by a grapheme. /// The input string must be a single grapheme. /// /// There are some frustrating dragons in the realm of terminal cell widths: /// /// a) wcwidth and wcswidth are widely used by applications and may be /// several versions of unicode behind the current version /// b) The width of characters has and will change in the future. /// Unicode Version 8 -> 9 made some characters wider. /// Unicode 14 defines Emoji variation selectors that change the /// width depending on trailing context in the unicode sequence. /// /// Differing opinions about the width leads to visual artifacts in /// text and and line editors, especially with respect to cursor placement. /// /// There aren't any really great solutions to this problem, as a given /// terminal emulator may be fine locally but essentially breaks when /// ssh'ing into a remote system with a divergent wcwidth implementation. /// /// This means that a global understanding of the unicode version that /// is in use isn't a good solution. /// /// The approach that wezterm wants to take here is to define a /// configuration value that sets the starting level of unicode conformance, /// and to define an escape sequence that can push/pop a desired confirmance /// level onto a stack maintained by the terminal emulator. /// /// The terminal emulator can then pass the unicode version through to /// the Cell that is used to hold a grapheme, and that per-Cell version /// can then be used to calculate width. pub fn grapheme_column_width(s: &str, version: Option) -> usize { let version = version.as_ref().unwrap_or(&LATEST_UNICODE_VERSION); // Optimization: if there is a single byte we can directly cast // that byte as a char which will be in the range 0.255. // This takes ~1.5ns, and we can then look that up in the table // which is valid for chars in the range 0-0xffff. // That lookup also takes ~1.5ns, giving us a hot path latency // of ~3-4ns for a grapheme string that is comprised of a single // ASCII byte. // // Since we know this is a single ASCII char, we know that it // cannot be a sequence with a variation selector, so we don't // need to requested `Presentation` for it. if s.len() == 1 { let c = WCWIDTH_TABLE.classify(s.as_bytes()[0] as char); return version.width(c); } // Slow path: `s.chars()` will dominate and pull up the minimum // runtime to ~20ns if version.version >= 14 { // Lookup the grapheme to see if the presentation of // the grapheme forces the width. We can bypass // the WcWidth classification if that is true. match Presentation::for_grapheme(s) { (_, Some(Presentation::Emoji)) => return 2, (_, Some(Presentation::Text)) => return 1, (Presentation::Emoji, None) => return 2, (Presentation::Text, None) => {} } } // Otherwise, classify and sum up let mut width = 0; for c in s.chars() { let c = WCWIDTH_TABLE.classify(c); width += version.width(c); } width.min(2) } /// Models a change in the attributes of a cell in a stream of changes. /// Each variant specifies one of the possible attributes; the corresponding /// value holds the new value to be used for that attribute. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq, FromDynamic, ToDynamic)] pub enum AttributeChange { Intensity(Intensity), Underline(Underline), Italic(bool), Blink(Blink), Reverse(bool), StrikeThrough(bool), Invisible(bool), Foreground(ColorAttribute), Background(ColorAttribute), Hyperlink(Option>), } #[cfg(test)] mod test { use super::*; #[test] fn teeny_string() { assert!( std::mem::size_of::() <= std::mem::size_of::(), "if a pointer doesn't fit in u64 then we need to change TeenyString" ); let s = TeenyString::from_char('a'); assert_eq!(s.as_bytes(), &[b'a']); let longer = TeenyString::from_str("hellothere", None, None); assert_eq!(longer.as_bytes(), b"hellothere"); assert_eq!( TeenyString::from_char(' ').as_bytes(), TeenyString::space().as_bytes() ); } #[test] #[cfg(target_pointer_width = "64")] fn memory_usage() { assert_eq!(std::mem::size_of::(), 4); assert_eq!(std::mem::size_of::(), 20); assert_eq!(std::mem::size_of::(), 16); assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::>(), 24); assert_eq!(std::mem::size_of::(), 4); assert_eq!(std::mem::size_of::(), 8); } #[test] fn nerf_special() { for c in " \n\r\t".chars() { let cell = Cell::new(c, CellAttributes::default()); assert_eq!(cell.str(), " "); } for g in &["", " ", "\n", "\r", "\t", "\r\n"] { let cell = Cell::new_grapheme(g, CellAttributes::default(), None); assert_eq!(cell.str(), " "); } } #[test] fn test_width() { let foot = "\u{1f9b6}"; eprintln!("foot chars"); for c in foot.chars() { eprintln!("char: {:?}", c); } assert_eq!(unicode_column_width(foot, None), 2, "{} should be 2", foot); let women_holding_hands_dark_skin_tone_medium_light_skin_tone = "\u{1F469}\u{1F3FF}\u{200D}\u{1F91D}\u{200D}\u{1F469}\u{1F3FC}"; // Ensure that we can hold this longer grapheme sequence in the cell // and correctly return its string contents! let cell = Cell::new_grapheme( women_holding_hands_dark_skin_tone_medium_light_skin_tone, CellAttributes::default(), None, ); assert_eq!( cell.str(), women_holding_hands_dark_skin_tone_medium_light_skin_tone ); assert_eq!( cell.width(), 2, "width of {} should be 2", women_holding_hands_dark_skin_tone_medium_light_skin_tone ); let deaf_man = "\u{1F9CF}\u{200D}\u{2642}\u{FE0F}"; eprintln!("deaf_man chars"); for c in deaf_man.chars() { eprintln!("char: {:?}", c); } assert_eq!(unicode_column_width(deaf_man, None), 2); let man_dancing = "\u{1F57A}"; assert_eq!( unicode_column_width(man_dancing, Some(UnicodeVersion::new(9))), 2 ); assert_eq!( unicode_column_width(man_dancing, Some(UnicodeVersion::new(8))), 2 ); let raised_fist = "\u{270a}"; assert_eq!( unicode_column_width(raised_fist, Some(UnicodeVersion::new(9))), 2 ); assert_eq!( unicode_column_width(raised_fist, Some(UnicodeVersion::new(8))), 1 ); // This is a codepoint in the private use area let font_awesome_star = "\u{f005}"; eprintln!("font_awesome_star {}", font_awesome_star.escape_debug()); assert_eq!(unicode_column_width(font_awesome_star, None), 1); let england_flag = "\u{1f3f4}\u{e0067}\u{e0062}\u{e0065}\u{e006e}\u{e0067}\u{e007f}"; assert_eq!(unicode_column_width(england_flag, None), 2); } #[test] fn issue_1161() { let x_ideographic_space_x = "x\u{3000}x"; assert_eq!(unicode_column_width(x_ideographic_space_x, None), 4); assert_eq!( Graphemes::new(x_ideographic_space_x).collect::>(), vec!["x".to_string(), "\u{3000}".to_string(), "x".to_string()], ); let c = Cell::new_grapheme("\u{3000}", CellAttributes::blank(), None); assert_eq!(c.width(), 2); } #[test] fn issue_997() { let victory_hand = "\u{270c}"; let victory_hand_text_presentation = "\u{270c}\u{fe0e}"; assert_eq!( unicode_column_width(victory_hand_text_presentation, None), 1 ); assert_eq!(unicode_column_width(victory_hand, None), 1); assert_eq!( Graphemes::new(victory_hand_text_presentation).collect::>(), vec![victory_hand_text_presentation.to_string()] ); assert_eq!( Graphemes::new(victory_hand).collect::>(), vec![victory_hand.to_string()] ); let copyright_emoji_presentation = "\u{00A9}\u{FE0F}"; assert_eq!( Graphemes::new(copyright_emoji_presentation).collect::>(), vec![copyright_emoji_presentation.to_string()] ); assert_eq!(unicode_column_width(copyright_emoji_presentation, None), 2); assert_eq!( unicode_column_width(copyright_emoji_presentation, Some(UnicodeVersion::new(9))), 1 ); let copyright_text_presentation = "\u{00A9}"; assert_eq!( Graphemes::new(copyright_text_presentation).collect::>(), vec![copyright_text_presentation.to_string()] ); assert_eq!(unicode_column_width(copyright_text_presentation, None), 1); let raised_fist = "\u{270a}"; // Not valid to have explicit Text presentation for raised fist let raised_fist_text = "\u{270a}\u{fe0e}"; assert_eq!( Presentation::for_grapheme(raised_fist), (Presentation::Emoji, None) ); assert_eq!(unicode_column_width(raised_fist, None), 2); assert_eq!( Presentation::for_grapheme(raised_fist_text), (Presentation::Emoji, None) ); assert_eq!(unicode_column_width(raised_fist_text, None), 2); assert_eq!( Graphemes::new(raised_fist_text).collect::>(), vec![raised_fist_text.to_string()] ); assert_eq!( Graphemes::new(raised_fist).collect::>(), vec![raised_fist.to_string()] ); } #[test] fn issue_1573() { let sequence = "\u{1112}\u{1161}\u{11ab}"; assert_eq!(unicode_column_width(sequence, None), 2); assert_eq!(grapheme_column_width(sequence, None), 2); let sequence2 = std::str::from_utf8(b"\xe1\x84\x92\xe1\x85\xa1\xe1\x86\xab").unwrap(); assert_eq!(unicode_column_width(sequence2, None), 2); assert_eq!(grapheme_column_width(sequence2, None), 2); } } termwiz-0.22.0/src/cellcluster.rs000064400000000000000000000261001046102023000150630ustar 00000000000000use crate::cell::CellAttributes; use crate::emoji::Presentation; use crate::surface::line::CellRef; use std::borrow::Cow; use wezterm_bidi::{BidiContext, Direction, ParagraphDirectionHint}; /// A `CellCluster` is another representation of a Line. /// A `Vec` is produced by walking through the Cells in /// a line and collecting succesive Cells with the same attributes /// together into a `CellCluster` instance. Additional metadata to /// aid in font rendering is also collected. #[derive(Debug, Clone)] pub struct CellCluster { pub attrs: CellAttributes, pub text: String, pub width: usize, pub presentation: Presentation, pub direction: Direction, byte_to_cell_idx: Vec, byte_to_cell_width: Vec, pub first_cell_idx: usize, } impl CellCluster { /// Given a byte index into `self.text`, return the corresponding /// cell index in the originating line. pub fn byte_to_cell_idx(&self, byte_idx: usize) -> usize { if self.byte_to_cell_idx.is_empty() { self.first_cell_idx + byte_idx } else { self.byte_to_cell_idx[byte_idx] } } pub fn byte_to_cell_width(&self, byte_idx: usize) -> u8 { if self.byte_to_cell_width.is_empty() { 1 } else { self.byte_to_cell_width[byte_idx] } } /// Compute the list of CellClusters from a set of visible cells. /// The input is typically the result of calling `Line::visible_cells()`. pub fn make_cluster<'a>( hint: usize, iter: impl Iterator>, bidi_hint: Option, ) -> Vec { let mut last_cluster = None; let mut clusters = Vec::new(); let mut whitespace_run = 0; let mut only_whitespace = false; for c in iter { let cell_idx = c.cell_index(); let presentation = c.presentation(); let cell_str = c.str(); let normalized_attr = if c.attrs().wrapped() { let mut attr_storage = c.attrs().clone(); attr_storage.set_wrapped(false); Cow::Owned(attr_storage) } else { Cow::Borrowed(c.attrs()) }; last_cluster = match last_cluster.take() { None => { // Start new cluster only_whitespace = cell_str == " "; whitespace_run = if only_whitespace { 1 } else { 0 }; Some(CellCluster::new( hint, presentation, normalized_attr.into_owned(), cell_str, cell_idx, c.width(), )) } Some(mut last) => { if last.attrs != *normalized_attr || last.presentation != presentation { // Flush pending cluster and start a new one clusters.push(last); only_whitespace = cell_str == " "; whitespace_run = if only_whitespace { 1 } else { 0 }; Some(CellCluster::new( hint, presentation, normalized_attr.into_owned(), cell_str, cell_idx, c.width(), )) } else { // Add to current cluster. // Force cluster to break when we get a run of 2 whitespace // characters following non-whitespace. // This reduces the amount of shaping work for scenarios where // the terminal is wide and a long series of short lines are printed; // the shaper can cache the few variations of trailing whitespace // and focus on shaping the shorter cluster sequences. // Or: // when bidi is disabled, force break on whitespace boundaries. // This reduces shaping load in the case where is a line is // updated continually, but only a portion of it changes // (eg: progress counter). let was_whitespace = whitespace_run > 0; if cell_str == " " { whitespace_run += 1; } else { whitespace_run = 0; only_whitespace = false; } let force_break = (!only_whitespace && whitespace_run > 2) || (!only_whitespace && bidi_hint.is_none() && was_whitespace); if force_break { clusters.push(last); only_whitespace = cell_str == " "; if whitespace_run > 0 { whitespace_run = 1; } Some(CellCluster::new( hint, presentation, normalized_attr.into_owned(), cell_str, cell_idx, c.width(), )) } else { last.add(cell_str, cell_idx, c.width()); Some(last) } } } }; } if let Some(cluster) = last_cluster { // Don't forget to include any pending cluster on the final step! clusters.push(cluster); } if let Some(hint) = bidi_hint { let mut resolved_clusters = vec![]; let mut context = BidiContext::new(); for cluster in clusters { Self::resolve_bidi(&mut context, hint, cluster, &mut resolved_clusters); } resolved_clusters } else { clusters } } fn resolve_bidi( context: &mut BidiContext, hint: ParagraphDirectionHint, cluster: CellCluster, resolved: &mut Vec, ) { let mut paragraph = Vec::with_capacity(cluster.text.len()); let mut codepoint_index_to_byte_idx = Vec::with_capacity(cluster.text.len()); for (byte_idx, c) in cluster.text.char_indices() { codepoint_index_to_byte_idx.push(byte_idx); paragraph.push(c); } context.resolve_paragraph(¶graph, hint); for run in context.reordered_runs(0..paragraph.len()) { let mut text = String::with_capacity(run.range.end - run.range.start); let mut byte_to_cell_idx = vec![]; let mut byte_to_cell_width = vec![]; let mut width = 0usize; let mut first_cell_idx = None; // Note: if we wanted the actual bidi-re-ordered // text we should iterate over run.indices here, // however, cluster.text will be fed into harfbuzz // and that requires the original logical order // for the text, so we look at run.range instead. for cp_idx in run.range.clone() { let cp = paragraph[cp_idx]; text.push(cp); let original_byte = codepoint_index_to_byte_idx[cp_idx]; let cell_width = cluster.byte_to_cell_width(original_byte); width += cell_width as usize; let cell_idx = cluster.byte_to_cell_idx(original_byte); if first_cell_idx.is_none() { first_cell_idx.replace(cell_idx); } if !cluster.byte_to_cell_width.is_empty() { for _ in 0..cp.len_utf8() { byte_to_cell_width.push(cell_width); } } if !cluster.byte_to_cell_idx.is_empty() { for _ in 0..cp.len_utf8() { byte_to_cell_idx.push(cell_idx); } } } resolved.push(CellCluster { attrs: cluster.attrs.clone(), text, width, direction: run.direction, presentation: cluster.presentation, byte_to_cell_width, byte_to_cell_idx, first_cell_idx: first_cell_idx.unwrap(), }); } } /// Start off a new cluster with some initial data fn new( hint: usize, presentation: Presentation, attrs: CellAttributes, text: &str, cell_idx: usize, width: usize, ) -> CellCluster { let mut idx = Vec::new(); if text.len() > 1 { // Prefer to avoid pushing any index data; this saves // allocating any storage until we have any cells that // are multibyte for _ in 0..text.len() { idx.push(cell_idx); } } let mut byte_to_cell_width = Vec::new(); if width > 1 { for _ in 0..text.len() { byte_to_cell_width.push(width as u8); } } let mut storage = String::with_capacity(hint); storage.push_str(text); CellCluster { attrs, width, text: storage, presentation, byte_to_cell_idx: idx, byte_to_cell_width, first_cell_idx: cell_idx, direction: Direction::LeftToRight, } } /// Add to this cluster fn add(&mut self, text: &str, cell_idx: usize, width: usize) { self.width += width; if !self.byte_to_cell_idx.is_empty() { // We had at least one multi-byte cell in the past for _ in 0..text.len() { self.byte_to_cell_idx.push(cell_idx); } } else if text.len() > 1 { // Extrapolate the indices so far for n in 0..self.text.len() { self.byte_to_cell_idx.push(n + self.first_cell_idx); } // Now add this new multi-byte cell text for _ in 0..text.len() { self.byte_to_cell_idx.push(cell_idx); } } if !self.byte_to_cell_width.is_empty() { // We had at least one double-wide cell in the past for _ in 0..text.len() { self.byte_to_cell_width.push(width as u8); } } else if width > 1 { // Extrapolate the widths so far; they must all be single width for _ in 0..self.text.len() { self.byte_to_cell_width.push(1); } // and add the current double width cell for _ in 0..text.len() { self.byte_to_cell_width.push(width as u8); } } self.text.push_str(text); } } termwiz-0.22.0/src/color.rs000064400000000000000000000247111046102023000136660ustar 00000000000000//! Colors for attributes // for FromPrimitive #![cfg_attr(feature = "cargo-clippy", allow(clippy::useless_attribute))] use num_derive::*; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub use wezterm_color_types::{LinearRgba, SrgbaTuple}; use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value}; #[derive(Debug, Clone, Copy, FromPrimitive, PartialEq, Eq, FromDynamic, ToDynamic)] #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[repr(u8)] /// These correspond to the classic ANSI color indices and are /// used for convenience/readability in code pub enum AnsiColor { /// "Dark" black Black = 0, /// Dark red Maroon, /// Dark green Green, /// "Dark" yellow Olive, /// Dark blue Navy, /// Dark purple Purple, /// "Dark" cyan Teal, /// "Dark" white Silver, /// "Bright" black Grey, /// Bright red Red, /// Bright green Lime, /// Bright yellow Yellow, /// Bright blue Blue, /// Bright purple Fuchsia, /// Bright Cyan/Aqua Aqua, /// Bright white White, } impl From for u8 { fn from(col: AnsiColor) -> u8 { col as u8 } } /// Describes a color in the SRGB colorspace using red, green and blue /// components in the range 0-255. #[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash)] pub struct RgbColor { bits: u32, } impl Into for RgbColor { fn into(self) -> SrgbaTuple { self.to_tuple_rgba() } } impl RgbColor { /// Construct a color from discrete red, green, blue values /// in the range 0-255. pub const fn new_8bpc(red: u8, green: u8, blue: u8) -> Self { Self { bits: ((red as u32) << 16) | ((green as u32) << 8) | blue as u32, } } /// Construct a color from discrete red, green, blue values /// in the range 0.0-1.0 in the sRGB colorspace. pub fn new_f32(red: f32, green: f32, blue: f32) -> Self { let red = (red * 255.) as u8; let green = (green * 255.) as u8; let blue = (blue * 255.) as u8; Self::new_8bpc(red, green, blue) } /// Returns red, green, blue as 8bpc values. /// Will convert from 10bpc if that is the internal storage. pub fn to_tuple_rgb8(self) -> (u8, u8, u8) { ( (self.bits >> 16) as u8, (self.bits >> 8) as u8, self.bits as u8, ) } /// Returns red, green, blue as floating point values in the range 0.0-1.0. /// An alpha channel with the value of 1.0 is included. /// The values are in the sRGB colorspace. pub fn to_tuple_rgba(self) -> SrgbaTuple { SrgbaTuple( (self.bits >> 16) as u8 as f32 / 255.0, (self.bits >> 8) as u8 as f32 / 255.0, self.bits as u8 as f32 / 255.0, 1.0, ) } /// Returns red, green, blue as floating point values in the range 0.0-1.0. /// An alpha channel with the value of 1.0 is included. /// The values are converted from sRGB to linear colorspace. pub fn to_linear_tuple_rgba(self) -> LinearRgba { self.to_tuple_rgba().to_linear() } /// Construct a color from an X11/SVG/CSS3 color name. /// Returns None if the supplied name is not recognized. /// The list of names can be found here: /// pub fn from_named(name: &str) -> Option { Some(SrgbaTuple::from_named(name)?.into()) } /// Returns a string of the form `#RRGGBB` pub fn to_rgb_string(self) -> String { let (red, green, blue) = self.to_tuple_rgb8(); format!("#{:02x}{:02x}{:02x}", red, green, blue) } /// Returns a string of the form `rgb:RRRR/GGGG/BBBB` pub fn to_x11_16bit_rgb_string(self) -> String { let (red, green, blue) = self.to_tuple_rgb8(); format!( "rgb:{:02x}{:02x}/{:02x}{:02x}/{:02x}{:02x}", red, red, green, green, blue, blue ) } /// Construct a color from a string of the form `#RRGGBB` where /// R, G and B are all hex digits. /// `hsl:hue sat light` is also accepted, and allows specifying a color /// in the HSL color space, where `hue` is measure in degrees and has /// a range of 0-360, and both `sat` and `light` are specified in percentage /// in the range 0-100. pub fn from_rgb_str(s: &str) -> Option { let srgb: SrgbaTuple = s.parse().ok()?; Some(srgb.into()) } /// Construct a color from an SVG/CSS3 color name. /// or from a string of the form `#RRGGBB` where /// R, G and B are all hex digits. /// `hsl:hue sat light` is also accepted, and allows specifying a color /// in the HSL color space, where `hue` is measure in degrees and has /// a range of 0-360, and both `sat` and `light` are specified in percentage /// in the range 0-100. /// Returns None if the supplied name is not recognized. /// The list of names can be found here: /// pub fn from_named_or_rgb_string(s: &str) -> Option { RgbColor::from_rgb_str(&s).or_else(|| RgbColor::from_named(&s)) } } impl From for RgbColor { fn from(srgb: SrgbaTuple) -> RgbColor { let SrgbaTuple(r, g, b, _) = srgb; Self::new_f32(r, g, b) } } /// This is mildly unfortunate: in order to round trip RgbColor with serde /// we need to provide a Serialize impl equivalent to the Deserialize impl /// below. We use the impl below to allow more flexible specification of /// color strings in the config file. A side effect of doing it this way /// is that we have to serialize RgbColor as a 7-byte string when we could /// otherwise serialize it as a 3-byte array. There's probably a way /// to make this work more efficiently, but for now this will do. #[cfg(feature = "use_serde")] impl Serialize for RgbColor { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let s = self.to_rgb_string(); s.serialize(serializer) } } #[cfg(feature = "use_serde")] impl<'de> Deserialize<'de> for RgbColor { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; RgbColor::from_named_or_rgb_string(&s) .ok_or_else(|| format!("unknown color name: {}", s)) .map_err(serde::de::Error::custom) } } impl ToDynamic for RgbColor { fn to_dynamic(&self) -> Value { self.to_rgb_string().to_dynamic() } } impl FromDynamic for RgbColor { fn from_dynamic( value: &Value, options: FromDynamicOptions, ) -> Result { let s = String::from_dynamic(value, options)?; Ok(RgbColor::from_named_or_rgb_string(&s) .ok_or_else(|| format!("unknown color name: {}", s))?) } } /// An index into the fixed color palette. pub type PaletteIndex = u8; /// Specifies the color to be used when rendering a cell. /// This differs from `ColorAttribute` in that this type can only /// specify one of the possible color types at once, whereas the /// `ColorAttribute` type can specify a TrueColor value and a fallback. #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum ColorSpec { Default, /// Use either a raw number, or use values from the `AnsiColor` enum PaletteIndex(PaletteIndex), TrueColor(SrgbaTuple), } impl Default for ColorSpec { fn default() -> Self { ColorSpec::Default } } impl From for ColorSpec { fn from(col: AnsiColor) -> Self { ColorSpec::PaletteIndex(col as u8) } } impl From for ColorSpec { fn from(col: RgbColor) -> Self { ColorSpec::TrueColor(col.into()) } } impl From for ColorSpec { fn from(col: SrgbaTuple) -> Self { ColorSpec::TrueColor(col) } } /// Specifies the color to be used when rendering a cell. This is the /// type used in the `CellAttributes` struct and can specify an optional /// TrueColor value, allowing a fallback to a more traditional palette /// index if TrueColor is not available. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq, PartialEq, FromDynamic, ToDynamic, Hash)] pub enum ColorAttribute { /// Use RgbColor when supported, falling back to the specified PaletteIndex. TrueColorWithPaletteFallback(SrgbaTuple, PaletteIndex), /// Use RgbColor when supported, falling back to the default color TrueColorWithDefaultFallback(SrgbaTuple), /// Use the specified PaletteIndex PaletteIndex(PaletteIndex), /// Use the default color Default, } impl Default for ColorAttribute { fn default() -> Self { ColorAttribute::Default } } impl From for ColorAttribute { fn from(col: AnsiColor) -> Self { ColorAttribute::PaletteIndex(col as u8) } } impl From for ColorAttribute { fn from(spec: ColorSpec) -> Self { match spec { ColorSpec::Default => ColorAttribute::Default, ColorSpec::PaletteIndex(idx) => ColorAttribute::PaletteIndex(idx), ColorSpec::TrueColor(color) => ColorAttribute::TrueColorWithDefaultFallback(color), } } } #[cfg(test)] mod tests { use super::*; #[test] fn from_hsl() { let foo = RgbColor::from_rgb_str("hsl:235 100 50").unwrap(); assert_eq!(foo.to_rgb_string(), "#0015ff"); } #[test] fn from_rgb() { assert!(RgbColor::from_rgb_str("").is_none()); assert!(RgbColor::from_rgb_str("#xyxyxy").is_none()); let black = RgbColor::from_rgb_str("#FFF").unwrap(); assert_eq!(black.to_tuple_rgb8(), (0xf0, 0xf0, 0xf0)); let black = RgbColor::from_rgb_str("#000000").unwrap(); assert_eq!(black.to_tuple_rgb8(), (0, 0, 0)); let grey = RgbColor::from_rgb_str("rgb:D6/D6/D6").unwrap(); assert_eq!(grey.to_tuple_rgb8(), (0xd6, 0xd6, 0xd6)); let grey = RgbColor::from_rgb_str("rgb:f0f0/f0f0/f0f0").unwrap(); assert_eq!(grey.to_tuple_rgb8(), (0xf0, 0xf0, 0xf0)); } #[cfg(feature = "use_serde")] #[test] fn roundtrip_rgbcolor() { let data = varbincode::serialize(&RgbColor::from_named("DarkGreen").unwrap()).unwrap(); eprintln!("serialized as {:?}", data); let _decoded: RgbColor = varbincode::deserialize(data.as_slice()).unwrap(); } } termwiz-0.22.0/src/emoji.rs000064400000000000000000000024041046102023000136460ustar 00000000000000use crate::emoji_variation::VARIATION_MAP; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] pub enum Presentation { Text, Emoji, } impl Presentation { /// Returns the default presentation followed /// by the explicit presentation if specified /// by a variation selector pub fn for_grapheme(s: &str) -> (Self, Option) { if let Some((a, b)) = VARIATION_MAP.get(s) { return (*a, Some(*b)); } let mut presentation = Self::Text; for c in s.chars() { if Self::for_char(c) == Self::Emoji { presentation = Self::Emoji; break; } // Note that `c` may be some other combining // sequence that doesn't definitively indicate // that we're text, so we only positively // change presentation when we identify an // emoji char. } (presentation, None) } pub fn for_char(c: char) -> Self { if crate::emoji_presentation::EMOJI_PRESENTATION.contains_u32(c as u32) { Self::Emoji } else { Self::Text } } } termwiz-0.22.0/src/emoji_presentation.rs000064400000000000000000000137251046102023000164510ustar 00000000000000// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: // // ucd-generate property-bool . --include Emoji_Presentation --trie-set // // Unicode version: 13.0.0. // // ucd-generate 0.2.10 is available on crates.io. pub const EMOJI_PRESENTATION: &'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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0xC000000, 0x91E0000000000, 0x6000000000000000, 0x300000, 0x80000000000FFF00, 0x60000C0200080000, 0x242C040000104030, 0x10000000C20, 0xB85000, 0x8001000000E00000, 0x18000000, 0x210000, ], tree3_level1: &[ 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, ], 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, 0, 2, 0, 0, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 13, 19, 13, 20, 0, 0, 0, 21, 0, 0, 0, 0, 22, 23, 13, 24, 0, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], tree3_level3: &[ 0, 0x10, 0x8000, 0x7FE4000, 0xFFFFFFC000000000, 0x77C800004000002, 0x30000, 0xFFBFE001FFFFFFFF, 0xDFFFFFFFFFFFFFFF, 0xFFFFFFFF000FFFFF, 0xFF11FFFF000F87FF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFD, 0xFFFFFFFFFFFFFFFF, 0x9FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, 0x40000FFFFFF7800, 0x1000600000, 0xF800000000000000, 0xFFFF, 0x1FF0180000E7103F, 0xFFF00000000, 0xF7FFFFFFFFFFF000, 0xFDFFFFFFFFFFFFBF, 0xFFFFFFFFFFFFEFFF, 0x71F000000000000, 0x7F01FFFFFF007F, 0x7F0007, ], }; termwiz-0.22.0/src/emoji_variation.rs000064400000000000000000060001471046102023000157320ustar 00000000000000//! This file was generated by running: //! cd ../codegen ; cargo run > ../emoji_variation.rs use crate::emoji::Presentation; pub static VARIATION_MAP: phf::Map<&'static str, (Presentation, Presentation)> = ::phf::Map { key: 12913932095322966823, disps: &[ (0, 226), (1, 0), (0, 488), (2, 141), (0, 1), (0, 79), (0, 45), (0, 0), (0, 88), (0, 7), (0, 69), (0, 20), (0, 12), (0, 19), (0, 14), (0, 662), (0, 9), (0, 339), (0, 197), (0, 0), (0, 4), (0, 82), (0, 82), (0, 669), (0, 208), (0, 78), (0, 146), (0, 44), (0, 264), (0, 82), (2, 210), (0, 1), (2, 281), (0, 4), (0, 112), (0, 0), (0, 1), (0, 122), (0, 139), (1, 4), (0, 6), (0, 0), (0, 36), (4, 351), (0, 95), (3, 610), (1, 523), (0, 124), (0, 5), (2, 515), (1, 252), (0, 14), (0, 15), (4, 416), (0, 42), (0, 10), (1, 204), (0, 3), (0, 92), (0, 35), (0, 425), (0, 29), (0, 4), (0, 13), (0, 342), (0, 1), (0, 0), (0, 492), (0, 7), (0, 4), (0, 10), (0, 0), (0, 22), (0, 235), (0, 105), (1, 566), (1, 257), (0, 397), (0, 57), (0, 191), (0, 101), (0, 31), (1, 427), (0, 187), (0, 228), (1, 3), (0, 249), (0, 68), (0, 422), (0, 0), (2, 136), (1, 49), (1, 573), (0, 463), (0, 4), (2, 184), (0, 1), (0, 1), (0, 10), (8, 73), (0, 312), (0, 41), (0, 522), (3, 205), (0, 707), (0, 518), (0, 113), (10, 569), (3, 634), (0, 16), (0, 18), (0, 71), (0, 126), (1, 181), (25, 615), (0, 249), (0, 138), (0, 5), (7, 292), (0, 152), (6, 310), (0, 262), (1, 0), (0, 13), (0, 54), (0, 5), (0, 0), (0, 21), (0, 26), (4, 314), (0, 48), (0, 123), (0, 13), (0, 0), (0, 0), (0, 2), (0, 19), (6, 243), (12, 409), (3, 82), (0, 601), (0, 2), ], entries: &[ ("♈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⌚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📤\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("✳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ‘\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📟\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕧\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🔒\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â¤\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â­\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›±\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ–\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☦\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("1\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â™»\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â“\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌫\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕵\u{fe0e}", (Presentation::Text, Presentation::Text)), ("㊙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈷\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âšœ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â“\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬅\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš½\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â„\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â—»\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â£\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⌚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🅰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛑\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚇\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛓\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â±\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🅾\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⬆\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛄\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸŽ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸŒ\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🖋\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📺\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🎟\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🈯\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛽\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☎\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ•\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ•\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🖋\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âš±\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕣\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("®\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âº\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🅾\u{fe0e}", (Presentation::Text, Presentation::Text)), ("👇\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("👎\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🅱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚹\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â¹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ¦\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âœ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♑\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ \u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ­\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✈\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("8\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš§\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âœ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("®\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗃\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â¯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈷\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš«\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ™\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â›”\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗞\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✉\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš—\u{fe0e}", (Presentation::Text, Presentation::Text)), ("💣\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ³\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ‹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("💻\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📦\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📫\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â­\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📷\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☢\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â³\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👆\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â›\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸŒ\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌤\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♑\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â¹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â™\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âš«\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕉\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👽\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☺\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸŒ\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âž¡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âœ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗃\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✔\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☄\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âª\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕣\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↘\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕵\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸž\u{fe0e}", (Presentation::Text, Presentation::Text)), ("‼\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ„\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛓\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ‘\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎛\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗑\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎬\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â±\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎬\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛵\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ•\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("2\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👇\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☘\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌦\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸŸ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕙\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("6\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛋\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☮\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗞\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â˜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖲\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš“\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â—€\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("〽\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ†\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â›”\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸŠ\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌬\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖼\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("©\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕑\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â„¢\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â­•\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕟\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚲\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ›\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬆\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš–\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â„\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â—»\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕊\u{fe0e}", (Presentation::Text, Presentation::Text)), ("㊗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕢\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♟\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â™’\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â˜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎧\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🎚\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ³\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš–\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš¡\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ”\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖌\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕘\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌦\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📥\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛵\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â›·\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚺\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🔈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â—¾\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â™\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âš°\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â­•\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â©\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↗\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖱\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ¿\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â™ \u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸš\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛤\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕗\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ›\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✒\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♉\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕒\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("8\u{fe0e}", (Presentation::Text, Presentation::Text)), ("↖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ‹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛤\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕡\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ½\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖇\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗒\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌛\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸŸ\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â­\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â–¶\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â—¼\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕤\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â—\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸš\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ˜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕒\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â—½\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛳\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸŽ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☎\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ¸\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☠\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚼\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ—\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ”\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♦\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â™\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↘\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ•\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕑\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🔓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â³\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âš’\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📷\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ¦\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ‚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("7\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↕\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš”\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ•\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â™»\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛢\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕶\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›°\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☄\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â–ª\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕥\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ”\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🅰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛲\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☦\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⤵\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📺\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☠\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ‚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ℹ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📹\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("💿\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☃\u{fe0e}", (Presentation::Text, Presentation::Text)), ("5\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ¿\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕛\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ„\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🖌\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✌\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕕\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ½\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛈\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš¾\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ›\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ·\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗺\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📬\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☮\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("7\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📻\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ•\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌪\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬇\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👂\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌛\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("1\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â‡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â®\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗓\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕧\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📹\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎚\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âš \u{fe0e}", (Presentation::Text, Presentation::Text)), ("♥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬛\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚲\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸš\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â‰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ›\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("0\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕠\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â›´\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛺\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♾\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â›…\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ˜\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸœ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("↔\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖊\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎟\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕟\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📤\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("✒\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✉\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ–\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛄\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("#\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›±\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âšœ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✖\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📋\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📟\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛽\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛈\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â“‚\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☑\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♌\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ—\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚑\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸµ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕊\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🔒\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🈚\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ”\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("*\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš•\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â—¾\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âš›\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸµ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕙\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â—½\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â‰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌨\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🅱\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("〰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âº\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("💳\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("📭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âª\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("4\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ–\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📋\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("✌\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕷\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›´\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♀\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕗\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👉\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("💿\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗺\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕚\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ–\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â™’\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♎\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕞\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🖥\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸˆ\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("5\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖇\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš’\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš•\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âœ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🅿\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â–ª\u{fe0e}", (Presentation::Text, Presentation::Text)), ("👆\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🛰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â©\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ \u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("💰\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕶\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸˆ\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("👉\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â™ \u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🚼\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🖨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☔\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☑\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ†\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("💣\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♉\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â™\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⛺\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â£\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎮\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("💳\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âš—\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♋\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♊\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♿\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛢\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☀\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✡\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☣\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕥\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ›\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âœ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬛\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⤴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗄\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕖\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕖\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🛣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👽\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚘\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↕\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›·\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â™\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âš™\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛠\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â™\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👎\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⤵\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📽\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš™\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🔈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ•\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♋\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ℹ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("4\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕦\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↪\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚘\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("✡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♟\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👈\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("6\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕉\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬅\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📦\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("↗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖊\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌎\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕠\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ˜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("9\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ—\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛎\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â—€\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♌\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("♾\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖲\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕘\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âš°\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âœ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📬\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âš \u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â›°\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛳\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♿\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â‡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👂\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("0\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš›\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("3\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✈\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✳\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⤴\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕞\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("↔\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ•\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕡\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📥\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♀\u{fe0e}", (Presentation::Text, Presentation::Text)), ("‼\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸŸ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â­\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ—\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕛\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚪\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗒\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â²\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎛\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛋\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🗑\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕳\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("👓\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🕷\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♊\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎞\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸŒ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("↙\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🖼\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✴\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☀\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🛡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🅿\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸŠ\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☣\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("*\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("#\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌤\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â›…\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌎\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕢\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("âš¡\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("〽\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌶\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚺\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🕹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⌨\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ˜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸš\u{fe0e}", (Presentation::Text, Presentation::Text)), ("âš“\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🗄\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕜\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("✂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("©\u{fe0e}", (Presentation::Text, Presentation::Text)), ("㊗\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎖\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â¸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☃\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âž¡\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⬜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🀄\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🚭\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ‘\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌶\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ›\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("♂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛠\u{fe0e}", (Presentation::Text, Presentation::Text)), ("💻\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📽\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš±\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â“‚\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â¯\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš¾\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("♎\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚇\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("âš½\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌩\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌕\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸ¸\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â–¶\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⬇\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🕤\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("3\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ‘\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌬\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🚑\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â˜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš§\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸŒ\u{fe0e}", (Presentation::Text, Presentation::Text)), ("〰\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â¸\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸŒ\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("⚪\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("☺\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â—\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌜\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("㊙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("⛲\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("â–«\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â®\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â¤\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸœ\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("9\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕦\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("📭\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎮\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("⛹\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â²\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("💰\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("â˜\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("âš”\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🗓\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ­\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("ðŸ·\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("ðŸ™\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🛎\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🎧\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🌥\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â–«\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🔓\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("👈\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🈂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("✂\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕔\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("🎙\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🕰\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☹\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌩\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🌧\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("â„¢\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ–\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☢\u{fe0e}", (Presentation::Text, Presentation::Text)), ("⛑\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🎞\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🈯\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("ðŸŸ\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("☯\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸ–\u{fe0e}", (Presentation::Text, Presentation::Text)), ("ðŸž\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("📫\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🗂\u{fe0e}", (Presentation::Text, Presentation::Text)), ("📻\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🌧\u{fe0e}", (Presentation::Text, Presentation::Text)), ("â—¼\u{fe0e}", (Presentation::Text, Presentation::Text)), ("♦\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("🀄\u{fe0e}", (Presentation::Emoji, Presentation::Text)), ("🚹\u{fe0f}", (Presentation::Emoji, Presentation::Emoji)), ("2\u{fe0e}", (Presentation::Text, Presentation::Text)), ("☘\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("☸\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ("✔\u{fe0e}", (Presentation::Text, Presentation::Text)), ("🌫\u{fe0f}", (Presentation::Text, Presentation::Emoji)), ], }; use crate::widechar_width::{WcLookupTable, WcWidth}; pub const WCWIDTH_TABLE: WcLookupTable = WcLookupTable { table: [ WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::WidenedIn9, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Ambiguous, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::PrivateUse, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::Combining, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::NonCharacter, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Combining, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Two, WcWidth::Unassigned, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::One, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::Unassigned, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::NonPrint, WcWidth::One, WcWidth::Ambiguous, WcWidth::NonCharacter, WcWidth::NonCharacter, ], }; termwiz-0.22.0/src/error.rs000064400000000000000000000120521046102023000136740ustar 00000000000000use std::fmt::Display; use thiserror::*; /// The termwiz Error type encapsulates a range of internal /// errors in an opaque manner. You can use the `source` /// method to reach the underlying errors if /// necessary, but it is not expected that most code will /// need to do so. Please file an issue if you've got a /// usecase for this! #[derive(Error, Debug)] #[error(transparent)] pub struct Error(pub(crate) InternalError); /// A Result whose error type is a termwiz Error pub type Result = std::result::Result; impl From for Error where E: Into, { fn from(err: E) -> Self { Self(err.into()) } } /// This enum encapsulates the various errors that can be /// mapped into the termwiz Error type. /// The intent is that this is effectively private to termwiz /// itself, but since Rust doesn't allow enums with private /// variants, we're dancing around with a newtype of an enum /// and hiding it from the docs. #[derive(Error, Debug)] #[non_exhaustive] #[doc(hidden)] pub enum InternalError { #[error(transparent)] Fmt(#[from] std::fmt::Error), #[error(transparent)] Io(#[from] std::io::Error), #[error(transparent)] Regex(#[from] fancy_regex::Error), #[error(transparent)] FromUtf8(#[from] std::string::FromUtf8Error), #[error(transparent)] Utf8(#[from] std::str::Utf8Error), #[error(transparent)] Base64(#[from] base64::DecodeError), #[error(transparent)] ParseFloat(#[from] std::num::ParseFloatError), #[error(transparent)] ParseInt(#[from] std::num::ParseIntError), #[error(transparent)] FloatIsNan(#[from] ordered_float::FloatIsNan), #[error("{0}")] StringErr(#[from] StringWrap), #[error(transparent)] Anyhow(#[from] anyhow::Error), #[error(transparent)] Terminfo(#[from] terminfo::Error), #[error(transparent)] FileDescriptor(#[from] filedescriptor::Error), #[error(transparent)] BlobLease(#[from] wezterm_blob_leases::Error), #[cfg(feature = "use_image")] #[error(transparent)] ImageError(#[from] image::ImageError), #[error("{}", .context)] Context { context: String, source: Box, }, } impl From for InternalError { fn from(s: String) -> Self { InternalError::StringErr(StringWrap(s)) } } #[derive(Error, Debug)] #[doc(hidden)] #[error("{0}")] pub struct StringWrap(pub String); #[macro_export] macro_rules! format_err { ($msg:literal $(,)?) => { return $crate::error::Error::from($crate::error::StringWrap($msg.to_string())) }; ($err:expr $(,)?) => { return $crate::error::Error::from($crate::error::StringWrap(format!($err))) }; ($fmt:expr, $($arg:tt)*) => { return $crate::error::Error::from($crate::error::StringWrap(format!($fmt, $($arg)*))) }; } #[macro_export] macro_rules! bail { ($msg:literal $(,)?) => { return Err($crate::error::StringWrap($msg.to_string()).into()) }; ($err:expr $(,)?) => { return Err($crate::error::StringWrap(format!($err)).into()) }; ($fmt:expr, $($arg:tt)*) => { return Err($crate::error::StringWrap(format!($fmt, $($arg)*)).into()) }; } #[macro_export] macro_rules! ensure { ($cond:expr, $msg:literal $(,)?) => { if !$cond { return Err($crate::error::StringWrap(format!($msg)).into()); } }; ($cond:expr, $err:expr $(,)?) => { if !$cond { return Err($crate::error::StringWrap(format!($err)).into()); } }; ($cond:expr, $fmt:expr, $($arg:tt)*) => { if !$cond { return Err($crate::error::StringWrap(format!($fmt, $($arg)*)).into()); } }; } /// This trait allows extending the Result type so that it can create a /// `termwiz::Error` that wraps an underlying other error and provide /// additional context on that error. pub trait Context { /// Wrap the error value with additional context. fn context(self, context: C) -> Result where C: Display + Send + Sync + 'static; /// Wrap the error value with additional context that is evaluated lazily /// only once an error does occur. fn with_context(self, f: F) -> Result where C: Display + Send + Sync + 'static, F: FnOnce() -> C; } impl Context for std::result::Result where E: std::error::Error + Send + Sync + 'static, { fn context(self, context: C) -> Result where C: Display + Send + Sync + 'static, { self.map_err(|error| { Error(InternalError::Context { context: context.to_string(), source: Box::new(error), }) }) } fn with_context(self, context: F) -> Result where C: Display + Send + Sync + 'static, F: FnOnce() -> C, { self.map_err(|error| { Error(InternalError::Context { context: context().to_string(), source: Box::new(error), }) }) } } termwiz-0.22.0/src/escape/apc.rs000064400000000000000000001156241046102023000145570ustar 00000000000000use crate::escape::osc::{base64_decode, base64_encode}; use std::collections::BTreeMap; use std::fmt::{Display, Error as FmtError, Formatter}; use std::io::{Read, Seek}; fn get<'a>(keys: &BTreeMap<&str, &'a str>, k: &str) -> Option<&'a str> { keys.get(k).map(|&s| s) } fn geti(keys: &BTreeMap<&str, &str>, k: &str) -> Option { get(keys, k).and_then(|s| s.parse().ok()) } fn set( keys: &mut BTreeMap<&'static str, String>, k: &'static str, v: &Option, ) { if let Some(v) = v { keys.insert(k, v.to_string()); } } #[derive(Clone, PartialEq, Eq)] pub enum KittyImageData { /// The data bytes, baes64-encoded fragments. /// t='d' Direct(String), DirectBin(Vec), /// The path to a file containing the data. /// t='f' File { path: String, /// the amount of data to read. /// S=... data_size: Option, /// The offset at which to read. /// O=... data_offset: Option, }, /// The path to a temporary file containing the data. /// If the path is in a known temporary location, /// it should be removed once the data has been read /// t='t' TemporaryFile { path: String, /// the amount of data to read. /// S=... data_size: Option, /// The offset at which to read. /// O=... data_offset: Option, }, /// The name of a shared memory object. /// Can be opened via shm_open() and then should be removed /// via shm_unlink(). /// On Windows, OpenFileMapping(), MapViewOfFile(), UnmapViewOfFile() /// and CloseHandle() are used to access and release the data. /// t='s' SharedMem { name: String, /// the amount of data to read. /// S=... data_size: Option, /// The offset at which to read. /// O=... data_offset: Option, }, } impl std::fmt::Debug for KittyImageData { fn fmt(&self, fmt: &mut Formatter) -> std::fmt::Result { match self { Self::Direct(data) => write!(fmt, "Direct({} bytes of data)", data.len()), Self::DirectBin(data) => write!(fmt, "DirectBin({} bytes of data)", data.len()), Self::File { path, data_offset, data_size, } => fmt .debug_struct("File") .field("path", &path) .field("data_offset", &data_offset) .field("data_size", data_size) .finish(), Self::TemporaryFile { path, data_offset, data_size, } => fmt .debug_struct("TemporaryFile") .field("path", &path) .field("data_offset", &data_offset) .field("data_size", data_size) .finish(), Self::SharedMem { name, data_offset, data_size, } => fmt .debug_struct("SharedMem") .field("name", &name) .field("data_offset", &data_offset) .field("data_size", data_size) .finish(), } } } impl KittyImageData { fn from_keys(keys: &BTreeMap<&str, &str>, payload: &[u8]) -> Option { let t = get(keys, "t").unwrap_or("d"); match t { "d" => Some(Self::Direct(String::from_utf8(payload.to_vec()).ok()?)), "f" => Some(Self::File { path: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), "t" => Some(Self::TemporaryFile { path: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), "s" => Some(Self::SharedMem { name: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::Direct(d) => { keys.insert("payload", d.to_string()); } Self::DirectBin(d) => { keys.insert("payload", base64_encode(d)); } Self::File { path, data_offset, data_size, } => { keys.insert("t", "f".to_string()); keys.insert("payload", base64_encode(&path)); set(keys, "S", data_size); set(keys, "S", data_offset); } Self::TemporaryFile { path, data_offset, data_size, } => { keys.insert("t", "t".to_string()); keys.insert("payload", base64_encode(&path)); set(keys, "S", data_size); set(keys, "S", data_offset); } Self::SharedMem { name, data_offset, data_size, } => { keys.insert("t", "s".to_string()); keys.insert("payload", base64_encode(&name)); set(keys, "S", data_size); set(keys, "S", data_offset); } } } /// Take the image data bytes. /// This operation is not repeatable as some of the sources require /// removing the underlying file or shared memory object as part /// of the read operaiton. pub fn load_data(self) -> std::io::Result> { fn read_from_file( path: &str, data_offset: Option, data_size: Option, ) -> std::io::Result> { let mut f = std::fs::File::open(path)?; if let Some(offset) = data_offset { f.seek(std::io::SeekFrom::Start(offset.into()))?; } if let Some(len) = data_size { let mut res = vec![0u8; len as usize]; f.read_exact(&mut res)?; Ok(res) } else { let mut res = vec![]; f.read_to_end(&mut res)?; Ok(res) } } match self { Self::Direct(data) => base64_decode(data).or_else(|err| { Err(std::io::Error::new( std::io::ErrorKind::InvalidInput, format!("base64 decode: {err:#}"), )) }), Self::DirectBin(bin) => Ok(bin), Self::File { path, data_offset, data_size, } => read_from_file(&path, data_offset, data_size), Self::TemporaryFile { path, data_offset, data_size, } => { let data = read_from_file(&path, data_offset, data_size)?; // need to sanity check that the path looks like a reasonable // temporary directory path before blindly unlinking it here. fn looks_like_temp_path(p: &str) -> bool { if p.starts_with("/tmp/") || p.starts_with("/var/tmp/") || p.starts_with("/dev/shm/") { return true; } if let Ok(t) = std::env::var("TMPDIR") { if p.starts_with(&t) { return true; } } false } if looks_like_temp_path(&path) { if let Err(err) = std::fs::remove_file(&path) { log::error!( "Unable to remove kitty image protocol temporary file {}: {:#}", path, err ); } } else { log::warn!( "kitty image protocol temporary file {} isn't in a known \ temporary directory; won't try to remove it", path ); } Ok(data) } Self::SharedMem { name, data_offset, data_size, } => read_shared_memory_data(&name, data_offset, data_size), } } } #[cfg(all(unix, not(target_os = "android")))] fn read_shared_memory_data( name: &str, data_offset: Option, data_size: Option, ) -> std::result::Result, std::io::Error> { use nix::sys::mman::{shm_open, shm_unlink}; use std::fs::File; use std::os::unix::io::FromRawFd; let raw_fd = shm_open( name, nix::fcntl::OFlag::O_RDONLY, nix::sys::stat::Mode::empty(), ) .map_err(|_| { let err = std::io::Error::last_os_error(); std::io::Error::new( std::io::ErrorKind::Other, format!("shm_open {} failed: {:#}", name, err), ) })?; let mut f = unsafe { File::from_raw_fd(raw_fd) }; if let Some(offset) = data_offset { f.seek(std::io::SeekFrom::Start(offset.into()))?; } let data = if let Some(len) = data_size { let mut res = vec![0u8; len as usize]; f.read_exact(&mut res)?; res } else { let mut res = vec![]; f.read_to_end(&mut res)?; res }; if let Err(err) = shm_unlink(name) { log::warn!( "Unable to unlink kitty image protocol shm file {}: {:#}", name, err ); } Ok(data) } #[cfg(all(unix, target_os = "android"))] fn read_shared_memory_data( _name: &str, _data_offset: Option, _data_size: Option, ) -> std::result::Result, std::io::Error> { Err(std::io::ErrorKind::Unsupported.into()) } #[cfg(windows)] mod win { use winapi::um::handleapi::CloseHandle; use winapi::um::memoryapi::{ MapViewOfFile, OpenFileMappingW, UnmapViewOfFile, VirtualQuery, FILE_MAP_ALL_ACCESS, }; use winapi::um::winnt::{HANDLE, MEMORY_BASIC_INFORMATION}; struct HandleWrapper { handle: HANDLE, } struct SharedMemObject { _handle: HandleWrapper, buf: *mut u8, } impl Drop for HandleWrapper { fn drop(&mut self) { unsafe { CloseHandle(self.handle); } } } impl Drop for SharedMemObject { fn drop(&mut self) { unsafe { UnmapViewOfFile(self.buf as _); } } } /// Convert a rust string to a windows wide string fn wide_string(s: &str) -> Vec { use std::os::windows::ffi::OsStrExt; std::ffi::OsStr::new(s) .encode_wide() .chain(std::iter::once(0)) .collect() } pub fn read_shared_memory_data( name: &str, data_offset: Option, data_size: Option, ) -> std::result::Result, std::io::Error> { let wide_name = wide_string(&name); let handle = unsafe { OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, wide_name.as_ptr()) }; if handle.is_null() { let err = std::io::Error::last_os_error(); return Err(std::io::Error::new( std::io::ErrorKind::Other, format!("OpenFileMappingW {} failed: {:#}", name, err), )); } let handle_wrapper = HandleWrapper { handle }; let buf = unsafe { MapViewOfFile(handle_wrapper.handle, FILE_MAP_ALL_ACCESS, 0, 0, 0) }; if buf.is_null() { let err = std::io::Error::last_os_error(); return Err(std::io::Error::new( std::io::ErrorKind::Other, format!("MapViewOfFile failed: {:#}", err), )); } let shm = SharedMemObject { _handle: handle_wrapper, buf: buf as *mut u8, }; let mut memory_info = MEMORY_BASIC_INFORMATION::default(); let res = unsafe { VirtualQuery( shm.buf as _, &mut memory_info as *mut MEMORY_BASIC_INFORMATION, std::mem::size_of::(), ) }; if res == 0 { let err = std::io::Error::last_os_error(); return Err(std::io::Error::new( std::io::ErrorKind::Other, format!( "Can't get the size of Shared Memory, VirtualQuery failed: {:#}", err ), )); } let mut size = memory_info.RegionSize; let offset = data_offset.unwrap_or(0) as usize; if offset >= size { return Err(std::io::Error::new( std::io::ErrorKind::Other, format!( "offset {} bigger than or equal to shm region size {}", offset, size ), )); } size = size.saturating_sub(offset); if let Some(val) = data_size { size = size.min(val as usize); } let buf_slice = unsafe { std::slice::from_raw_parts(shm.buf.add(offset), size) }; let data = buf_slice.to_vec(); Ok(data) } } #[cfg(windows)] use win::read_shared_memory_data; #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum KittyImageVerbosity { Verbose, OnlyErrors, Quiet, } impl KittyImageVerbosity { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { match get(keys, "q") { None | Some("0") => Some(Self::Verbose), Some("1") => Some(Self::OnlyErrors), Some("2") => Some(Self::Quiet), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::Verbose => {} Self::OnlyErrors => { keys.insert("q", "1".to_string()); } Self::Quiet => { keys.insert("q", "2".to_string()); } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImageFormat { /// f=24 Rgb, /// f=32 Rgba, /// f=100 Png, } impl KittyImageFormat { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option> { match get(keys, "f") { None => Some(None), Some("32") => Some(Some(Self::Rgba)), Some("24") => Some(Some(Self::Rgb)), Some("100") => Some(Some(Self::Png)), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::Rgb => keys.insert("f", "24".to_string()), Self::Rgba => keys.insert("f", "32".to_string()), Self::Png => keys.insert("f", "100".to_string()), }; } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImageCompression { None, /// o='z' Deflate, } impl KittyImageCompression { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { match get(keys, "o") { None => Some(Self::None), Some("z") => Some(Self::Deflate), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::None => {} Self::Deflate => { keys.insert("o", "z".to_string()); } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImageTransmit { /// f=... pub format: Option, /// combination of t=... and d=... pub data: KittyImageData, /// s=... pub width: Option, /// v=... pub height: Option, /// The image id. /// i=... pub image_id: Option, /// The image number /// I=... pub image_number: Option, /// o=... pub compression: KittyImageCompression, /// m=0 or m=1 pub more_data_follows: bool, } impl KittyImageTransmit { fn from_keys(keys: &BTreeMap<&str, &str>, payload: &[u8]) -> Option { Some(Self { format: KittyImageFormat::from_keys(keys)?, data: KittyImageData::from_keys(keys, payload)?, compression: KittyImageCompression::from_keys(keys)?, width: geti(keys, "s"), height: geti(keys, "v"), image_id: geti(keys, "i"), image_number: geti(keys, "I"), more_data_follows: match get(keys, "m") { None | Some("0") => false, Some("1") => true, _ => return None, }, }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { if let Some(f) = &self.format { f.to_keys(keys); } set(keys, "s", &self.width); set(keys, "v", &self.height); set(keys, "i", &self.image_id); set(keys, "I", &self.image_number); if self.more_data_follows { keys.insert("m", "1".to_string()); } self.compression.to_keys(keys); self.data.to_keys(keys); } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImagePlacement { /// source rectangle bounds. /// Default is whole image. /// x=... pub x: Option, pub y: Option, pub w: Option, pub h: Option, /// Place the image at an offset from the cell. /// X,Y must be <= cell metrics /// X=... pub x_offset: Option, /// Y=... pub y_offset: Option, /// Scale so that the image fits within this number of columns /// c=... pub columns: Option, /// Scale so that the image fits within this number of rows /// r=... pub rows: Option, /// By default, cursor will move to after the bottom right /// cell of the image placement. do_not_move_cursor cursor /// set to true prevents that. /// C=0, C=1 pub do_not_move_cursor: bool, /// Give an explicit placement id to this placement. /// p=... pub placement_id: Option, /// z=... pub z_index: Option, } impl KittyImagePlacement { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { Some(Self { x: geti(keys, "x"), y: geti(keys, "y"), w: geti(keys, "w"), h: geti(keys, "h"), x_offset: geti(keys, "X"), y_offset: geti(keys, "Y"), columns: geti(keys, "c"), rows: geti(keys, "r"), placement_id: geti(keys, "p"), do_not_move_cursor: match get(keys, "C") { None | Some("0") => false, Some("1") => true, _ => return None, }, z_index: geti(keys, "z"), }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { set(keys, "x", &self.x); set(keys, "y", &self.y); set(keys, "w", &self.w); set(keys, "h", &self.h); set(keys, "X", &self.x_offset); set(keys, "Y", &self.y_offset); set(keys, "c", &self.columns); set(keys, "r", &self.rows); set(keys, "p", &self.placement_id); if self.do_not_move_cursor { keys.insert("C", "1".to_string()); } set(keys, "z", &self.z_index); } } /// When the uppercase form is used, the delete: field is set to true /// which means that the underlying data is also released. Otherwise, /// the data is available to be placed again. #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImageDelete { /// d='a' or d='A'. /// Delete all placements on visible screen All { delete: bool }, /// d='i' or d='I' /// Delete all images with specified image_id. /// If placement_id is specified, then both image_id /// and placement_id must match ByImageId { image_id: u32, placement_id: Option, delete: bool, }, /// d='n' or d='N' /// Delete newest image with specified image number. /// If placement_id is specified, then placement_id /// must also match. ByImageNumber { image_number: u32, placement_id: Option, delete: bool, }, /// d='c' or d='C' /// Delete all placements that intersect with the current /// cursor position. AtCursorPosition { delete: bool }, /// d='f' or d='F' /// Delete animation frames AnimationFrames { delete: bool }, /// d='p' or d='P' /// Delete all placements that intersect the specified /// cell x and y coordinates DeleteAt { x: u32, y: u32, delete: bool }, /// d='q' or d='Q' /// Delete all placements that intersect the specified /// cell x and y coordinates, with the specified z-index DeleteAtZ { x: u32, y: u32, z: i32, delete: bool, }, /// d='x' or d='X' /// Delete all placements that intersect the specified column. DeleteColumn { x: u32, delete: bool }, /// d='y' or d='Y' /// Delete all placements that intersect the specified row. DeleteRow { y: u32, delete: bool }, /// d='z' or d='Z' /// Delete all placements that have the specified z-index. DeleteZ { z: i32, delete: bool }, } impl KittyImageDelete { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { let d = get(keys, "d").unwrap_or("a"); if d.len() != 1 { return None; } let d = d.chars().next()?; let delete = d.is_ascii_uppercase(); match d { 'a' | 'A' => Some(Self::All { delete }), 'i' | 'I' => Some(Self::ByImageId { image_id: geti(keys, "i")?, placement_id: geti(keys, "p"), delete, }), 'n' | 'N' => Some(Self::ByImageNumber { image_number: geti(keys, "I")?, placement_id: geti(keys, "p"), delete, }), 'c' | 'C' => Some(Self::AtCursorPosition { delete }), 'f' | 'F' => Some(Self::AnimationFrames { delete }), 'p' | 'P' => Some(Self::DeleteAt { x: geti(keys, "x")?, y: geti(keys, "y")?, delete, }), 'q' | 'Q' => Some(Self::DeleteAtZ { x: geti(keys, "x")?, y: geti(keys, "y")?, z: geti(keys, "z")?, delete, }), 'x' | 'X' => Some(Self::DeleteColumn { x: geti(keys, "x")?, delete, }), 'y' | 'Y' => Some(Self::DeleteRow { y: geti(keys, "y")?, delete, }), 'z' | 'Z' => Some(Self::DeleteZ { z: geti(keys, "z")?, delete, }), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { fn d(c: char, delete: &bool) -> String { if *delete { c.to_ascii_uppercase() } else { c }.to_string() } match self { Self::All { delete } => { keys.insert("d", d('a', delete)); } Self::ByImageId { image_id, placement_id, delete, } => { keys.insert("d", d('i', delete)); if let Some(p) = placement_id { keys.insert("p", p.to_string()); } keys.insert("i", image_id.to_string()); } Self::ByImageNumber { image_number, placement_id, delete, } => { keys.insert("d", d('n', delete)); if let Some(p) = placement_id { keys.insert("p", p.to_string()); } keys.insert("I", image_number.to_string()); } Self::AtCursorPosition { delete } => { keys.insert("d", d('c', delete)); } Self::AnimationFrames { delete } => { keys.insert("d", d('f', delete)); } Self::DeleteAt { x, y, delete } => { keys.insert("d", d('p', delete)); keys.insert("x", x.to_string()); keys.insert("y", y.to_string()); } Self::DeleteAtZ { x, y, z, delete } => { keys.insert("d", d('p', delete)); keys.insert("x", x.to_string()); keys.insert("y", y.to_string()); keys.insert("z", z.to_string()); } Self::DeleteColumn { x, delete } => { keys.insert("d", d('x', delete)); keys.insert("x", x.to_string()); } Self::DeleteRow { y, delete } => { keys.insert("d", d('y', delete)); keys.insert("y", y.to_string()); } Self::DeleteZ { z, delete } => { keys.insert("d", d('z', delete)); keys.insert("z", z.to_string()); } } } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum KittyFrameCompositionMode { AlphaBlending, Overwrite, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImageFrameCompose { /// i=... pub image_id: Option, /// I=... pub image_number: Option, /// 1-based number of the frame which should be the base /// data for the new frame being created. /// If omitted, use background_pixel to specify color. /// c=... pub target_frame: Option, /// 1-based number of the frame which should be edited. /// If omitted, a new frame is created. /// r=... pub source_frame: Option, /// Left edge in pixels to update /// x=... pub x: Option, /// Top edge in pixels to update /// y=... pub y: Option, /// Width (in pixels) of the source and destination rectangles. /// By default the full width is used. /// w=... pub w: Option, /// Height (in pixels) of the source and destination rectangles. /// By default the full height is used. /// h=... pub h: Option, /// Left edge in pixels of the source rectangle /// X=... pub src_x: Option, /// Top edge in pixels of the source rectangle /// Y=... pub src_y: Option, /// Composition mode. /// Default is AlphaBlending /// C=... pub composition_mode: KittyFrameCompositionMode, } impl KittyImageFrameCompose { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { Some(Self { image_id: geti(keys, "i"), image_number: geti(keys, "I"), x: geti(keys, "x"), y: geti(keys, "y"), src_x: geti(keys, "X"), src_y: geti(keys, "Y"), w: geti(keys, "w"), h: geti(keys, "h"), target_frame: match geti(keys, "c") { None | Some(0) => None, n => n, }, source_frame: match geti(keys, "r") { None | Some(0) => None, n => n, }, composition_mode: match geti(keys, "C") { None | Some(0) => KittyFrameCompositionMode::AlphaBlending, Some(1) => KittyFrameCompositionMode::Overwrite, _ => return None, }, }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { set(keys, "i", &self.image_id); set(keys, "I", &self.image_number); set(keys, "w", &self.w); set(keys, "h", &self.h); set(keys, "x", &self.x); set(keys, "y", &self.y); set(keys, "X", &self.src_x); set(keys, "Y", &self.src_y); set(keys, "c", &self.target_frame); set(keys, "r", &self.source_frame); match &self.composition_mode { KittyFrameCompositionMode::AlphaBlending => {} KittyFrameCompositionMode::Overwrite => { keys.insert("C", "1".to_string()); } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct KittyImageFrame { /// Left edge in pixels to update pub x: Option, /// Top edge in pixels to update pub y: Option, /// 1-based number of the frame which should be the base /// data for the new frame being created. /// If omitted, use background_pixel to specify color. /// c=... pub base_frame: Option, /// 1-based number of the frame which should be edited. /// If omitted, a new frame is created. /// r=... pub frame_number: Option, /// Gap in milliseconds of this frame from the next one. /// Zero or omitted values are interpreted as 40ms. /// z=... pub duration_ms: Option, /// Composition mode. /// Default is AlphaBlending /// X=... pub composition_mode: KittyFrameCompositionMode, /// Background color for pixels not specified in the frame data. /// If omitted, use a black, fully-transparent pixel (0) /// Y=... pub background_pixel: Option, } impl KittyImageFrame { fn from_keys(keys: &BTreeMap<&str, &str>) -> Option { Some(Self { x: geti(keys, "x"), y: geti(keys, "y"), base_frame: match geti(keys, "c") { None | Some(0) => None, n => n, }, frame_number: match geti(keys, "r") { None | Some(0) => None, n => n, }, duration_ms: match geti(keys, "Z") { None | Some(0) => None, n => n, }, composition_mode: match geti(keys, "X") { None | Some(0) => KittyFrameCompositionMode::AlphaBlending, Some(1) => KittyFrameCompositionMode::Overwrite, _ => return None, }, background_pixel: geti(keys, "Y"), }) } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { set(keys, "x", &self.x); set(keys, "y", &self.y); set(keys, "c", &self.base_frame); set(keys, "r", &self.frame_number); set(keys, "Z", &self.duration_ms); match &self.composition_mode { KittyFrameCompositionMode::AlphaBlending => {} KittyFrameCompositionMode::Overwrite => { keys.insert("X", "1".to_string()); } } set(keys, "Y", &self.background_pixel); } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum KittyImage { /// a='t' TransmitData { transmit: KittyImageTransmit, verbosity: KittyImageVerbosity, }, /// a='T' TransmitDataAndDisplay { transmit: KittyImageTransmit, placement: KittyImagePlacement, verbosity: KittyImageVerbosity, }, /// a='p' Display { image_id: Option, image_number: Option, placement: KittyImagePlacement, verbosity: KittyImageVerbosity, }, /// a='d' Delete { what: KittyImageDelete, verbosity: KittyImageVerbosity, }, /// a='q' Query { transmit: KittyImageTransmit }, /// a='f' TransmitFrame { transmit: KittyImageTransmit, frame: KittyImageFrame, verbosity: KittyImageVerbosity, }, /// a='c' ComposeFrame { frame: KittyImageFrameCompose, verbosity: KittyImageVerbosity, }, } impl KittyImage { pub fn verbosity(&self) -> KittyImageVerbosity { match self { Self::TransmitData { verbosity, .. } => *verbosity, Self::Query { .. } => KittyImageVerbosity::Verbose, Self::TransmitDataAndDisplay { verbosity, .. } => *verbosity, Self::Display { verbosity, .. } => *verbosity, Self::Delete { verbosity, .. } => *verbosity, Self::TransmitFrame { verbosity, .. } => *verbosity, Self::ComposeFrame { verbosity, .. } => *verbosity, } } pub fn parse_apc(data: &[u8]) -> Option { if data.is_empty() || data[0] != b'G' { return None; } let mut keys_payload_iter = data[1..].splitn(2, |&d| d == b';'); let keys = keys_payload_iter.next()?; let key_string = std::str::from_utf8(keys).ok()?; let mut keys: BTreeMap<&str, &str> = BTreeMap::new(); for k_v in key_string.split(',') { let mut k_v = k_v.splitn(2, '='); let k = k_v.next()?; let v = k_v.next()?; keys.insert(k, v); } let payload = keys_payload_iter.next().unwrap_or(b""); let action = get(&keys, "a").unwrap_or("t"); let verbosity = KittyImageVerbosity::from_keys(&keys)?; match action { "t" => Some(Self::TransmitData { transmit: KittyImageTransmit::from_keys(&keys, payload)?, verbosity, }), "q" => Some(Self::Query { transmit: KittyImageTransmit::from_keys(&keys, payload)?, }), "T" => Some(Self::TransmitDataAndDisplay { transmit: KittyImageTransmit::from_keys(&keys, payload)?, placement: KittyImagePlacement::from_keys(&keys)?, verbosity, }), "p" => Some(Self::Display { placement: KittyImagePlacement::from_keys(&keys)?, image_id: geti(&keys, "i"), image_number: geti(&keys, "I"), verbosity, }), "d" => Some(Self::Delete { what: KittyImageDelete::from_keys(&keys)?, verbosity, }), "f" => Some(Self::TransmitFrame { transmit: KittyImageTransmit::from_keys(&keys, payload)?, frame: KittyImageFrame::from_keys(&keys)?, verbosity, }), "c" => Some(Self::ComposeFrame { frame: KittyImageFrameCompose::from_keys(&keys)?, verbosity, }), _ => None, } } fn to_keys(&self, keys: &mut BTreeMap<&'static str, String>) { match self { Self::TransmitData { transmit, verbosity, } => { // Implied: keys.insert("a", "t".to_string()); verbosity.to_keys(keys); transmit.to_keys(keys); } Self::Query { transmit } => { keys.insert("a", "q".to_string()); transmit.to_keys(keys); } Self::TransmitDataAndDisplay { transmit, verbosity, placement, } => { keys.insert("a", "Q".to_string()); verbosity.to_keys(keys); placement.to_keys(keys); transmit.to_keys(keys); } Self::Display { image_id, image_number, placement, verbosity, } => { keys.insert("a", "p".to_string()); verbosity.to_keys(keys); placement.to_keys(keys); if let Some(image_id) = image_id { keys.insert("i", image_id.to_string()); } if let Some(image_number) = image_number { keys.insert("I", image_number.to_string()); } } Self::Delete { what, verbosity } => { keys.insert("a", "d".to_string()); verbosity.to_keys(keys); what.to_keys(keys); } Self::TransmitFrame { transmit, verbosity, frame, } => { keys.insert("a", "f".to_string()); transmit.to_keys(keys); frame.to_keys(keys); verbosity.to_keys(keys); } Self::ComposeFrame { frame, verbosity } => { keys.insert("a", "c".to_string()); frame.to_keys(keys); verbosity.to_keys(keys); } } } } impl Display for KittyImage { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { write!(f, "\x1b_G")?; let mut keys = BTreeMap::new(); self.to_keys(&mut keys); let mut payload = None; let mut first = true; for (k, v) in keys { if k == "payload" { payload = Some(v); } else { if first { first = false; } else { write!(f, ",")?; } write!(f, "{}={}", k, v)?; } } if let Some(p) = payload { write!(f, ";{}", p)?; } Ok(()) } } #[cfg(test)] mod test { use super::*; use k9::assert_equal as assert_eq; #[test] fn kitty_payload() { assert_eq!( KittyImage::parse_apc("Gf=24,s=10,v=20;aGVsbG8=".as_bytes()).unwrap(), KittyImage::TransmitData { transmit: KittyImageTransmit { format: Some(KittyImageFormat::Rgb), data: KittyImageData::Direct("aGVsbG8=".to_string()), width: Some(10), height: Some(20), image_id: None, image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, verbosity: KittyImageVerbosity::Verbose, } ); assert_eq!( KittyImage::parse_apc("Ga=d,q=2".as_bytes()).unwrap(), KittyImage::Delete { what: KittyImageDelete::All { delete: false }, verbosity: KittyImageVerbosity::Quiet } ); assert_eq!( KittyImage::parse_apc( "Ga=f,x=119,y=384,s=17,v=32,i=7257421,X=1,r=1,q=2;AAAA=".as_bytes() ) .unwrap(), KittyImage::TransmitFrame { transmit: KittyImageTransmit { format: None, data: KittyImageData::Direct("AAAA=".to_string()), width: Some(17), height: Some(32), image_id: Some(7257421), image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, verbosity: KittyImageVerbosity::Quiet, frame: KittyImageFrame { x: Some(119), y: Some(384), base_frame: None, frame_number: Some(1), composition_mode: KittyFrameCompositionMode::Overwrite, background_pixel: None, duration_ms: None, }, } ); } } termwiz-0.22.0/src/escape/csi.rs000064400000000000000000003503221046102023000145660ustar 00000000000000use super::OneBased; use crate::cell::{Blink, Intensity, Underline, VerticalAlign}; use crate::color::{AnsiColor, ColorSpec, RgbColor, SrgbaTuple}; use crate::input::{Modifiers, MouseButtons}; use num_derive::*; use num_traits::{FromPrimitive, ToPrimitive}; use std::convert::TryInto; use std::fmt::{Display, Error as FmtError, Formatter}; pub use vtparse::CsiParam; #[derive(Debug, Clone, PartialEq, Eq)] pub enum CSI { /// SGR: Set Graphics Rendition. /// These values affect how the character is rendered. Sgr(Sgr), /// CSI codes that relate to the cursor Cursor(Cursor), Edit(Edit), Mode(Mode), Device(Box), Mouse(MouseReport), Window(Box), Keyboard(Keyboard), /// ECMA-48 SCP SelectCharacterPath(CharacterPath, i64), /// Unknown or unspecified; should be rare and is rather /// large, so it is boxed and kept outside of the enum /// body to help reduce space usage in the common cases. Unspecified(Box), } #[cfg(all(test, target_pointer_width = "64"))] #[test] fn csi_size() { assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::(), 12); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 40); assert_eq!(std::mem::size_of::(), 8); assert_eq!(std::mem::size_of::(), 32); } pub use wezterm_input_types::KittyKeyboardFlags; #[derive(Debug, Copy, Clone, PartialEq, Eq)] #[repr(u16)] pub enum KittyKeyboardMode { AssignAll = 1, SetSpecified = 2, ClearSpecified = 3, } #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum Keyboard { SetKittyState { flags: KittyKeyboardFlags, mode: KittyKeyboardMode, }, PushKittyState { flags: KittyKeyboardFlags, mode: KittyKeyboardMode, }, PopKittyState(u32), QueryKittySupport, ReportKittyState(KittyKeyboardFlags), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum CharacterPath { /// 0 ImplementationDefault, /// 1 LeftToRightOrTopToBottom, /// 2 RightToLeftOrBottomToTop, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Unspecified { pub params: Vec, /// if true, more than two intermediates arrived and the /// remaining data was ignored pub parameters_truncated: bool, /// The final character in the CSI sequence; this typically /// defines how to interpret the other parameters. pub control: char, } impl Display for Unspecified { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { for p in &self.params { write!(f, "{}", p)?; } write!(f, "{}", self.control) } } impl Display for CSI { // TODO: data size optimization opportunity: if we could somehow know that we // had a run of CSI instances being encoded in sequence, we could // potentially collapse them together. This is a few bytes difference in // practice so it may not be worthwhile with modern networks. fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { write!(f, "\x1b[")?; match self { CSI::Sgr(sgr) => sgr.fmt(f)?, CSI::Cursor(c) => c.fmt(f)?, CSI::Edit(e) => e.fmt(f)?, CSI::Mode(mode) => mode.fmt(f)?, CSI::Unspecified(unspec) => unspec.fmt(f)?, CSI::Mouse(mouse) => mouse.fmt(f)?, CSI::Device(dev) => dev.fmt(f)?, CSI::Window(window) => window.fmt(f)?, CSI::Keyboard(Keyboard::SetKittyState { flags, mode }) => { write!(f, "={};{}u", flags.bits(), *mode as u16)? } CSI::Keyboard(Keyboard::PushKittyState { flags, mode }) => { write!(f, ">{};{}u", flags.bits(), *mode as u16)? } CSI::Keyboard(Keyboard::PopKittyState(n)) => write!(f, "<{}u", *n)?, CSI::Keyboard(Keyboard::QueryKittySupport) => write!(f, "?u")?, CSI::Keyboard(Keyboard::ReportKittyState(flags)) => write!(f, "?{}u", flags.bits())?, CSI::SelectCharacterPath(path, n) => { let a = match path { CharacterPath::ImplementationDefault => 0, CharacterPath::LeftToRightOrTopToBottom => 1, CharacterPath::RightToLeftOrBottomToTop => 2, }; match (a, n) { (0, 0) => write!(f, " k")?, (a, 0) => write!(f, "{} k", a)?, (a, n) => write!(f, "{};{} k", a, n)?, } } }; Ok(()) } } #[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum CursorStyle { Default = 0, BlinkingBlock = 1, SteadyBlock = 2, BlinkingUnderline = 3, SteadyUnderline = 4, BlinkingBar = 5, SteadyBar = 6, } impl Default for CursorStyle { fn default() -> CursorStyle { CursorStyle::Default } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum DeviceAttributeCodes { Columns132 = 1, Printer = 2, RegisGraphics = 3, SixelGraphics = 4, SelectiveErase = 6, UserDefinedKeys = 8, NationalReplacementCharsets = 9, TechnicalCharacters = 15, UserWindows = 18, HorizontalScrolling = 21, AnsiColor = 22, AnsiTextLocator = 29, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum DeviceAttribute { Code(DeviceAttributeCodes), Unspecified(CsiParam), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct DeviceAttributeFlags { pub attributes: Vec, } impl DeviceAttributeFlags { fn emit(&self, f: &mut Formatter, leader: &str) -> Result<(), FmtError> { write!(f, "{}", leader)?; for item in &self.attributes { match item { DeviceAttribute::Code(c) => write!(f, ";{}", c.to_u16().ok_or_else(|| FmtError)?)?, DeviceAttribute::Unspecified(param) => write!(f, ";{}", param)?, } } write!(f, "c")?; Ok(()) } pub fn new(attributes: Vec) -> Self { Self { attributes } } fn from_params(params: &[CsiParam]) -> Self { let mut attributes = Vec::new(); for i in params { match i { CsiParam::Integer(p) => match FromPrimitive::from_i64(*p) { Some(c) => attributes.push(DeviceAttribute::Code(c)), None => attributes.push(DeviceAttribute::Unspecified(i.clone())), }, CsiParam::P(b';') => {} _ => attributes.push(DeviceAttribute::Unspecified(i.clone())), } } Self { attributes } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum DeviceAttributes { Vt100WithAdvancedVideoOption, Vt101WithNoOptions, Vt102, Vt220(DeviceAttributeFlags), Vt320(DeviceAttributeFlags), Vt420(DeviceAttributeFlags), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtSmGraphicsItem { NumberOfColorRegisters, SixelGraphicsGeometry, RegisGraphicsGeometry, Unspecified(i64), } impl Display for XtSmGraphicsItem { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Self::NumberOfColorRegisters => write!(f, "1"), Self::SixelGraphicsGeometry => write!(f, "2"), Self::RegisGraphicsGeometry => write!(f, "3"), Self::Unspecified(n) => write!(f, "{}", n), } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtSmGraphicsAction { ReadAttribute, ResetToDefault, SetToValue, ReadMaximumAllowedValue, } impl XtSmGraphicsAction { pub fn to_i64(&self) -> i64 { match self { Self::ReadAttribute => 1, Self::ResetToDefault => 2, Self::SetToValue => 3, Self::ReadMaximumAllowedValue => 4, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtSmGraphicsStatus { Success, InvalidItem, InvalidAction, Failure, } impl XtSmGraphicsStatus { pub fn to_i64(&self) -> i64 { match self { Self::Success => 0, Self::InvalidItem => 1, Self::InvalidAction => 2, Self::Failure => 3, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct XtSmGraphics { pub item: XtSmGraphicsItem, pub action_or_status: i64, pub value: Vec, } impl XtSmGraphics { pub fn action(&self) -> Option { match self.action_or_status { 1 => Some(XtSmGraphicsAction::ReadAttribute), 2 => Some(XtSmGraphicsAction::ResetToDefault), 3 => Some(XtSmGraphicsAction::SetToValue), 4 => Some(XtSmGraphicsAction::ReadMaximumAllowedValue), _ => None, } } pub fn status(&self) -> Option { match self.action_or_status { 0 => Some(XtSmGraphicsStatus::Success), 1 => Some(XtSmGraphicsStatus::InvalidItem), 2 => Some(XtSmGraphicsStatus::InvalidAction), 3 => Some(XtSmGraphicsStatus::Failure), _ => None, } } pub fn parse(params: &[CsiParam]) -> Result { let params = Cracked::parse(¶ms[1..])?; Ok(CSI::Device(Box::new(Device::XtSmGraphics(XtSmGraphics { item: match params.get(0).ok_or(())? { CsiParam::Integer(1) => XtSmGraphicsItem::NumberOfColorRegisters, CsiParam::Integer(2) => XtSmGraphicsItem::SixelGraphicsGeometry, CsiParam::Integer(3) => XtSmGraphicsItem::RegisGraphicsGeometry, CsiParam::Integer(n) => XtSmGraphicsItem::Unspecified(*n), _ => return Err(()), }, action_or_status: match params.get(1).ok_or(())? { CsiParam::Integer(n) => *n, _ => return Err(()), }, value: params.params[2..] .iter() .filter_map(|p| match p { Some(CsiParam::Integer(n)) => Some(*n), _ => None, }) .collect(), })))) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Device { DeviceAttributes(DeviceAttributes), /// DECSTR - https://vt100.net/docs/vt510-rm/DECSTR.html SoftReset, RequestPrimaryDeviceAttributes, RequestSecondaryDeviceAttributes, RequestTertiaryDeviceAttributes, StatusReport, /// https://github.com/mintty/mintty/issues/881 /// https://gitlab.gnome.org/GNOME/vte/-/issues/235 RequestTerminalNameAndVersion, RequestTerminalParameters(i64), XtSmGraphics(XtSmGraphics), } impl Display for Device { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Device::DeviceAttributes(DeviceAttributes::Vt100WithAdvancedVideoOption) => { write!(f, "?1;2c")? } Device::DeviceAttributes(DeviceAttributes::Vt101WithNoOptions) => write!(f, "?1;0c")?, Device::DeviceAttributes(DeviceAttributes::Vt102) => write!(f, "?6c")?, Device::DeviceAttributes(DeviceAttributes::Vt220(attr)) => attr.emit(f, "?62")?, Device::DeviceAttributes(DeviceAttributes::Vt320(attr)) => attr.emit(f, "?63")?, Device::DeviceAttributes(DeviceAttributes::Vt420(attr)) => attr.emit(f, "?64")?, Device::SoftReset => write!(f, "!p")?, Device::RequestPrimaryDeviceAttributes => write!(f, "c")?, Device::RequestSecondaryDeviceAttributes => write!(f, ">c")?, Device::RequestTertiaryDeviceAttributes => write!(f, "=c")?, Device::RequestTerminalNameAndVersion => write!(f, ">q")?, Device::RequestTerminalParameters(n) => write!(f, "{};1;1;128;128;1;0x", n + 2)?, Device::StatusReport => write!(f, "5n")?, Device::XtSmGraphics(g) => { write!(f, "?{};{}", g.item, g.action_or_status)?; for v in &g.value { write!(f, ";{}", v)?; } write!(f, "S")?; } }; Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum MouseButton { Button1Press, Button2Press, Button3Press, Button4Press, Button5Press, Button6Press, Button7Press, Button1Release, Button2Release, Button3Release, Button4Release, Button5Release, Button6Release, Button7Release, Button1Drag, Button2Drag, Button3Drag, None, } impl From for MouseButtons { fn from(button: MouseButton) -> MouseButtons { match button { MouseButton::Button1Press | MouseButton::Button1Drag => MouseButtons::LEFT, MouseButton::Button2Press | MouseButton::Button2Drag => MouseButtons::MIDDLE, MouseButton::Button3Press | MouseButton::Button3Drag => MouseButtons::RIGHT, MouseButton::Button4Press => MouseButtons::VERT_WHEEL | MouseButtons::WHEEL_POSITIVE, MouseButton::Button5Press => MouseButtons::VERT_WHEEL, MouseButton::Button6Press => MouseButtons::HORZ_WHEEL | MouseButtons::WHEEL_POSITIVE, MouseButton::Button7Press => MouseButtons::HORZ_WHEEL, _ => MouseButtons::NONE, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Window { DeIconify, Iconify, MoveWindow { x: i64, y: i64, }, ResizeWindowPixels { width: Option, height: Option, }, RaiseWindow, LowerWindow, RefreshWindow, ResizeWindowCells { width: Option, height: Option, }, RestoreMaximizedWindow, MaximizeWindow, MaximizeWindowVertically, MaximizeWindowHorizontally, UndoFullScreenMode, ChangeToFullScreenMode, ToggleFullScreen, ReportWindowState, ReportWindowPosition, ReportTextAreaPosition, ReportTextAreaSizePixels, ReportWindowSizePixels, ReportScreenSizePixels, ReportCellSizePixels, ReportCellSizePixelsResponse { width: Option, height: Option, }, ReportTextAreaSizeCells, ReportScreenSizeCells, ReportIconLabel, ReportWindowTitle, PushIconAndWindowTitle, PushIconTitle, PushWindowTitle, PopIconAndWindowTitle, PopIconTitle, PopWindowTitle, /// DECRQCRA; used by esctest ChecksumRectangularArea { request_id: i64, page_number: i64, top: OneBased, left: OneBased, bottom: OneBased, right: OneBased, }, } fn numstr_or_empty(x: &Option) -> String { match x { Some(x) => format!("{}", x), None => "".to_owned(), } } impl Display for Window { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Window::DeIconify => write!(f, "1t"), Window::Iconify => write!(f, "2t"), Window::MoveWindow { x, y } => write!(f, "3;{};{}t", x, y), Window::ResizeWindowPixels { width, height } => write!( f, "4;{};{}t", numstr_or_empty(height), numstr_or_empty(width), ), Window::RaiseWindow => write!(f, "5t"), Window::LowerWindow => write!(f, "6t"), Window::RefreshWindow => write!(f, "7t"), Window::ResizeWindowCells { width, height } => write!( f, "8;{};{}t", numstr_or_empty(height), numstr_or_empty(width), ), Window::RestoreMaximizedWindow => write!(f, "9;0t"), Window::MaximizeWindow => write!(f, "9;1t"), Window::MaximizeWindowVertically => write!(f, "9;2t"), Window::MaximizeWindowHorizontally => write!(f, "9;3t"), Window::UndoFullScreenMode => write!(f, "10;0t"), Window::ChangeToFullScreenMode => write!(f, "10;1t"), Window::ToggleFullScreen => write!(f, "10;2t"), Window::ReportWindowState => write!(f, "11t"), Window::ReportWindowPosition => write!(f, "13t"), Window::ReportTextAreaPosition => write!(f, "13;2t"), Window::ReportTextAreaSizePixels => write!(f, "14t"), Window::ReportWindowSizePixels => write!(f, "14;2t"), Window::ReportScreenSizePixels => write!(f, "15t"), Window::ReportCellSizePixels => write!(f, "16t"), Window::ReportCellSizePixelsResponse { width, height } => write!( f, "6;{};{}t", numstr_or_empty(height), numstr_or_empty(width), ), Window::ReportTextAreaSizeCells => write!(f, "18t"), Window::ReportScreenSizeCells => write!(f, "19t"), Window::ReportIconLabel => write!(f, "20t"), Window::ReportWindowTitle => write!(f, "21t"), Window::PushIconAndWindowTitle => write!(f, "22;0t"), Window::PushIconTitle => write!(f, "22;1t"), Window::PushWindowTitle => write!(f, "22;2t"), Window::PopIconAndWindowTitle => write!(f, "23;0t"), Window::PopIconTitle => write!(f, "23;1t"), Window::PopWindowTitle => write!(f, "23;2t"), Window::ChecksumRectangularArea { request_id, page_number, top, left, bottom, right, } => write!( f, "{};{};{};{};{};{}*y", request_id, page_number, top, left, bottom, right, ), } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum MouseReport { SGR1006 { x: u16, y: u16, button: MouseButton, modifiers: Modifiers, }, SGR1016 { x_pixels: u16, y_pixels: u16, button: MouseButton, modifiers: Modifiers, }, } impl Display for MouseReport { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { MouseReport::SGR1006 { x, y, button, modifiers, } => { let mut b = 0; if (*modifiers & Modifiers::SHIFT) != Modifiers::NONE { b |= 4; } if (*modifiers & Modifiers::ALT) != Modifiers::NONE { b |= 8; } if (*modifiers & Modifiers::CTRL) != Modifiers::NONE { b |= 16; } b |= match button { MouseButton::Button1Press | MouseButton::Button1Release => 0, MouseButton::Button2Press | MouseButton::Button2Release => 1, MouseButton::Button3Press | MouseButton::Button3Release => 2, MouseButton::Button4Press | MouseButton::Button4Release => 64, MouseButton::Button5Press | MouseButton::Button5Release => 65, MouseButton::Button6Press | MouseButton::Button6Release => 66, MouseButton::Button7Press | MouseButton::Button7Release => 67, MouseButton::Button1Drag => 32, MouseButton::Button2Drag => 33, MouseButton::Button3Drag => 34, MouseButton::None => 35, }; let trailer = match button { MouseButton::Button1Press | MouseButton::Button2Press | MouseButton::Button3Press | MouseButton::Button4Press | MouseButton::Button5Press | MouseButton::Button1Drag | MouseButton::Button2Drag | MouseButton::Button3Drag | MouseButton::None => 'M', _ => 'm', }; write!(f, "<{};{};{}{}", b, x, y, trailer) } MouseReport::SGR1016 { x_pixels, y_pixels, button, modifiers, } => { let mut b = 0; if (*modifiers & Modifiers::SHIFT) != Modifiers::NONE { b |= 4; } if (*modifiers & Modifiers::ALT) != Modifiers::NONE { b |= 8; } if (*modifiers & Modifiers::CTRL) != Modifiers::NONE { b |= 16; } b |= match button { MouseButton::Button1Press | MouseButton::Button1Release => 0, MouseButton::Button2Press | MouseButton::Button2Release => 1, MouseButton::Button3Press | MouseButton::Button3Release => 2, MouseButton::Button4Press | MouseButton::Button4Release => 64, MouseButton::Button5Press | MouseButton::Button5Release => 65, MouseButton::Button6Press | MouseButton::Button6Release => 66, MouseButton::Button7Press | MouseButton::Button7Release => 67, MouseButton::Button1Drag => 32, MouseButton::Button2Drag => 33, MouseButton::Button3Drag => 34, MouseButton::None => 35, }; let trailer = match button { MouseButton::Button1Press | MouseButton::Button2Press | MouseButton::Button3Press | MouseButton::Button4Press | MouseButton::Button5Press | MouseButton::Button1Drag | MouseButton::Button2Drag | MouseButton::Button3Drag | MouseButton::None => 'M', _ => 'm', }; write!(f, "<{};{};{}{}", b, x_pixels, y_pixels, trailer) } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum XtermKeyModifierResource { Keyboard, CursorKeys, FunctionKeys, OtherKeys, } impl XtermKeyModifierResource { pub fn parse(value: i64) -> Option { Some(match value { 0 => XtermKeyModifierResource::Keyboard, 1 => XtermKeyModifierResource::CursorKeys, 2 => XtermKeyModifierResource::FunctionKeys, 4 => XtermKeyModifierResource::OtherKeys, _ => return None, }) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Mode { SetDecPrivateMode(DecPrivateMode), ResetDecPrivateMode(DecPrivateMode), SaveDecPrivateMode(DecPrivateMode), RestoreDecPrivateMode(DecPrivateMode), QueryDecPrivateMode(DecPrivateMode), SetMode(TerminalMode), ResetMode(TerminalMode), QueryMode(TerminalMode), XtermKeyMode { resource: XtermKeyModifierResource, value: Option, }, } impl Display for Mode { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { macro_rules! emit { ($flag:expr, $mode:expr) => {{ let value = match $mode { DecPrivateMode::Code(mode) => mode.to_u16().ok_or_else(|| FmtError)?, DecPrivateMode::Unspecified(mode) => *mode, }; write!(f, "?{}{}", value, $flag) }}; } macro_rules! emit_mode { ($flag:expr, $mode:expr) => {{ let value = match $mode { TerminalMode::Code(mode) => mode.to_u16().ok_or_else(|| FmtError)?, TerminalMode::Unspecified(mode) => *mode, }; write!(f, "{}{}", value, $flag) }}; } match self { Mode::SetDecPrivateMode(mode) => emit!("h", mode), Mode::ResetDecPrivateMode(mode) => emit!("l", mode), Mode::SaveDecPrivateMode(mode) => emit!("s", mode), Mode::RestoreDecPrivateMode(mode) => emit!("r", mode), Mode::QueryDecPrivateMode(DecPrivateMode::Code(mode)) => { write!(f, "?{}$p", mode.to_u16().ok_or_else(|| FmtError)?) } Mode::QueryDecPrivateMode(DecPrivateMode::Unspecified(mode)) => { write!(f, "?{}$p", mode) } Mode::SetMode(mode) => emit_mode!("h", mode), Mode::ResetMode(mode) => emit_mode!("l", mode), Mode::QueryMode(TerminalMode::Code(mode)) => { write!(f, "?{}$p", mode.to_u16().ok_or_else(|| FmtError)?) } Mode::QueryMode(TerminalMode::Unspecified(mode)) => write!(f, "?{}$p", mode), Mode::XtermKeyMode { resource, value } => { write!( f, ">{}", match resource { XtermKeyModifierResource::Keyboard => 0, XtermKeyModifierResource::CursorKeys => 1, XtermKeyModifierResource::FunctionKeys => 2, XtermKeyModifierResource::OtherKeys => 4, } )?; if let Some(value) = value { write!(f, ";{}", value)?; } else { write!(f, ";")?; } write!(f, "m") } } } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum DecPrivateMode { Code(DecPrivateModeCode), Unspecified(u16), } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum DecPrivateModeCode { /// https://vt100.net/docs/vt510-rm/DECCKM.html /// This mode is only effective when the terminal is in keypad application mode (see DECKPAM) /// and the ANSI/VT52 mode (DECANM) is set (see DECANM). Under these conditions, if the cursor /// key mode is reset, the four cursor function keys will send ANSI cursor control commands. If /// cursor key mode is set, the four cursor function keys will send application functions. ApplicationCursorKeys = 1, /// https://vt100.net/docs/vt510-rm/DECANM.html /// Behave like a vt52 DecAnsiMode = 2, /// https://vt100.net/docs/vt510-rm/DECCOLM.html Select132Columns = 3, /// https://vt100.net/docs/vt510-rm/DECSCLM.html SmoothScroll = 4, /// https://vt100.net/docs/vt510-rm/DECSCNM.html ReverseVideo = 5, /// https://vt100.net/docs/vt510-rm/DECOM.html /// When OriginMode is enabled, cursor is constrained to the /// scroll region and its position is relative to the scroll /// region. OriginMode = 6, /// https://vt100.net/docs/vt510-rm/DECAWM.html /// When enabled, wrap to next line, Otherwise replace the last /// character AutoWrap = 7, /// https://vt100.net/docs/vt510-rm/DECARM.html AutoRepeat = 8, StartBlinkingCursor = 12, ShowCursor = 25, ReverseWraparound = 45, /// https://vt100.net/docs/vt510-rm/DECLRMM.html LeftRightMarginMode = 69, /// DECSDM - https://vt100.net/dec/ek-vt38t-ug-001.pdf#page=132 SixelDisplayMode = 80, /// Enable mouse button press/release reporting MouseTracking = 1000, /// Warning: this requires a cooperative and timely response from /// the application otherwise the terminal can hang HighlightMouseTracking = 1001, /// Enable mouse button press/release and drag reporting ButtonEventMouse = 1002, /// Enable mouse motion, button press/release and drag reporting AnyEventMouse = 1003, /// Enable FocusIn/FocusOut events FocusTracking = 1004, Utf8Mouse = 1005, /// Use extended coordinate system in mouse reporting. Does not /// enable mouse reporting itself, it just controls how reports /// will be encoded. SGRMouse = 1006, /// Use pixels rather than text cells in mouse reporting. Does /// not enable mouse reporting itself, it just controls how /// reports will be encoded. SGRPixelsMouse = 1016, XTermMetaSendsEscape = 1036, XTermAltSendsEscape = 1039, /// Save cursor as in DECSC SaveCursor = 1048, ClearAndEnableAlternateScreen = 1049, EnableAlternateScreen = 47, OptEnableAlternateScreen = 1047, BracketedPaste = 2004, /// /// Grapheme clustering mode GraphemeClustering = 2027, /// Applies to sixel and regis modes UsePrivateColorRegistersForEachGraphic = 1070, /// SynchronizedOutput = 2026, MinTTYApplicationEscapeKeyMode = 7727, /// xterm: adjust cursor positioning after emitting sixel SixelScrollsRight = 8452, /// Windows Terminal: win32-input-mode /// Win32InputMode = 9001, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum TerminalMode { Code(TerminalModeCode), Unspecified(u16), } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] pub enum TerminalModeCode { /// https://vt100.net/docs/vt510-rm/KAM.html KeyboardAction = 2, /// https://vt100.net/docs/vt510-rm/IRM.html Insert = 4, /// BiDirectionalSupportMode = 8, /// https://vt100.net/docs/vt510-rm/SRM.html /// But in the MS terminal this is cursor blinking. SendReceive = 12, /// https://vt100.net/docs/vt510-rm/LNM.html AutomaticNewline = 20, /// MS terminal cursor visibility ShowCursor = 25, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Cursor { /// CBT Moves cursor to the Ps tabs backward. The default value of Ps is 1. BackwardTabulation(u32), /// TBC - TABULATION CLEAR TabulationClear(TabulationClear), /// CHA: Moves cursor to the Ps-th column of the active line. The default /// value of Ps is 1. CharacterAbsolute(OneBased), /// HPA CHARACTER POSITION ABSOLUTE /// HPA Moves cursor to the Ps-th column of the active line. The default /// value of Ps is 1. CharacterPositionAbsolute(OneBased), /// HPB - CHARACTER POSITION BACKWARD /// HPB Moves cursor to the left Ps columns. The default value of Ps is 1. CharacterPositionBackward(u32), /// HPR - CHARACTER POSITION FORWARD /// HPR Moves cursor to the right Ps columns. The default value of Ps is 1. CharacterPositionForward(u32), /// HVP - CHARACTER AND LINE POSITION /// HVP Moves cursor to the Ps1-th line and to the Ps2-th column. The /// default value of Ps1 and Ps2 is 1. CharacterAndLinePosition { line: OneBased, col: OneBased, }, /// VPA - LINE POSITION ABSOLUTE /// Move to the corresponding vertical position (line Ps) of the current /// column. The default value of Ps is 1. LinePositionAbsolute(u32), /// VPB - LINE POSITION BACKWARD /// Moves cursor up Ps lines in the same column. The default value of Ps is /// 1. LinePositionBackward(u32), /// VPR - LINE POSITION FORWARD /// Moves cursor down Ps lines in the same column. The default value of Ps /// is 1. LinePositionForward(u32), /// CHT /// Moves cursor to the Ps tabs forward. The default value of Ps is 1. ForwardTabulation(u32), /// CNL Moves cursor to the first column of Ps-th following line. The /// default value of Ps is 1. NextLine(u32), /// CPL Moves cursor to the first column of Ps-th preceding line. The /// default value of Ps is 1. PrecedingLine(u32), /// CPR - ACTIVE POSITION REPORT /// If the DEVICE COMPONENT SELECT MODE (DCSM) /// is set to PRESENTATION, CPR is used to report the active presentation /// position of the sending device as residing in the presentation /// component at the n-th line position according to the line progression /// and at the m-th character position according to the character path, /// where n equals the value of Pn1 and m equal s the value of Pn2. /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to DATA, CPR is used /// to report the active data position of the sending device as /// residing in the data component at the n-th line position according /// to the line progression and at the m-th character position /// according to the character progression, where n equals the value of /// Pn1 and m equals the value of Pn2. CPR may be solicited by a DEVICE /// STATUS REPORT (DSR) or be sent unsolicited . ActivePositionReport { line: OneBased, col: OneBased, }, /// CPR: this is the request from the client. /// The terminal will respond with ActivePositionReport. RequestActivePositionReport, /// SCP - Save Cursor Position. /// Only works when DECLRMM is disabled SaveCursor, RestoreCursor, /// CTC - CURSOR TABULATION CONTROL /// CTC causes one or more tabulation stops to be set or cleared in the /// presentation component, depending on the parameter values. /// In the case of parameter values 0, 2 or 4 the number of lines affected /// depends on the setting of the TABULATION STOP MODE (TSM). TabulationControl(CursorTabulationControl), /// CUB - Cursor Left /// Moves cursor to the left Ps columns. The default value of Ps is 1. Left(u32), /// CUD - Cursor Down Down(u32), /// CUF - Cursor Right Right(u32), /// CUP - Cursor Position /// Moves cursor to the Ps1-th line and to the Ps2-th column. The default /// value of Ps1 and Ps2 is 1. Position { line: OneBased, col: OneBased, }, /// CUU - Cursor Up Up(u32), /// CVT - Cursor Line Tabulation /// CVT causes the active presentation position to be moved to the /// corresponding character position of the line corresponding to the n-th /// following line tabulation stop in the presentation component, where n /// equals the value of Pn. LineTabulation(u32), /// DECSTBM - Set top and bottom margins. SetTopAndBottomMargins { top: OneBased, bottom: OneBased, }, /// https://vt100.net/docs/vt510-rm/DECSLRM.html SetLeftAndRightMargins { left: OneBased, right: OneBased, }, CursorStyle(CursorStyle), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Edit { /// DCH - DELETE CHARACTER /// Deletes Ps characters from the cursor position to the right. The /// default value of Ps is 1. If the DEVICE COMPONENT SELECT MODE /// (DCSM) is set to PRESENTATION, DCH causes the contents of the /// active presentation position and, depending on the setting of the /// CHARACTER EDITING MODE (HEM), the contents of the n-1 preceding or /// following character positions to be removed from the presentation /// component, where n equals the value of Pn. The resulting gap is /// closed by shifting the contents of the adjacent character positions /// towards the active presentation position. At the other end of the /// shifted part, n character positions are put into the erased state. DeleteCharacter(u32), /// DL - DELETE LINE /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, DL /// causes the contents of the active line (the line that contains the /// active presentation position) and, depending on the setting of the /// LINE EDITING MODE (VEM), the contents of the n-1 preceding or /// following lines to be removed from the presentation component, where n /// equals the value of Pn. The resulting gap is closed by shifting the /// contents of a number of adjacent lines towards the active line. At /// the other end of the shifted part, n lines are put into the /// erased state. The active presentation position is moved to the line /// home position in the active line. The line home position is /// established by the parameter value of SET LINE HOME (SLH). If the /// TABULATION STOP MODE (TSM) is set to SINGLE, character tabulation stops /// are cleared in the lines that are put into the erased state. The /// extent of the shifted part is established by SELECT EDITING EXTENT /// (SEE). Any occurrences of the start or end of a selected area, the /// start or end of a qualified area, or a tabulation stop in the shifted /// part, are also shifted. DeleteLine(u32), /// ECH - ERASE CHARACTER /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, ECH /// causes the active presentation position and the n-1 following /// character positions in the presentation component to be put into /// the erased state, where n equals the value of Pn. EraseCharacter(u32), /// EL - ERASE IN LINE /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, EL /// causes some or all character positions of the active line (the line /// which contains the active presentation position in the presentation /// component) to be put into the erased state, depending on the /// parameter values EraseInLine(EraseInLine), /// ICH - INSERT CHARACTER /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, ICH /// is used to prepare the insertion of n characters, by putting into the /// erased state the active presentation position and, depending on the /// setting of the CHARACTER EDITING MODE (HEM), the n-1 preceding or /// following character positions in the presentation component, where n /// equals the value of Pn. The previous contents of the active /// presentation position and an adjacent string of character positions are /// shifted away from the active presentation position. The contents of n /// character positions at the other end of the shifted part are removed. /// The active presentation position is moved to the line home position in /// the active line. The line home position is established by the parameter /// value of SET LINE HOME (SLH). InsertCharacter(u32), /// IL - INSERT LINE /// If the DEVICE COMPONENT SELECT MODE (DCSM) is set to PRESENTATION, IL /// is used to prepare the insertion of n lines, by putting into the /// erased state in the presentation component the active line (the /// line that contains the active presentation position) and, depending on /// the setting of the LINE EDITING MODE (VEM), the n-1 preceding or /// following lines, where n equals the value of Pn. The previous /// contents of the active line and of adjacent lines are shifted away /// from the active line. The contents of n lines at the other end of the /// shifted part are removed. The active presentation position is moved /// to the line home position in the active line. The line home /// position is established by the parameter value of SET LINE /// HOME (SLH). InsertLine(u32), /// SD - SCROLL DOWN /// SD causes the data in the presentation component to be moved by n line /// positions if the line orientation is horizontal, or by n character /// positions if the line orientation is vertical, such that the data /// appear to move down; where n equals the value of Pn. The active /// presentation position is not affected by this control function. /// /// Also known as Pan Up in DEC: /// https://vt100.net/docs/vt510-rm/SD.html ScrollDown(u32), /// SU - SCROLL UP /// SU causes the data in the presentation component to be moved by n line /// positions if the line orientation is horizontal, or by n character /// positions if the line orientation is vertical, such that the data /// appear to move up; where n equals the value of Pn. The active /// presentation position is not affected by this control function. ScrollUp(u32), /// ED - ERASE IN PAGE (XTerm calls this Erase in Display) EraseInDisplay(EraseInDisplay), /// REP - Repeat the preceding character n times Repeat(u32), } trait EncodeCSIParam { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError>; } impl EncodeCSIParam for T { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError> { if *self == ParamEnum::default() { write!(f, "{}", control) } else { let value = self.to_i64().ok_or_else(|| FmtError)?; write!(f, "{}{}", value, control) } } } impl EncodeCSIParam for u32 { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError> { if *self == 1 { write!(f, "{}", control) } else { write!(f, "{}{}", *self, control) } } } impl EncodeCSIParam for OneBased { fn write_csi(&self, f: &mut Formatter, control: &str) -> Result<(), FmtError> { if self.as_one_based() == 1 { write!(f, "{}", control) } else { write!(f, "{}{}", *self, control) } } } impl Display for Edit { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Edit::DeleteCharacter(n) => n.write_csi(f, "P")?, Edit::DeleteLine(n) => n.write_csi(f, "M")?, Edit::EraseCharacter(n) => n.write_csi(f, "X")?, Edit::EraseInLine(n) => n.write_csi(f, "K")?, Edit::InsertCharacter(n) => n.write_csi(f, "@")?, Edit::InsertLine(n) => n.write_csi(f, "L")?, Edit::ScrollDown(n) => n.write_csi(f, "T")?, Edit::ScrollUp(n) => n.write_csi(f, "S")?, Edit::EraseInDisplay(n) => n.write_csi(f, "J")?, Edit::Repeat(n) => n.write_csi(f, "b")?, } Ok(()) } } impl Display for Cursor { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Cursor::BackwardTabulation(n) => n.write_csi(f, "Z")?, Cursor::CharacterAbsolute(col) => col.write_csi(f, "G")?, Cursor::ForwardTabulation(n) => n.write_csi(f, "I")?, Cursor::NextLine(n) => n.write_csi(f, "E")?, Cursor::PrecedingLine(n) => n.write_csi(f, "F")?, Cursor::ActivePositionReport { line, col } => write!(f, "{};{}R", line, col)?, Cursor::Left(n) => n.write_csi(f, "D")?, Cursor::Down(n) => n.write_csi(f, "B")?, Cursor::Right(n) => n.write_csi(f, "C")?, Cursor::Up(n) => n.write_csi(f, "A")?, Cursor::Position { line, col } => write!(f, "{};{}H", line, col)?, Cursor::LineTabulation(n) => n.write_csi(f, "Y")?, Cursor::TabulationControl(n) => n.write_csi(f, "W")?, Cursor::TabulationClear(n) => n.write_csi(f, "g")?, Cursor::CharacterPositionAbsolute(n) => n.write_csi(f, "`")?, Cursor::CharacterPositionBackward(n) => n.write_csi(f, "j")?, Cursor::CharacterPositionForward(n) => n.write_csi(f, "a")?, Cursor::CharacterAndLinePosition { line, col } => write!(f, "{};{}f", line, col)?, Cursor::LinePositionAbsolute(n) => n.write_csi(f, "d")?, Cursor::LinePositionBackward(n) => n.write_csi(f, "k")?, Cursor::LinePositionForward(n) => n.write_csi(f, "e")?, Cursor::SetTopAndBottomMargins { top, bottom } => { if top.as_one_based() == 1 && bottom.as_one_based() == u32::max_value() { write!(f, "r")?; } else { write!(f, "{};{}r", top, bottom)?; } } Cursor::SetLeftAndRightMargins { left, right } => { if left.as_one_based() == 1 && right.as_one_based() == u32::max_value() { write!(f, "s")?; } else { write!(f, "{};{}s", left, right)?; } } Cursor::RequestActivePositionReport => write!(f, "6n")?, Cursor::SaveCursor => write!(f, "s")?, Cursor::RestoreCursor => write!(f, "u")?, Cursor::CursorStyle(style) => write!(f, "{} q", *style as u8)?, } Ok(()) } } /// This trait aids in parsing escape sequences. /// In many cases we simply want to collect integral values >= 1, /// but in some we build out an enum. The trait helps to generalize /// the parser code while keeping it relatively terse. trait ParseParams: Sized { fn parse_params(params: &[CsiParam]) -> Result; } /// Parse an input parameter into a 1-based unsigned value impl ParseParams for u32 { fn parse_params(params: &[CsiParam]) -> Result { match params { [] => Ok(1), [p] => to_1b_u32(p), _ => Err(()), } } } /// Parse an input parameter into a 1-based unsigned value impl ParseParams for OneBased { fn parse_params(params: &[CsiParam]) -> Result { match params { [] => Ok(OneBased::new(1)), [p] => OneBased::from_esc_param(p), _ => Err(()), } } } /// Parse a pair of 1-based unsigned values into a tuple. /// This is typically used to build a struct comprised of /// the pair of values. impl ParseParams for (OneBased, OneBased) { fn parse_params(params: &[CsiParam]) -> Result<(OneBased, OneBased), ()> { match params { [] => Ok((OneBased::new(1), OneBased::new(1))), [p] => Ok((OneBased::from_esc_param(p)?, OneBased::new(1))), [a, CsiParam::P(b';'), b] => { Ok((OneBased::from_esc_param(a)?, OneBased::from_esc_param(b)?)) } [CsiParam::P(b';'), b] => Ok((OneBased::new(1), OneBased::from_esc_param(b)?)), _ => Err(()), } } } /// This is ostensibly a marker trait that is used within this module /// to denote an enum. It does double duty as a stand-in for Default. /// We need separate traits for this to disambiguate from a regular /// primitive integer. trait ParamEnum: FromPrimitive { fn default() -> Self; } /// implement ParseParams for the enums that also implement ParamEnum. impl ParseParams for T { fn parse_params(params: &[CsiParam]) -> Result { match params { [] => Ok(ParamEnum::default()), [CsiParam::Integer(i)] => FromPrimitive::from_i64(*i).ok_or(()), _ => Err(()), } } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum CursorTabulationControl { SetCharacterTabStopAtActivePosition = 0, SetLineTabStopAtActiveLine = 1, ClearCharacterTabStopAtActivePosition = 2, ClearLineTabstopAtActiveLine = 3, ClearAllCharacterTabStopsAtActiveLine = 4, ClearAllCharacterTabStops = 5, ClearAllLineTabStops = 6, } impl ParamEnum for CursorTabulationControl { fn default() -> Self { CursorTabulationControl::SetCharacterTabStopAtActivePosition } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum TabulationClear { ClearCharacterTabStopAtActivePosition = 0, ClearLineTabStopAtActiveLine = 1, ClearCharacterTabStopsAtActiveLine = 2, ClearAllCharacterTabStops = 3, ClearAllLineTabStops = 4, ClearAllTabStops = 5, } impl ParamEnum for TabulationClear { fn default() -> Self { TabulationClear::ClearCharacterTabStopAtActivePosition } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum EraseInLine { EraseToEndOfLine = 0, EraseToStartOfLine = 1, EraseLine = 2, } impl ParamEnum for EraseInLine { fn default() -> Self { EraseInLine::EraseToEndOfLine } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Copy, ToPrimitive)] pub enum EraseInDisplay { /// the active presentation position and the character positions up to the /// end of the page are put into the erased state EraseToEndOfDisplay = 0, /// the character positions from the beginning of the page up to and /// including the active presentation position are put into the erased /// state EraseToStartOfDisplay = 1, /// all character positions of the page are put into the erased state EraseDisplay = 2, /// Clears the scrollback. This is an Xterm extension to ECMA-48. EraseScrollback = 3, } impl ParamEnum for EraseInDisplay { fn default() -> Self { EraseInDisplay::EraseToEndOfDisplay } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Sgr { /// Resets rendition to defaults. Typically switches off /// all other Sgr options, but may have greater or lesser impact. Reset, /// Set the intensity/bold level Intensity(Intensity), Underline(Underline), UnderlineColor(ColorSpec), Blink(Blink), Italic(bool), Inverse(bool), Invisible(bool), StrikeThrough(bool), Font(Font), Foreground(ColorSpec), Background(ColorSpec), Overline(bool), VerticalAlign(VerticalAlign), } #[cfg(all(test, target_pointer_width = "64"))] #[test] fn sgr_size() { assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 20); assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 2); } impl Display for Sgr { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { macro_rules! code { ($t:ident) => { write!(f, "{}m", SgrCode::$t as i64)? }; } macro_rules! ansi_color { ($idx:expr, $eightbit:ident, $( ($Ansi:ident, $code:ident) ),*) => { if let Some(ansi) = FromPrimitive::from_u8($idx) { match ansi { $(AnsiColor::$Ansi => code!($code) ,)* } } else { write!(f, "{}:5:{}m", SgrCode::$eightbit as i64, $idx)? } } } match self { Sgr::Reset => code!(Reset), Sgr::Intensity(Intensity::Bold) => code!(IntensityBold), Sgr::Intensity(Intensity::Half) => code!(IntensityDim), Sgr::Intensity(Intensity::Normal) => code!(NormalIntensity), Sgr::Underline(Underline::Single) => code!(UnderlineOn), Sgr::Underline(Underline::Double) => code!(UnderlineDouble), Sgr::Underline(Underline::Curly) => write!(f, "4:3m")?, Sgr::Underline(Underline::Dotted) => write!(f, "4:4m")?, Sgr::Underline(Underline::Dashed) => write!(f, "4:5m")?, Sgr::Underline(Underline::None) => code!(UnderlineOff), Sgr::Blink(Blink::Slow) => code!(BlinkOn), Sgr::Blink(Blink::Rapid) => code!(RapidBlinkOn), Sgr::Blink(Blink::None) => code!(BlinkOff), Sgr::Italic(true) => code!(ItalicOn), Sgr::Italic(false) => code!(ItalicOff), Sgr::Inverse(true) => code!(InverseOn), Sgr::Inverse(false) => code!(InverseOff), Sgr::Invisible(true) => code!(InvisibleOn), Sgr::Invisible(false) => code!(InvisibleOff), Sgr::StrikeThrough(true) => code!(StrikeThroughOn), Sgr::StrikeThrough(false) => code!(StrikeThroughOff), Sgr::Overline(true) => code!(OverlineOn), Sgr::Overline(false) => code!(OverlineOff), Sgr::VerticalAlign(VerticalAlign::BaseLine) => code!(VerticalAlignBaseLine), Sgr::VerticalAlign(VerticalAlign::SuperScript) => code!(VerticalAlignSuperScript), Sgr::VerticalAlign(VerticalAlign::SubScript) => code!(VerticalAlignSubScript), Sgr::Font(Font::Default) => code!(DefaultFont), Sgr::Font(Font::Alternate(1)) => code!(AltFont1), Sgr::Font(Font::Alternate(2)) => code!(AltFont2), Sgr::Font(Font::Alternate(3)) => code!(AltFont3), Sgr::Font(Font::Alternate(4)) => code!(AltFont4), Sgr::Font(Font::Alternate(5)) => code!(AltFont5), Sgr::Font(Font::Alternate(6)) => code!(AltFont6), Sgr::Font(Font::Alternate(7)) => code!(AltFont7), Sgr::Font(Font::Alternate(8)) => code!(AltFont8), Sgr::Font(Font::Alternate(9)) => code!(AltFont9), Sgr::Font(_) => { /* there are no other possible font values */ } Sgr::Foreground(ColorSpec::Default) => code!(ForegroundDefault), Sgr::Background(ColorSpec::Default) => code!(BackgroundDefault), Sgr::Foreground(ColorSpec::PaletteIndex(idx)) => ansi_color!( *idx, ForegroundColor, (Black, ForegroundBlack), (Maroon, ForegroundRed), (Green, ForegroundGreen), (Olive, ForegroundYellow), (Navy, ForegroundBlue), (Purple, ForegroundMagenta), (Teal, ForegroundCyan), (Silver, ForegroundWhite), // Note: these brights are emitted using codes in the 100 range. // I don't know how portable this is vs. the 256 color sequences, // so we may need to make an adjustment here later. (Grey, ForegroundBrightBlack), (Red, ForegroundBrightRed), (Lime, ForegroundBrightGreen), (Yellow, ForegroundBrightYellow), (Blue, ForegroundBrightBlue), (Fuchsia, ForegroundBrightMagenta), (Aqua, ForegroundBrightCyan), (White, ForegroundBrightWhite) ), Sgr::Foreground(ColorSpec::TrueColor(c)) => { let (red, green, blue, alpha) = c.to_srgb_u8(); if alpha == 255 { write!( f, "{}:2::{}:{}:{}m", SgrCode::ForegroundColor as i64, red, green, blue )? } else { write!( f, "{}:6::{}:{}:{}:{}m", SgrCode::ForegroundColor as i64, red, green, blue, alpha )? } } Sgr::Background(ColorSpec::PaletteIndex(idx)) => ansi_color!( *idx, BackgroundColor, (Black, BackgroundBlack), (Maroon, BackgroundRed), (Green, BackgroundGreen), (Olive, BackgroundYellow), (Navy, BackgroundBlue), (Purple, BackgroundMagenta), (Teal, BackgroundCyan), (Silver, BackgroundWhite), // Note: these brights are emitted using codes in the 100 range. // I don't know how portable this is vs. the 256 color sequences, // so we may need to make an adjustment here later. (Grey, BackgroundBrightBlack), (Red, BackgroundBrightRed), (Lime, BackgroundBrightGreen), (Yellow, BackgroundBrightYellow), (Blue, BackgroundBrightBlue), (Fuchsia, BackgroundBrightMagenta), (Aqua, BackgroundBrightCyan), (White, BackgroundBrightWhite) ), Sgr::Background(ColorSpec::TrueColor(c)) => { let (red, green, blue, alpha) = c.to_srgb_u8(); if alpha == 255 { write!( f, "{}:2::{}:{}:{}m", SgrCode::BackgroundColor as i64, red, green, blue )? } else { write!( f, "{}:6::{}:{}:{}:{}m", SgrCode::BackgroundColor as i64, red, green, blue, alpha )? } } Sgr::UnderlineColor(ColorSpec::Default) => code!(ResetUnderlineColor), Sgr::UnderlineColor(ColorSpec::TrueColor(c)) => { let (red, green, blue, alpha) = c.to_srgb_u8(); if alpha == 255 { write!( f, "{}:2::{}:{}:{}m", SgrCode::UnderlineColor as i64, red, green, blue )? } else { write!( f, "{}:6::{}:{}:{}:{}m", SgrCode::UnderlineColor as i64, red, green, blue, alpha )? } } Sgr::UnderlineColor(ColorSpec::PaletteIndex(idx)) => { write!(f, "{}:5:{}m", SgrCode::UnderlineColor as i64, *idx)? } } Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Font { Default, Alternate(u8), } /// Constrol Sequence Initiator (CSI) Parser. /// Since many sequences allow for composition of actions by separating /// `;` character, we need to be able to iterate over /// the set of parsed actions from a given CSI sequence. /// `CSIParser` implements an Iterator that yields `CSI` instances as /// it parses them out from the input sequence. struct CSIParser<'a> { /// this flag is set when more than two intermediates /// arrived and subsequent characters were ignored. parameters_truncated: bool, control: char, /// While params is_some we have more data to consume. The advance_by /// method updates the slice as we consume data. /// In a number of cases an empty params list is used to indicate /// default values, especially for SGR, so we need to be careful not /// to update params to an empty slice. params: Option<&'a [CsiParam]>, orig_params: &'a [CsiParam], } impl CSI { /// Parse a CSI sequence. /// Returns an iterator that yields individual CSI actions. /// Why not a single? Because sequences like `CSI [ 1 ; 3 m` /// embed two separate actions but are sent as a single unit. /// If no semantic meaning is known for a subsequence, the remainder /// of the sequence is returned wrapped in a `CSI::Unspecified` container. pub fn parse<'a>( params: &'a [CsiParam], parameters_truncated: bool, control: char, ) -> impl Iterator + 'a { CSIParser { parameters_truncated, control, params: Some(params), orig_params: params, } } } /// A little helper to convert i64 -> u8 if safe fn to_u8(v: &CsiParam) -> Result { match v { CsiParam::P(_) => Err(()), CsiParam::Integer(v) => { if *v <= i64::from(u8::max_value()) { Ok(*v as u8) } else { Err(()) } } } } /// Convert the input value to 1-based u32. /// The intent is to protect consumers from out of range values /// when operating on the data, while balancing strictness with /// practical implementation bugs. For example, it is common /// to see 0 values being emitted from existing libraries, and /// we desire to see the intended output. /// Ensures that the value is in the range 1..=max_value. /// If the input is 0 it is treated as 1. If the value is /// otherwise outside that range, an error is propagated and /// that will typically case the sequence to be reported via /// the Unspecified placeholder. fn to_1b_u32(v: &CsiParam) -> Result { match v { CsiParam::Integer(v) if *v == 0 => Ok(1), CsiParam::Integer(v) if *v > 0 && *v <= i64::from(u32::max_value()) => Ok(*v as u32), _ => Err(()), } } struct Cracked { params: Vec>, } impl Cracked { pub fn parse(params: &[CsiParam]) -> Result { let mut res = vec![]; let mut iter = params.iter().peekable(); while let Some(p) = iter.next() { match p { CsiParam::P(b';') => { res.push(None); } CsiParam::Integer(_) => { res.push(Some(p.clone())); if let Some(CsiParam::P(b';')) = iter.peek() { iter.next(); } } _ => return Err(()), } } Ok(Self { params: res }) } pub fn get(&self, idx: usize) -> Option<&CsiParam> { self.params.get(idx)?.as_ref() } pub fn opt_int(&self, idx: usize) -> Option { self.get(idx).and_then(CsiParam::as_integer) } pub fn int(&self, idx: usize) -> Result { self.get(idx).and_then(CsiParam::as_integer).ok_or(()) } pub fn len(&self) -> usize { self.params.len() } } macro_rules! noparams { ($ns:ident, $variant:ident, $params:expr) => {{ if $params.len() != 0 { Err(()) } else { Ok(CSI::$ns($ns::$variant)) } }}; } macro_rules! parse { ($ns:ident, $variant:ident, $params:expr) => {{ let value = ParseParams::parse_params($params)?; Ok(CSI::$ns($ns::$variant(value))) }}; ($ns:ident, $variant:ident, $first:ident, $second:ident, $params:expr) => {{ let (p1, p2): (OneBased, OneBased) = ParseParams::parse_params($params)?; Ok(CSI::$ns($ns::$variant { $first: p1, $second: p2, })) }}; } impl<'a> CSIParser<'a> { fn parse_next(&mut self, params: &'a [CsiParam]) -> Result { match (self.control, self.orig_params) { ('k', [.., CsiParam::P(b' ')]) => self.select_character_path(params), ('q', [.., CsiParam::P(b' ')]) => self.cursor_style(params), ('y', [.., CsiParam::P(b'*')]) => self.checksum_area(params), ('c', [CsiParam::P(b'='), ..]) => self .req_tertiary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), ('c', [CsiParam::P(b'>'), ..]) => self .req_secondary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), ('m', [CsiParam::P(b'<'), ..]) | ('M', [CsiParam::P(b'<'), ..]) => { self.mouse_sgr1006(params).map(CSI::Mouse) } ('c', [CsiParam::P(b'?'), ..]) => self .secondary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), ('S', [CsiParam::P(b'?'), ..]) => XtSmGraphics::parse(params), ('p', [CsiParam::Integer(_), CsiParam::P(b'$')]) | ('p', [CsiParam::P(b'?'), CsiParam::Integer(_), CsiParam::P(b'$')]) => { self.decrqm(params) } ('h', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::SetDecPrivateMode(mode))), ('l', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::ResetDecPrivateMode(mode))), ('r', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::RestoreDecPrivateMode(mode))), ('q', [CsiParam::P(b'>'), ..]) => self .req_terminal_name_and_version(params) .map(|dev| CSI::Device(Box::new(dev))), ('s', [CsiParam::P(b'?'), ..]) => self .dec(self.focus(params, 1, 0)) .map(|mode| CSI::Mode(Mode::SaveDecPrivateMode(mode))), ('m', [CsiParam::P(b'>'), ..]) => self.xterm_key_modifier(params), ('p', [CsiParam::P(b'!')]) => Ok(CSI::Device(Box::new(Device::SoftReset))), ('u', [CsiParam::P(b'='), CsiParam::Integer(flags)]) => { Ok(CSI::Keyboard(Keyboard::SetKittyState { flags: KittyKeyboardFlags::from_bits_truncate( (*flags).try_into().map_err(|_| ())?, ), mode: KittyKeyboardMode::AssignAll, })) } ( 'u', [CsiParam::P(b'='), CsiParam::Integer(flags), CsiParam::P(b';'), CsiParam::Integer(mode)], ) => Ok(CSI::Keyboard(Keyboard::SetKittyState { flags: KittyKeyboardFlags::from_bits_truncate((*flags).try_into().map_err(|_| ())?), mode: match *mode { 1 => KittyKeyboardMode::AssignAll, 2 => KittyKeyboardMode::SetSpecified, 3 => KittyKeyboardMode::ClearSpecified, _ => return Err(()), }, })), ('u', [CsiParam::P(b'>')]) => Ok(CSI::Keyboard(Keyboard::PushKittyState { flags: KittyKeyboardFlags::NONE, mode: KittyKeyboardMode::AssignAll, })), ('u', [CsiParam::P(b'>'), CsiParam::Integer(flags)]) => { Ok(CSI::Keyboard(Keyboard::PushKittyState { flags: KittyKeyboardFlags::from_bits_truncate( (*flags).try_into().map_err(|_| ())?, ), mode: KittyKeyboardMode::AssignAll, })) } ( 'u', [CsiParam::P(b'>'), CsiParam::Integer(flags), CsiParam::P(b';'), CsiParam::Integer(mode)], ) => Ok(CSI::Keyboard(Keyboard::PushKittyState { flags: KittyKeyboardFlags::from_bits_truncate((*flags).try_into().map_err(|_| ())?), mode: match *mode { 1 => KittyKeyboardMode::AssignAll, 2 => KittyKeyboardMode::SetSpecified, 3 => KittyKeyboardMode::ClearSpecified, _ => return Err(()), }, })), ('u', [CsiParam::P(b'?')]) => Ok(CSI::Keyboard(Keyboard::QueryKittySupport)), ('u', [CsiParam::P(b'?'), CsiParam::Integer(flags)]) => { Ok(CSI::Keyboard(Keyboard::ReportKittyState( KittyKeyboardFlags::from_bits_truncate((*flags).try_into().map_err(|_| ())?), ))) } ('u', [CsiParam::P(b'<'), CsiParam::Integer(how_many)]) => Ok(CSI::Keyboard( Keyboard::PopKittyState((*how_many).try_into().map_err(|_| ())?), )), ('u', [CsiParam::P(b'<')]) => Ok(CSI::Keyboard(Keyboard::PopKittyState(1))), _ => match self.control { 'c' => self .req_primary_device_attributes(params) .map(|dev| CSI::Device(Box::new(dev))), '@' => parse!(Edit, InsertCharacter, params), '`' => parse!(Cursor, CharacterPositionAbsolute, params), 'A' => parse!(Cursor, Up, params), 'B' => parse!(Cursor, Down, params), 'C' => parse!(Cursor, Right, params), 'D' => parse!(Cursor, Left, params), 'E' => parse!(Cursor, NextLine, params), 'F' => parse!(Cursor, PrecedingLine, params), 'G' => parse!(Cursor, CharacterAbsolute, params), 'H' => parse!(Cursor, Position, line, col, params), 'I' => parse!(Cursor, ForwardTabulation, params), 'J' => parse!(Edit, EraseInDisplay, params), 'K' => parse!(Edit, EraseInLine, params), 'L' => parse!(Edit, InsertLine, params), 'M' => parse!(Edit, DeleteLine, params), 'P' => parse!(Edit, DeleteCharacter, params), 'R' => parse!(Cursor, ActivePositionReport, line, col, params), 'S' => parse!(Edit, ScrollUp, params), 'T' => parse!(Edit, ScrollDown, params), 'W' => parse!(Cursor, TabulationControl, params), 'X' => parse!(Edit, EraseCharacter, params), 'Y' => parse!(Cursor, LineTabulation, params), 'Z' => parse!(Cursor, BackwardTabulation, params), 'a' => parse!(Cursor, CharacterPositionForward, params), 'b' => parse!(Edit, Repeat, params), 'd' => parse!(Cursor, LinePositionAbsolute, params), 'e' => parse!(Cursor, LinePositionForward, params), 'f' => parse!(Cursor, CharacterAndLinePosition, line, col, params), 'g' => parse!(Cursor, TabulationClear, params), 'h' => self .terminal_mode(params) .map(|mode| CSI::Mode(Mode::SetMode(mode))), 'j' => parse!(Cursor, CharacterPositionBackward, params), 'k' => parse!(Cursor, LinePositionBackward, params), 'l' => self .terminal_mode(params) .map(|mode| CSI::Mode(Mode::ResetMode(mode))), 'm' => self.sgr(params).map(CSI::Sgr), 'n' => self.dsr(params), 'r' => self.decstbm(params), 's' => self.decslrm(params), 't' => self.window(params).map(|p| CSI::Window(Box::new(p))), 'u' => noparams!(Cursor, RestoreCursor, params), 'x' => self .req_terminal_parameters(params) .map(|dev| CSI::Device(Box::new(dev))), _ => Err(()), }, } } /// Consume some number of elements from params and update it. /// Take care to avoid setting params back to an empty slice /// as this would trigger returning a default value and/or /// an unterminated parse loop. fn advance_by(&mut self, n: usize, params: &'a [CsiParam], result: T) -> T { let n = if matches!(params.get(n), Some(CsiParam::P(b';'))) { n + 1 } else { n }; let (_, next) = params.split_at(n); if !next.is_empty() { self.params = Some(next); } result } fn focus(&self, params: &'a [CsiParam], from_start: usize, from_end: usize) -> &'a [CsiParam] { if params == self.orig_params { let len = params.len(); ¶ms[from_start..len - from_end] } else { params } } fn select_character_path(&mut self, params: &'a [CsiParam]) -> Result { fn path(n: i64) -> Result { Ok(match n { 0 => CharacterPath::ImplementationDefault, 1 => CharacterPath::LeftToRightOrTopToBottom, 2 => CharacterPath::RightToLeftOrBottomToTop, _ => return Err(()), }) } match params { [CsiParam::P(b' ')] => Ok(self.advance_by( 1, params, CSI::SelectCharacterPath(CharacterPath::ImplementationDefault, 0), )), [CsiParam::Integer(a), CsiParam::P(b' ')] => { Ok(self.advance_by(2, params, CSI::SelectCharacterPath(path(*a)?, 0))) } [CsiParam::Integer(a), CsiParam::P(b';'), CsiParam::Integer(b), CsiParam::P(b' ')] => { Ok(self.advance_by(4, params, CSI::SelectCharacterPath(path(*a)?, *b))) } _ => Err(()), } } fn cursor_style(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::Integer(p), CsiParam::P(b' ')] => match FromPrimitive::from_i64(*p) { None => Err(()), Some(style) => { Ok(self.advance_by(2, params, CSI::Cursor(Cursor::CursorStyle(style)))) } }, _ => Err(()), } } fn checksum_area(&mut self, params: &'a [CsiParam]) -> Result { let params = Cracked::parse(¶ms[..params.len() - 1])?; let request_id = params.int(0)?; let page_number = params.int(1)?; let top = OneBased::from_optional_esc_param(params.get(2))?; let left = OneBased::from_optional_esc_param(params.get(3))?; let bottom = OneBased::from_optional_esc_param(params.get(4))?; let right = OneBased::from_optional_esc_param(params.get(5))?; Ok(CSI::Window(Box::new(Window::ChecksumRectangularArea { request_id, page_number, top, left, bottom, right, }))) } fn dsr(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::Integer(5)] => { Ok(self.advance_by(1, params, CSI::Device(Box::new(Device::StatusReport)))) } [CsiParam::Integer(6)] => { Ok(self.advance_by(1, params, CSI::Cursor(Cursor::RequestActivePositionReport))) } _ => Err(()), } } fn decstbm(&mut self, params: &'a [CsiParam]) -> Result { match params { [] => Ok(CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::new(1), bottom: OneBased::new(u32::max_value()), })), [p] => Ok(self.advance_by( 1, params, CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::from_esc_param(p)?, bottom: OneBased::new(u32::max_value()), }), )), [a, CsiParam::P(b';'), b] => Ok(self.advance_by( 3, params, CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::from_esc_param(a)?, bottom: OneBased::from_esc_param_with_big_default(b)?, }), )), [CsiParam::P(b';'), b] => Ok(self.advance_by( 2, params, CSI::Cursor(Cursor::SetTopAndBottomMargins { top: OneBased::new(1), bottom: OneBased::from_esc_param_with_big_default(b)?, }), )), _ => Err(()), } } fn xterm_key_modifier(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::P(b'>'), a, CsiParam::P(b';'), b] => { let resource = XtermKeyModifierResource::parse(a.as_integer().ok_or_else(|| ())?) .ok_or_else(|| ())?; Ok(self.advance_by( 4, params, CSI::Mode(Mode::XtermKeyMode { resource, value: Some(b.as_integer().ok_or_else(|| ())?), }), )) } [CsiParam::P(b'>'), a, CsiParam::P(b';')] => { let resource = XtermKeyModifierResource::parse(a.as_integer().ok_or_else(|| ())?) .ok_or_else(|| ())?; Ok(self.advance_by( 3, params, CSI::Mode(Mode::XtermKeyMode { resource, value: None, }), )) } [CsiParam::P(b'>'), p] => { let resource = XtermKeyModifierResource::parse(p.as_integer().ok_or_else(|| ())?) .ok_or_else(|| ())?; Ok(self.advance_by( 2, params, CSI::Mode(Mode::XtermKeyMode { resource, value: None, }), )) } _ => Err(()), } } fn decslrm(&mut self, params: &'a [CsiParam]) -> Result { match params { [] => { // with no params this is a request to save the cursor // and is technically in conflict with SetLeftAndRightMargins. // The emulator needs to decide based on DECSLRM mode // whether this saves the cursor or is SetLeftAndRightMargins // with default parameters! Ok(CSI::Cursor(Cursor::SaveCursor)) } [p] => Ok(self.advance_by( 1, params, CSI::Cursor(Cursor::SetLeftAndRightMargins { left: OneBased::from_esc_param(p)?, right: OneBased::new(u32::max_value()), }), )), [a, CsiParam::P(b';'), b] => Ok(self.advance_by( 3, params, CSI::Cursor(Cursor::SetLeftAndRightMargins { left: OneBased::from_esc_param(a)?, right: OneBased::from_esc_param(b)?, }), )), [CsiParam::P(b';'), b] => Ok(self.advance_by( 2, params, CSI::Cursor(Cursor::SetLeftAndRightMargins { left: OneBased::new(1), right: OneBased::from_esc_param(b)?, }), )), _ => Err(()), } } fn req_primary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [] => Ok(Device::RequestPrimaryDeviceAttributes), [CsiParam::Integer(0)] => { Ok(self.advance_by(1, params, Device::RequestPrimaryDeviceAttributes)) } _ => Err(()), } } fn req_terminal_name_and_version(&mut self, params: &'a [CsiParam]) -> Result { match params { [_] => Ok(Device::RequestTerminalNameAndVersion), [_, CsiParam::Integer(0)] => { Ok(self.advance_by(2, params, Device::RequestTerminalNameAndVersion)) } _ => Err(()), } } fn req_secondary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::P(b'>')] => Ok(Device::RequestSecondaryDeviceAttributes), [CsiParam::P(b'>'), CsiParam::Integer(0)] => { Ok(self.advance_by(2, params, Device::RequestSecondaryDeviceAttributes)) } _ => Err(()), } } fn req_tertiary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::P(b'=')] => Ok(Device::RequestTertiaryDeviceAttributes), [CsiParam::P(b'='), CsiParam::Integer(0)] => { Ok(self.advance_by(2, params, Device::RequestTertiaryDeviceAttributes)) } _ => Err(()), } } fn secondary_device_attributes(&mut self, params: &'a [CsiParam]) -> Result { match params { [_, CsiParam::Integer(1), CsiParam::P(b';'), CsiParam::Integer(0)] => Ok(self .advance_by( 4, params, Device::DeviceAttributes(DeviceAttributes::Vt101WithNoOptions), )), [_, CsiParam::Integer(6)] => { Ok(self.advance_by(2, params, Device::DeviceAttributes(DeviceAttributes::Vt102))) } [_, CsiParam::Integer(1), CsiParam::P(b';'), CsiParam::Integer(2)] => Ok(self .advance_by( 4, params, Device::DeviceAttributes(DeviceAttributes::Vt100WithAdvancedVideoOption), )), [_, CsiParam::Integer(62), ..] => Ok(self.advance_by( params.len(), params, Device::DeviceAttributes(DeviceAttributes::Vt220( DeviceAttributeFlags::from_params(¶ms[2..]), )), )), [_, CsiParam::Integer(63), ..] => Ok(self.advance_by( params.len(), params, Device::DeviceAttributes(DeviceAttributes::Vt320( DeviceAttributeFlags::from_params(¶ms[2..]), )), )), [_, CsiParam::Integer(64), ..] => Ok(self.advance_by( params.len(), params, Device::DeviceAttributes(DeviceAttributes::Vt420( DeviceAttributeFlags::from_params(¶ms[2..]), )), )), _ => Err(()), } } fn req_terminal_parameters(&mut self, params: &'a [CsiParam]) -> Result { match params { [] | [CsiParam::Integer(0)] => Ok(Device::RequestTerminalParameters(0)), [CsiParam::Integer(1)] => Ok(Device::RequestTerminalParameters(1)), _ => Err(()), } } /// Parse extended mouse reports known as SGR 1006 mode fn mouse_sgr1006(&mut self, params: &'a [CsiParam]) -> Result { let (p0, p1, p2) = match params { [CsiParam::P(b'<'), CsiParam::Integer(p0), CsiParam::P(b';'), CsiParam::Integer(p1), CsiParam::P(b';'), CsiParam::Integer(p2)] => { (*p0, *p1, *p2) } _ => return Err(()), }; // 'M' encodes a press, 'm' a release. let button = match (self.control, p0 & 0b110_0011) { ('M', 0) => MouseButton::Button1Press, ('m', 0) => MouseButton::Button1Release, ('M', 1) => MouseButton::Button2Press, ('m', 1) => MouseButton::Button2Release, ('M', 2) => MouseButton::Button3Press, ('m', 2) => MouseButton::Button3Release, ('M', 64) => MouseButton::Button4Press, ('m', 64) => MouseButton::Button4Release, ('M', 65) => MouseButton::Button5Press, ('m', 65) => MouseButton::Button5Release, ('M', 66) => MouseButton::Button6Press, ('m', 66) => MouseButton::Button6Release, ('M', 67) => MouseButton::Button7Press, ('m', 67) => MouseButton::Button7Release, ('M', 32) => MouseButton::Button1Drag, ('M', 33) => MouseButton::Button2Drag, ('M', 34) => MouseButton::Button3Drag, // Note that there is some theoretical ambiguity with these None values. // The ambiguity stems from alternative encodings of the mouse protocol; // when set to SGR1006 mode the variants with the `3` parameter do not // occur. They included here as a reminder for when support for those // other encodings is added and this block is likely copied and pasted // or refactored for re-use with them. ('M', 35) => MouseButton::None, // mouse motion with no buttons ('M', 3) => MouseButton::None, // legacy notification about button release ('m', 3) => MouseButton::None, // release+press doesn't make sense _ => { return Err(()); } }; let mut modifiers = Modifiers::NONE; if p0 & 4 != 0 { modifiers |= Modifiers::SHIFT; } if p0 & 8 != 0 { modifiers |= Modifiers::ALT; } if p0 & 16 != 0 { modifiers |= Modifiers::CTRL; } Ok(self.advance_by( 6, params, MouseReport::SGR1006 { x: p1 as u16, y: p2 as u16, button, modifiers, }, )) } fn decrqm(&mut self, params: &'a [CsiParam]) -> Result { Ok(CSI::Mode(match params { [CsiParam::Integer(p), CsiParam::P(b'$')] => { Mode::QueryMode(match FromPrimitive::from_i64(*p) { None => TerminalMode::Unspecified(p.to_u16().ok_or(())?), Some(mode) => TerminalMode::Code(mode), }) } [CsiParam::P(b'?'), CsiParam::Integer(p), CsiParam::P(b'$')] => { Mode::QueryDecPrivateMode(match FromPrimitive::from_i64(*p) { None => DecPrivateMode::Unspecified(p.to_u16().ok_or(())?), Some(mode) => DecPrivateMode::Code(mode), }) } _ => return Err(()), })) } fn dec(&mut self, params: &'a [CsiParam]) -> Result { match params { [CsiParam::Integer(p0), ..] => match FromPrimitive::from_i64(*p0) { None => Ok(self.advance_by( 1, params, DecPrivateMode::Unspecified(p0.to_u16().ok_or(())?), )), Some(mode) => Ok(self.advance_by(1, params, DecPrivateMode::Code(mode))), }, _ => Err(()), } } fn terminal_mode(&mut self, params: &'a [CsiParam]) -> Result { let p0 = params .get(0) .and_then(CsiParam::as_integer) .ok_or_else(|| ())?; match FromPrimitive::from_i64(p0) { None => { Ok(self.advance_by(1, params, TerminalMode::Unspecified(p0.to_u16().ok_or(())?))) } Some(mode) => Ok(self.advance_by(1, params, TerminalMode::Code(mode))), } } fn parse_sgr_color(&mut self, params: &'a [CsiParam]) -> Result { match params { // wezterm extension to support an optional alpha channel in the `:` form only [_, CsiParam::P(b':'), CsiParam::Integer(6), CsiParam::P(b':'), CsiParam::Integer(_colorspace), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, CsiParam::P(b':'), alpha, ..] => { let res: SrgbaTuple = (to_u8(red)?, to_u8(green)?, to_u8(blue)?, to_u8(alpha)?).into(); Ok(self.advance_by(13, params, res.into())) } [_, CsiParam::P(b':'), CsiParam::Integer(6), CsiParam::P(b':'), /* empty colorspace */ CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, CsiParam::P(b':'), alpha, ..] => { let res: SrgbaTuple = (to_u8(red)?, to_u8(green)?, to_u8(blue)?, to_u8(alpha)?).into(); Ok(self.advance_by(12, params, res.into())) } [_, CsiParam::P(b':'), CsiParam::Integer(6), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, CsiParam::P(b':'), alpha, ..] => { let res: SrgbaTuple = (to_u8(red)?, to_u8(green)?, to_u8(blue)?, to_u8(alpha)?).into(); Ok(self.advance_by(11, params, res.into())) } // standard sgr colors [_, CsiParam::P(b':'), CsiParam::Integer(2), CsiParam::P(b':'), CsiParam::Integer(_colorspace), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, ..] => { let res = RgbColor::new_8bpc(to_u8(red)?, to_u8(green)?, to_u8(blue)?).into(); Ok(self.advance_by(11, params, res)) } [_, CsiParam::P(b':'), CsiParam::Integer(2), CsiParam::P(b':'), /* empty colorspace */ CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, ..] => { let res = RgbColor::new_8bpc(to_u8(red)?, to_u8(green)?, to_u8(blue)?).into(); Ok(self.advance_by(10, params, res)) } [_, CsiParam::P(b';'), CsiParam::Integer(2), CsiParam::P(b';'), red, CsiParam::P(b';'), green, CsiParam::P(b';'), blue, ..] | [_, CsiParam::P(b':'), CsiParam::Integer(2), CsiParam::P(b':'), red, CsiParam::P(b':'), green, CsiParam::P(b':'), blue, ..] => { let res = RgbColor::new_8bpc(to_u8(red)?, to_u8(green)?, to_u8(blue)?).into(); Ok(self.advance_by(9, params, res)) } [_, CsiParam::P(b';'), CsiParam::Integer(5), CsiParam::P(b';'), idx, ..] | [_, CsiParam::P(b':'), CsiParam::Integer(5), CsiParam::P(b':'), idx, ..] => { Ok(self.advance_by(5, params, ColorSpec::PaletteIndex(to_u8(idx)?))) } _ => Err(()), } } fn window(&mut self, params: &'a [CsiParam]) -> Result { let params = Cracked::parse(params)?; let p = params.int(0)?; let arg1 = params.opt_int(1); let arg2 = params.opt_int(2); match p { 1 => Ok(Window::DeIconify), 2 => Ok(Window::Iconify), 3 => Ok(Window::MoveWindow { x: arg1.unwrap_or(0), y: arg2.unwrap_or(0), }), 4 => Ok(Window::ResizeWindowPixels { height: arg1, width: arg2, }), 5 => Ok(Window::RaiseWindow), 6 => match params.len() { 1 => Ok(Window::LowerWindow), _ => Ok(Window::ReportCellSizePixelsResponse { height: arg1, width: arg2, }), }, 7 => Ok(Window::RefreshWindow), 8 => Ok(Window::ResizeWindowCells { height: arg1, width: arg2, }), 9 => match arg1 { Some(0) => Ok(Window::RestoreMaximizedWindow), Some(1) => Ok(Window::MaximizeWindow), Some(2) => Ok(Window::MaximizeWindowVertically), Some(3) => Ok(Window::MaximizeWindowHorizontally), _ => Err(()), }, 10 => match arg1 { Some(0) => Ok(Window::UndoFullScreenMode), Some(1) => Ok(Window::ChangeToFullScreenMode), Some(2) => Ok(Window::ToggleFullScreen), _ => Err(()), }, 11 => Ok(Window::ReportWindowState), 13 => match arg1 { None => Ok(Window::ReportWindowPosition), Some(2) => Ok(Window::ReportTextAreaPosition), _ => Err(()), }, 14 => match arg1 { None => Ok(Window::ReportTextAreaSizePixels), Some(2) => Ok(Window::ReportWindowSizePixels), _ => Err(()), }, 15 => Ok(Window::ReportScreenSizePixels), 16 => Ok(Window::ReportCellSizePixels), 18 => Ok(Window::ReportTextAreaSizeCells), 19 => Ok(Window::ReportScreenSizeCells), 20 => Ok(Window::ReportIconLabel), 21 => Ok(Window::ReportWindowTitle), 22 => match arg1 { Some(0) => Ok(Window::PushIconAndWindowTitle), Some(1) => Ok(Window::PushIconTitle), Some(2) => Ok(Window::PushWindowTitle), _ => Err(()), }, 23 => match arg1 { Some(0) => Ok(Window::PopIconAndWindowTitle), Some(1) => Ok(Window::PopIconTitle), Some(2) => Ok(Window::PopWindowTitle), _ => Err(()), }, _ => Err(()), } } fn underline(&mut self, params: &'a [CsiParam]) -> Result { let (sgr, n) = match params { [_, CsiParam::P(b':'), CsiParam::Integer(0), ..] => { (Sgr::Underline(Underline::None), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(1), ..] => { (Sgr::Underline(Underline::Single), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(2), ..] => { (Sgr::Underline(Underline::Double), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(3), ..] => { (Sgr::Underline(Underline::Curly), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(4), ..] => { (Sgr::Underline(Underline::Dotted), 3) } [_, CsiParam::P(b':'), CsiParam::Integer(5), ..] => { (Sgr::Underline(Underline::Dashed), 3) } _ => (Sgr::Underline(Underline::Single), 1), }; Ok(self.advance_by(n, params, sgr)) } fn sgr(&mut self, params: &'a [CsiParam]) -> Result { if params.is_empty() { // With no parameters, treat as equivalent to Reset. Ok(Sgr::Reset) } else { for p in params { match p { CsiParam::P(b';') | CsiParam::P(b':') | CsiParam::P(b'?') | CsiParam::Integer(_) => {} _ => return Err(()), } } // Consume a single parameter and return the parsed result macro_rules! one { ($t:expr) => { Ok(self.advance_by(1, params, $t)) }; } match ¶ms[0] { CsiParam::P(b';') => { // Starting with an empty item is equivalent to a reset self.advance_by(1, params, Ok(Sgr::Reset)) } // There are a small number of DEC private SGR parameters that // have equivalents in the normal SGR space. // We're simply inlining recognizing them here, and mapping them // to those SGR equivalents. That makes parsing "lossy" in the // sense that the original sequence is lost, but semantically, // the result is the same. // These codes are taken from the "SGR" section of // "Digital ANSI-Compliant Printing Protocol // Level 2 Programming Reference Manual" // on page 7-78. // /* Withdrawn because xterm introduced a conflict: * * CsiParam::P(b'?') if params.len() > 1 => match ¶ms[1] { // Consume two parameters and return the parsed result macro_rules! two { ($t:expr) => { Ok(self.advance_by(2, params, $t)) }; } CsiParam::Integer(i) => match FromPrimitive::from_i64(*i) { None => Err(()), Some(code) => match code { 0 => two!(Sgr::Reset), 4 => two!(Sgr::VerticalAlign(VerticalAlign::SuperScript)), 5 => two!(Sgr::VerticalAlign(VerticalAlign::SubScript)), 6 => two!(Sgr::Overline(true)), 24 => two!(Sgr::VerticalAlign(VerticalAlign::BaseLine)), 26 => two!(Sgr::Overline(false)), _ => Err(()), }, }, _ => Err(()), }, */ CsiParam::P(_) => Err(()), CsiParam::Integer(i) => match FromPrimitive::from_i64(*i) { None => Err(()), Some(sgr) => match sgr { SgrCode::Reset => one!(Sgr::Reset), SgrCode::IntensityBold => one!(Sgr::Intensity(Intensity::Bold)), SgrCode::IntensityDim => one!(Sgr::Intensity(Intensity::Half)), SgrCode::NormalIntensity => one!(Sgr::Intensity(Intensity::Normal)), SgrCode::UnderlineOn => { self.underline(params) //.map(Sgr::Underline) } SgrCode::UnderlineDouble => one!(Sgr::Underline(Underline::Double)), SgrCode::UnderlineOff => one!(Sgr::Underline(Underline::None)), SgrCode::UnderlineColor => { self.parse_sgr_color(params).map(Sgr::UnderlineColor) } SgrCode::ResetUnderlineColor => { one!(Sgr::UnderlineColor(ColorSpec::default())) } SgrCode::BlinkOn => one!(Sgr::Blink(Blink::Slow)), SgrCode::RapidBlinkOn => one!(Sgr::Blink(Blink::Rapid)), SgrCode::BlinkOff => one!(Sgr::Blink(Blink::None)), SgrCode::ItalicOn => one!(Sgr::Italic(true)), SgrCode::ItalicOff => one!(Sgr::Italic(false)), SgrCode::VerticalAlignSuperScript => { one!(Sgr::VerticalAlign(VerticalAlign::SuperScript)) } SgrCode::VerticalAlignSubScript => { one!(Sgr::VerticalAlign(VerticalAlign::SubScript)) } SgrCode::VerticalAlignBaseLine => { one!(Sgr::VerticalAlign(VerticalAlign::BaseLine)) } SgrCode::ForegroundColor => { self.parse_sgr_color(params).map(Sgr::Foreground) } SgrCode::ForegroundBlack => one!(Sgr::Foreground(AnsiColor::Black.into())), SgrCode::ForegroundRed => one!(Sgr::Foreground(AnsiColor::Maroon.into())), SgrCode::ForegroundGreen => one!(Sgr::Foreground(AnsiColor::Green.into())), SgrCode::ForegroundYellow => one!(Sgr::Foreground(AnsiColor::Olive.into())), SgrCode::ForegroundBlue => one!(Sgr::Foreground(AnsiColor::Navy.into())), SgrCode::ForegroundMagenta => { one!(Sgr::Foreground(AnsiColor::Purple.into())) } SgrCode::ForegroundCyan => one!(Sgr::Foreground(AnsiColor::Teal.into())), SgrCode::ForegroundWhite => one!(Sgr::Foreground(AnsiColor::Silver.into())), SgrCode::ForegroundDefault => one!(Sgr::Foreground(ColorSpec::Default)), SgrCode::ForegroundBrightBlack => { one!(Sgr::Foreground(AnsiColor::Grey.into())) } SgrCode::ForegroundBrightRed => { one!(Sgr::Foreground(AnsiColor::Red.into())) } SgrCode::ForegroundBrightGreen => { one!(Sgr::Foreground(AnsiColor::Lime.into())) } SgrCode::ForegroundBrightYellow => { one!(Sgr::Foreground(AnsiColor::Yellow.into())) } SgrCode::ForegroundBrightBlue => { one!(Sgr::Foreground(AnsiColor::Blue.into())) } SgrCode::ForegroundBrightMagenta => { one!(Sgr::Foreground(AnsiColor::Fuchsia.into())) } SgrCode::ForegroundBrightCyan => { one!(Sgr::Foreground(AnsiColor::Aqua.into())) } SgrCode::ForegroundBrightWhite => { one!(Sgr::Foreground(AnsiColor::White.into())) } SgrCode::BackgroundColor => { self.parse_sgr_color(params).map(Sgr::Background) } SgrCode::BackgroundBlack => one!(Sgr::Background(AnsiColor::Black.into())), SgrCode::BackgroundRed => one!(Sgr::Background(AnsiColor::Maroon.into())), SgrCode::BackgroundGreen => one!(Sgr::Background(AnsiColor::Green.into())), SgrCode::BackgroundYellow => one!(Sgr::Background(AnsiColor::Olive.into())), SgrCode::BackgroundBlue => one!(Sgr::Background(AnsiColor::Navy.into())), SgrCode::BackgroundMagenta => { one!(Sgr::Background(AnsiColor::Purple.into())) } SgrCode::BackgroundCyan => one!(Sgr::Background(AnsiColor::Teal.into())), SgrCode::BackgroundWhite => one!(Sgr::Background(AnsiColor::Silver.into())), SgrCode::BackgroundDefault => one!(Sgr::Background(ColorSpec::Default)), SgrCode::BackgroundBrightBlack => { one!(Sgr::Background(AnsiColor::Grey.into())) } SgrCode::BackgroundBrightRed => { one!(Sgr::Background(AnsiColor::Red.into())) } SgrCode::BackgroundBrightGreen => { one!(Sgr::Background(AnsiColor::Lime.into())) } SgrCode::BackgroundBrightYellow => { one!(Sgr::Background(AnsiColor::Yellow.into())) } SgrCode::BackgroundBrightBlue => { one!(Sgr::Background(AnsiColor::Blue.into())) } SgrCode::BackgroundBrightMagenta => { one!(Sgr::Background(AnsiColor::Fuchsia.into())) } SgrCode::BackgroundBrightCyan => { one!(Sgr::Background(AnsiColor::Aqua.into())) } SgrCode::BackgroundBrightWhite => { one!(Sgr::Background(AnsiColor::White.into())) } SgrCode::InverseOn => one!(Sgr::Inverse(true)), SgrCode::InverseOff => one!(Sgr::Inverse(false)), SgrCode::InvisibleOn => one!(Sgr::Invisible(true)), SgrCode::InvisibleOff => one!(Sgr::Invisible(false)), SgrCode::StrikeThroughOn => one!(Sgr::StrikeThrough(true)), SgrCode::StrikeThroughOff => one!(Sgr::StrikeThrough(false)), SgrCode::OverlineOn => one!(Sgr::Overline(true)), SgrCode::OverlineOff => one!(Sgr::Overline(false)), SgrCode::DefaultFont => one!(Sgr::Font(Font::Default)), SgrCode::AltFont1 => one!(Sgr::Font(Font::Alternate(1))), SgrCode::AltFont2 => one!(Sgr::Font(Font::Alternate(2))), SgrCode::AltFont3 => one!(Sgr::Font(Font::Alternate(3))), SgrCode::AltFont4 => one!(Sgr::Font(Font::Alternate(4))), SgrCode::AltFont5 => one!(Sgr::Font(Font::Alternate(5))), SgrCode::AltFont6 => one!(Sgr::Font(Font::Alternate(6))), SgrCode::AltFont7 => one!(Sgr::Font(Font::Alternate(7))), SgrCode::AltFont8 => one!(Sgr::Font(Font::Alternate(8))), SgrCode::AltFont9 => one!(Sgr::Font(Font::Alternate(9))), }, }, } } } } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive)] pub enum SgrCode { Reset = 0, IntensityBold = 1, IntensityDim = 2, ItalicOn = 3, UnderlineOn = 4, /// Blinks < 150 times per minute BlinkOn = 5, /// Blinks > 150 times per minute RapidBlinkOn = 6, InverseOn = 7, InvisibleOn = 8, StrikeThroughOn = 9, DefaultFont = 10, AltFont1 = 11, AltFont2 = 12, AltFont3 = 13, AltFont4 = 14, AltFont5 = 15, AltFont6 = 16, AltFont7 = 17, AltFont8 = 18, AltFont9 = 19, // Fraktur = 20, UnderlineDouble = 21, NormalIntensity = 22, ItalicOff = 23, UnderlineOff = 24, BlinkOff = 25, InverseOff = 27, InvisibleOff = 28, StrikeThroughOff = 29, ForegroundBlack = 30, ForegroundRed = 31, ForegroundGreen = 32, ForegroundYellow = 33, ForegroundBlue = 34, ForegroundMagenta = 35, ForegroundCyan = 36, ForegroundWhite = 37, ForegroundDefault = 39, BackgroundBlack = 40, BackgroundRed = 41, BackgroundGreen = 42, BackgroundYellow = 43, BackgroundBlue = 44, BackgroundMagenta = 45, BackgroundCyan = 46, BackgroundWhite = 47, BackgroundDefault = 49, OverlineOn = 53, OverlineOff = 55, UnderlineColor = 58, ResetUnderlineColor = 59, VerticalAlignSuperScript = 73, VerticalAlignSubScript = 74, VerticalAlignBaseLine = 75, ForegroundBrightBlack = 90, ForegroundBrightRed = 91, ForegroundBrightGreen = 92, ForegroundBrightYellow = 93, ForegroundBrightBlue = 94, ForegroundBrightMagenta = 95, ForegroundBrightCyan = 96, ForegroundBrightWhite = 97, BackgroundBrightBlack = 100, BackgroundBrightRed = 101, BackgroundBrightGreen = 102, BackgroundBrightYellow = 103, BackgroundBrightBlue = 104, BackgroundBrightMagenta = 105, BackgroundBrightCyan = 106, BackgroundBrightWhite = 107, /// Maybe followed either either a 256 color palette index or /// a sequence describing a true color rgb value ForegroundColor = 38, BackgroundColor = 48, } impl<'a> Iterator for CSIParser<'a> { type Item = CSI; fn next(&mut self) -> Option { let params = match self.params.take() { None => return None, Some(params) => params, }; match self.parse_next(¶ms) { Ok(csi) => Some(csi), Err(()) => Some(CSI::Unspecified(Box::new(Unspecified { params: params.to_vec(), parameters_truncated: self.parameters_truncated, control: self.control, }))), } } } #[cfg(test)] mod test { use super::*; use std::io::Write; fn parse(control: char, params: &[i64], expected: &str) -> Vec { let mut cparams = vec![]; for &p in params { if !cparams.is_empty() { cparams.push(CsiParam::P(b';')); } cparams.push(CsiParam::Integer(p)); } let res = CSI::parse(&cparams, false, control).collect(); println!("parsed -> {:#?}", res); assert_eq!(encode(&res), expected); res } fn encode(seq: &Vec) -> String { let mut res = Vec::new(); for s in seq { write!(res, "{}", s).unwrap(); } String::from_utf8(res).unwrap() } #[test] fn basic() { assert_eq!(parse('m', &[], "\x1b[0m"), vec![CSI::Sgr(Sgr::Reset)]); assert_eq!(parse('m', &[0], "\x1b[0m"), vec![CSI::Sgr(Sgr::Reset)]); assert_eq!( parse('m', &[1], "\x1b[1m"), vec![CSI::Sgr(Sgr::Intensity(Intensity::Bold))] ); assert_eq!( parse('m', &[1, 3], "\x1b[1m\x1b[3m"), vec![ CSI::Sgr(Sgr::Intensity(Intensity::Bold)), CSI::Sgr(Sgr::Italic(true)), ] ); // Verify that we propagate Unspecified for codes // that we don't recognize. assert_eq!( parse('m', &[1, 3, 1231231], "\x1b[1m\x1b[3m\x1b[1231231m"), vec![ CSI::Sgr(Sgr::Intensity(Intensity::Bold)), CSI::Sgr(Sgr::Italic(true)), CSI::Unspecified(Box::new(Unspecified { params: [CsiParam::Integer(1231231)].to_vec(), parameters_truncated: false, control: 'm', })), ] ); assert_eq!( parse('m', &[1, 1231231, 3], "\x1b[1m\x1b[1231231;3m"), vec![ CSI::Sgr(Sgr::Intensity(Intensity::Bold)), CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(1231231), CsiParam::P(b';'), CsiParam::Integer(3) ] .to_vec(), parameters_truncated: false, control: 'm', })), ] ); assert_eq!( parse('m', &[1231231, 3], "\x1b[1231231;3m"), vec![CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(1231231), CsiParam::P(b';'), CsiParam::Integer(3) ] .to_vec(), parameters_truncated: false, control: 'm', }))] ); } #[test] fn blinks() { assert_eq!( parse('m', &[5], "\x1b[5m"), vec![CSI::Sgr(Sgr::Blink(Blink::Slow))] ); assert_eq!( parse('m', &[6], "\x1b[6m"), vec![CSI::Sgr(Sgr::Blink(Blink::Rapid))] ); assert_eq!( parse('m', &[25], "\x1b[25m"), vec![CSI::Sgr(Sgr::Blink(Blink::None))] ); } #[test] fn underlines() { assert_eq!( parse('m', &[21], "\x1b[21m"), vec![CSI::Sgr(Sgr::Underline(Underline::Double))] ); assert_eq!( parse('m', &[4], "\x1b[4m"), vec![CSI::Sgr(Sgr::Underline(Underline::Single))] ); } #[test] fn underline_color() { assert_eq!( parse('m', &[58, 2], "\x1b[58;2m"), vec![CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(58), CsiParam::P(b';'), CsiParam::Integer(2) ] .to_vec(), parameters_truncated: false, control: 'm', }))] ); assert_eq!( parse('m', &[58, 2, 255, 255, 255], "\x1b[58:2::255:255:255m"), vec![CSI::Sgr(Sgr::UnderlineColor(ColorSpec::TrueColor( (255, 255, 255).into(), )))] ); assert_eq!( parse('m', &[58, 5, 220, 255, 255], "\x1b[58:5:220m\x1b[255;255m"), vec![ CSI::Sgr(Sgr::UnderlineColor(ColorSpec::PaletteIndex(220))), CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(255), CsiParam::P(b';'), CsiParam::Integer(255) ] .to_vec(), parameters_truncated: false, control: 'm', })), ] ); } #[test] fn color() { assert_eq!( parse('m', &[38, 2], "\x1b[38;2m"), vec![CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(38), CsiParam::P(b';'), CsiParam::Integer(2) ] .to_vec(), parameters_truncated: false, control: 'm', }))] ); assert_eq!( parse('m', &[38, 2, 255, 255, 255], "\x1b[38:2::255:255:255m"), vec![CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (255, 255, 255).into(), )))] ); assert_eq!( parse('m', &[38, 5, 220, 255, 255], "\x1b[38:5:220m\x1b[255;255m"), vec![ CSI::Sgr(Sgr::Foreground(ColorSpec::PaletteIndex(220))), CSI::Unspecified(Box::new(Unspecified { params: [ CsiParam::Integer(255), CsiParam::P(b';'), CsiParam::Integer(255) ] .to_vec(), parameters_truncated: false, control: 'm', })), ] ); } #[test] fn edit() { assert_eq!( parse('J', &[], "\x1b[J"), vec![CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseToEndOfDisplay, ))] ); assert_eq!( parse('J', &[0], "\x1b[J"), vec![CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseToEndOfDisplay, ))] ); assert_eq!( parse('J', &[1], "\x1b[1J"), vec![CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseToStartOfDisplay, ))] ); } #[test] fn window() { assert_eq!( parse('t', &[6], "\x1b[6t"), vec![CSI::Window(Box::new(Window::LowerWindow))] ); assert_eq!( parse('t', &[6, 15, 7], "\x1b[6;15;7t"), vec![CSI::Window(Box::new( Window::ReportCellSizePixelsResponse { width: Some(7), height: Some(15) } ))] ); } #[test] fn cursor() { assert_eq!( parse('C', &[], "\x1b[C"), vec![CSI::Cursor(Cursor::Right(1))] ); // check that 0 is treated as 1 assert_eq!( parse('C', &[0], "\x1b[C"), vec![CSI::Cursor(Cursor::Right(1))] ); assert_eq!( parse('C', &[1], "\x1b[C"), vec![CSI::Cursor(Cursor::Right(1))] ); assert_eq!( parse('C', &[4], "\x1b[4C"), vec![CSI::Cursor(Cursor::Right(4))] ); // Check that we default the second parameter of two // when only one is provided assert_eq!( parse('H', &[2], "\x1b[2;1H"), vec![CSI::Cursor(Cursor::Position { line: OneBased::new(2), col: OneBased::new(1) })] ); } #[test] fn ansiset() { assert_eq!( parse('h', &[20], "\x1b[20h"), vec![CSI::Mode(Mode::SetMode(TerminalMode::Code( TerminalModeCode::AutomaticNewline )))] ); assert_eq!( parse('l', &[20], "\x1b[20l"), vec![CSI::Mode(Mode::ResetMode(TerminalMode::Code( TerminalModeCode::AutomaticNewline )))] ); } #[test] fn bidi_modes() { assert_eq!( parse('h', &[8], "\x1b[8h"), vec![CSI::Mode(Mode::SetMode(TerminalMode::Code( TerminalModeCode::BiDirectionalSupportMode )))] ); assert_eq!( parse('l', &[8], "\x1b[8l"), vec![CSI::Mode(Mode::ResetMode(TerminalMode::Code( TerminalModeCode::BiDirectionalSupportMode )))] ); } #[test] fn mouse() { let res: Vec<_> = CSI::parse( &[ CsiParam::P(b'<'), CsiParam::Integer(0), CsiParam::P(b';'), CsiParam::Integer(12), CsiParam::P(b';'), CsiParam::Integer(300), ], false, 'M', ) .collect(); assert_eq!(encode(&res), "\x1b[<0;12;300M"); assert_eq!( res, vec![CSI::Mouse(MouseReport::SGR1006 { x: 12, y: 300, button: MouseButton::Button1Press, modifiers: Modifiers::NONE, })] ); } #[test] fn soft_reset() { let res: Vec<_> = CSI::parse(&[CsiParam::P(b'!')], false, 'p').collect(); assert_eq!(encode(&res), "\x1b[!p"); assert_eq!(res, vec![CSI::Device(Box::new(Device::SoftReset))],); } #[test] fn device_attr() { let res: Vec<_> = CSI::parse( &[ CsiParam::P(b'?'), CsiParam::Integer(63), CsiParam::P(b';'), CsiParam::Integer(1), CsiParam::P(b';'), CsiParam::Integer(2), CsiParam::P(b';'), CsiParam::Integer(4), CsiParam::P(b';'), CsiParam::Integer(6), CsiParam::P(b';'), CsiParam::Integer(9), CsiParam::P(b';'), CsiParam::Integer(15), CsiParam::P(b';'), CsiParam::Integer(22), ], false, 'c', ) .collect(); assert_eq!( res, vec![CSI::Device(Box::new(Device::DeviceAttributes( DeviceAttributes::Vt320(DeviceAttributeFlags::new(vec![ DeviceAttribute::Code(DeviceAttributeCodes::Columns132), DeviceAttribute::Code(DeviceAttributeCodes::Printer), DeviceAttribute::Code(DeviceAttributeCodes::SixelGraphics), DeviceAttribute::Code(DeviceAttributeCodes::SelectiveErase), DeviceAttribute::Code(DeviceAttributeCodes::NationalReplacementCharsets), DeviceAttribute::Code(DeviceAttributeCodes::TechnicalCharacters), DeviceAttribute::Code(DeviceAttributeCodes::AnsiColor), ])), )))] ); assert_eq!(encode(&res), "\x1b[?63;1;2;4;6;9;15;22c"); } } termwiz-0.22.0/src/escape/esc.rs000064400000000000000000000155301046102023000145610ustar 00000000000000use num_derive::*; use num_traits::{FromPrimitive, ToPrimitive}; use std::fmt::{Display, Error as FmtError, Formatter, Write as FmtWrite}; #[derive(Debug, Clone, PartialEq, Eq)] pub enum Esc { Unspecified { intermediate: Option, /// The final character in the Escape sequence; this typically /// defines how to interpret the other parameters. control: u8, }, Code(EscCode), } macro_rules! esc { ($low:expr) => { ($low as isize) }; ($high:expr, $low:expr) => { ((($high as isize) << 8) | ($low as isize)) }; } #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive, Copy)] pub enum EscCode { /// RIS - Full Reset FullReset = esc!('c'), /// IND - Index. Note that for Vt52 and Windows 10 ANSI consoles, /// this is interpreted as CursorUp Index = esc!('D'), /// NEL - Next Line NextLine = esc!('E'), /// Move the cursor to the bottom left corner of the screen CursorPositionLowerLeft = esc!('F'), /// HTS - Horizontal Tab Set HorizontalTabSet = esc!('H'), /// RI - Reverse Index – Performs the reverse operation of \n, moves cursor up one line, /// maintains horizontal position, scrolls buffer if necessary ReverseIndex = esc!('M'), /// SS2 Single shift of G2 character set affects next character only SingleShiftG2 = esc!('N'), /// SS3 Single shift of G3 character set affects next character only SingleShiftG3 = esc!('O'), /// SPA - Start of Guarded Area StartOfGuardedArea = esc!('V'), /// EPA - End of Guarded Area EndOfGuardedArea = esc!('W'), /// SOS - Start of String StartOfString = esc!('X'), /// DECID - Return Terminal ID (obsolete form of CSI c - aka DA) ReturnTerminalId = esc!('Z'), /// ST - String Terminator StringTerminator = esc!('\\'), /// PM - Privacy Message PrivacyMessage = esc!('^'), /// APC - Application Program Command ApplicationProgramCommand = esc!('_'), /// Used by tmux for setting the window title TmuxTitle = esc!('k'), /// DECBI - Back Index DecBackIndex = esc!('6'), /// DECSC - Save cursor position DecSaveCursorPosition = esc!('7'), /// DECRC - Restore saved cursor position DecRestoreCursorPosition = esc!('8'), /// DECPAM - Application Keypad DecApplicationKeyPad = esc!('='), /// DECPNM - Normal Keypad DecNormalKeyPad = esc!('>'), /// Designate G0 Character Set – DEC Line Drawing DecLineDrawingG0 = esc!('(', '0'), /// Designate G0 Character Set - UK UkCharacterSetG0 = esc!('(', 'A'), /// Designate G0 Character Set – US ASCII AsciiCharacterSetG0 = esc!('(', 'B'), /// Designate G1 Character Set – DEC Line Drawing DecLineDrawingG1 = esc!(')', '0'), /// Designate G1 Character Set - UK UkCharacterSetG1 = esc!(')', 'A'), /// Designate G1 Character Set – US ASCII AsciiCharacterSetG1 = esc!(')', 'B'), /// https://vt100.net/docs/vt510-rm/DECALN.html DecScreenAlignmentDisplay = esc!('#', '8'), /// DECDHL - DEC double-height line, top half DecDoubleHeightTopHalfLine = esc!('#', '3'), /// DECDHL - DEC double-height line, bottom half DecDoubleHeightBottomHalfLine = esc!('#', '4'), /// DECSWL - DEC single-width line DecSingleWidthLine = esc!('#', '5'), /// DECDWL - DEC double-width line DecDoubleWidthLine = esc!('#', '6'), /// These are typically sent by the terminal when keys are pressed ApplicationModeArrowUpPress = esc!('O', 'A'), ApplicationModeArrowDownPress = esc!('O', 'B'), ApplicationModeArrowRightPress = esc!('O', 'C'), ApplicationModeArrowLeftPress = esc!('O', 'D'), ApplicationModeHomePress = esc!('O', 'H'), ApplicationModeEndPress = esc!('O', 'F'), F1Press = esc!('O', 'P'), F2Press = esc!('O', 'Q'), F3Press = esc!('O', 'R'), F4Press = esc!('O', 'S'), } impl Esc { pub fn parse(intermediate: Option, control: u8) -> Self { Self::internal_parse(intermediate, control).unwrap_or_else(|_| Esc::Unspecified { intermediate, control, }) } fn internal_parse(intermediate: Option, control: u8) -> Result { let packed = match intermediate { Some(high) => ((u16::from(high)) << 8) | u16::from(control), None => u16::from(control), }; let code = FromPrimitive::from_u16(packed).ok_or(())?; Ok(Esc::Code(code)) } } impl Display for Esc { // TODO: data size optimization opportunity: if we could somehow know that we // had a run of CSI instances being encoded in sequence, we could // potentially collapse them together. This is a few bytes difference in // practice so it may not be worthwhile with modern networks. fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { f.write_char(0x1b as char)?; use self::Esc::*; match self { Code(code) => { let packed = code .to_u16() .expect("num-derive failed to implement ToPrimitive"); if packed > u16::from(u8::max_value()) { write!( f, "{}{}", (packed >> 8) as u8 as char, (packed & 0xff) as u8 as char )?; } else { f.write_char((packed & 0xff) as u8 as char)?; } } Unspecified { intermediate, control, } => { if let Some(i) = intermediate { write!(f, "{}{}", *i as char, *control as char)?; } else { f.write_char(*control as char)?; } } }; Ok(()) } } #[cfg(test)] mod test { use super::*; fn encode(osc: &Esc) -> String { format!("{}", osc) } fn parse(esc: &str) -> Esc { let result = if esc.len() == 1 { Esc::parse(None, esc.as_bytes()[0]) } else { Esc::parse(Some(esc.as_bytes()[0]), esc.as_bytes()[1]) }; assert_eq!(encode(&result), format!("\x1b{}", esc)); result } #[test] fn test() { assert_eq!(parse("(0"), Esc::Code(EscCode::DecLineDrawingG0)); assert_eq!(parse("(B"), Esc::Code(EscCode::AsciiCharacterSetG0)); assert_eq!(parse(")0"), Esc::Code(EscCode::DecLineDrawingG1)); assert_eq!(parse(")B"), Esc::Code(EscCode::AsciiCharacterSetG1)); assert_eq!(parse("#3"), Esc::Code(EscCode::DecDoubleHeightTopHalfLine)); assert_eq!( parse("#4"), Esc::Code(EscCode::DecDoubleHeightBottomHalfLine) ); assert_eq!(parse("#5"), Esc::Code(EscCode::DecSingleWidthLine)); assert_eq!(parse("#6"), Esc::Code(EscCode::DecDoubleWidthLine)); } } termwiz-0.22.0/src/escape/mod.rs000064400000000000000000000434101046102023000145640ustar 00000000000000// suppress inscrutable useless_attribute clippy that shows up when // using derive(FromPrimitive) #![cfg_attr(feature = "cargo-clippy", allow(clippy::useless_attribute))] #![allow(clippy::upper_case_acronyms)] //! This module provides the ability to parse escape sequences and attach //! semantic meaning to them. It can also encode the semantic values as //! escape sequences. It provides encoding and decoding functionality //! only; it does not provide terminal emulation facilities itself. use crate::tmux_cc::Event; use num_derive::*; use std::fmt::{Display, Error as FmtError, Formatter, Write as FmtWrite}; use wezterm_color_types::LinearRgba; pub mod apc; pub mod csi; pub mod esc; pub mod osc; pub mod parser; pub use self::apc::KittyImage; pub use self::csi::CSI; pub use self::esc::{Esc, EscCode}; pub use self::osc::OperatingSystemCommand; use vtparse::CsiParam; #[derive(Debug, Clone, PartialEq)] pub enum Action { /// Send a single printable character to the display Print(char), /// Send a string of printable characters to the display. PrintString(String), /// A C0 or C1 control code Control(ControlCode), /// Device control. This is uncommon wrt. terminal emulation. DeviceControl(DeviceControlMode), /// A command that typically doesn't change the contents of the /// terminal, but rather influences how it displays or otherwise /// interacts with the rest of the system OperatingSystemCommand(Box), CSI(CSI), Esc(Esc), Sixel(Box), /// A list of termcap, terminfo names for which the application /// wants information XtGetTcap(Vec), KittyImage(Box), } impl Action { /// Append this `Action` to a `Vec`. /// If this `Action` is `Print` and the last element is `Print` or /// `PrintString` then the elements are combined into `PrintString` /// to reduce heap utilization. pub fn append_to(self, dest: &mut Vec) { if let Action::Print(c) = &self { match dest.last_mut() { Some(Action::PrintString(s)) => { s.push(*c); return; } Some(Action::Print(prior)) => { let mut s = prior.to_string(); dest.pop(); s.push(*c); dest.push(Action::PrintString(s)); return; } _ => {} } } dest.push(self); } } #[cfg(all(test, target_pointer_width = "64"))] #[test] fn action_size() { assert_eq!(std::mem::size_of::(), 32); assert_eq!(std::mem::size_of::(), 16); assert_eq!(std::mem::size_of::(), 1); assert_eq!(std::mem::size_of::(), 32); assert_eq!(std::mem::size_of::(), 4); } /// Encode self as an escape sequence. The escape sequence may potentially /// be clear text with no actual escape sequences. impl Display for Action { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Action::Print(c) => write!(f, "{}", c), Action::PrintString(s) => write!(f, "{}", s), Action::Control(c) => f.write_char(*c as u8 as char), Action::DeviceControl(c) => c.fmt(f), Action::OperatingSystemCommand(osc) => osc.fmt(f), Action::CSI(csi) => csi.fmt(f), Action::Esc(esc) => esc.fmt(f), Action::Sixel(sixel) => sixel.fmt(f), Action::XtGetTcap(names) => { write!(f, "\x1bP+q")?; for (i, name) in names.iter().enumerate() { if i > 0 { write!(f, ";")?; } for &b in name.as_bytes() { write!(f, "{:x}", b)?; } } Ok(()) } Action::KittyImage(img) => img.fmt(f), } } } /// A fully parsed DCS sequence. /// The parser emits these for byte/intermediate sequences that are /// known to be relatively short and self contained (eg: DECRQSS) /// as opposed to larger ones like Sixel (which is parsed separately), /// or long lived terminal modes such as the TMUX CC protocol. #[derive(Clone, PartialEq, Eq)] pub struct ShortDeviceControl { /// Integer parameter values pub params: Vec, /// Intermediate bytes to refine the control pub intermediates: Vec, /// The final byte pub byte: u8, /// The data prior to the string terminator pub data: Vec, } impl std::fmt::Debug for ShortDeviceControl { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { write!( fmt, "ShortDeviceControl(params: {:?}, intermediates: [", &self.params )?; for b in &self.intermediates { write!(fmt, "{:?} 0x{:x}, ", *b as char, *b)?; } write!( fmt, "], byte: {:?} 0x{:x}, data=[", self.byte as char, self.byte )?; for b in &self.data { write!(fmt, "{:?} 0x{:x}, ", *b as char, *b)?; } write!(fmt, ")") } } impl Display for ShortDeviceControl { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { write!(f, "\x1bP")?; for (idx, p) in self.params.iter().enumerate() { if idx > 0 { write!(f, ";")?; } write!(f, "{}", p)?; } for b in &self.intermediates { f.write_char(*b as char)?; } f.write_char(self.byte as char)?; for b in &self.data { f.write_char(*b as char)?; } write!(f, "\x1b\\") } } #[derive(Clone, PartialEq, Eq)] pub struct EnterDeviceControlMode { /// The final byte in the DCS mode pub byte: u8, pub params: Vec, pub intermediates: Vec, /// if true, more than two intermediates arrived and the /// remaining data was ignored pub ignored_extra_intermediates: bool, } impl std::fmt::Debug for EnterDeviceControlMode { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { write!( fmt, "EnterDeviceControlMode(params: {:?}, intermediates: [", &self.params )?; for b in &self.intermediates { write!(fmt, "{:?} 0x{:x}, ", *b as char, *b)?; } write!( fmt, "], byte: {:?} 0x{:x}, ignored_extra_intermediates={})", self.byte as char, self.byte, self.ignored_extra_intermediates ) } } #[derive(Clone, PartialEq, Eq)] pub enum DeviceControlMode { /// Identify device control mode from the encoded parameters. /// This mode is activated and must remain active until /// `Exit` is observed. While the mode is /// active, data is made available to the device mode via /// the `Data` variant. Enter(Box), /// Exit the current device control mode Exit, /// Data for the device mode to consume Data(u8), /// A self contained (Enter, Data*, Exit) sequence ShortDeviceControl(Box), /// Tmux parsed events TmuxEvents(Box>), } impl Display for DeviceControlMode { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Self::Enter(mode) => { write!(f, "\x1bP")?; for (idx, p) in mode.params.iter().enumerate() { if idx > 0 { write!(f, ";")?; } write!(f, "{}", p)?; } for b in &mode.intermediates { f.write_char(*b as char)?; } f.write_char(mode.byte as char) } // We don't need to emit a sequence for the Exit, as we're // followed by eg: StringTerminator Self::Exit => Ok(()), Self::Data(c) => f.write_char(*c as char), Self::ShortDeviceControl(s) => s.fmt(f), Self::TmuxEvents(_) => write!(f, "tmux event"), } } } impl std::fmt::Debug for DeviceControlMode { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { match self { Self::Enter(mode) => write!(fmt, "Enter({:?})", mode), Self::Exit => write!(fmt, "Exit"), Self::Data(b) => write!(fmt, "Data({:?} 0x{:x})", *b as char, *b), Self::ShortDeviceControl(s) => write!(fmt, "ShortDeviceControl({:?})", s), Self::TmuxEvents(_) => write!(fmt, "tmux event"), } } } /// See #[derive(Debug, Clone, PartialEq, Eq)] pub struct Sixel { /// Specifies the numerator for the pixel aspect ratio pub pan: i64, /// Specifies the denominator for the pixel aspect ratio pub pad: i64, /// How wide the image is, in pixels pub pixel_width: Option, /// How tall the image is, in pixels, pub pixel_height: Option, /// When true, pixels with 0 value are left at their /// present color, otherwise, they are set to the background /// color. pub background_is_transparent: bool, /// The horizontal spacing between pixels pub horizontal_grid_size: Option, /// The sixel data pub data: Vec, } impl Sixel { /// Returns the width, height of the image pub fn dimensions(&self) -> (u32, u32) { if let (Some(w), Some(h)) = (self.pixel_width, self.pixel_height) { return (w, h); } // Compute it by evaluating the sixel data let mut max_x = 0; let mut max_y = 0; let mut x: u32 = 0; let mut rows: u32 = 1; for d in &self.data { match d { SixelData::Data(_) => { max_y = max_y.max(rows * 6); x = x.saturating_add(1); max_x = max_x.max(x); } SixelData::Repeat { repeat_count, .. } => { max_y = max_y.max(rows * 6); x = x.saturating_add(*repeat_count); max_x = max_x.max(x); } SixelData::SelectColorMapEntry(_) | SixelData::DefineColorMapRGB { .. } | SixelData::DefineColorMapHSL { .. } => {} SixelData::NewLine => { max_x = max_x.max(x); x = 0; rows = rows.saturating_add(1); } SixelData::CarriageReturn => { max_x = max_x.max(x); x = 0; } } } (max_x, max_y) } } impl Display for Sixel { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { if self.pixel_width.is_some() { write!( f, "\x1bP;{}{}q\"{};{};{};{}", if self.background_is_transparent { 1 } else { 0 }, match self.horizontal_grid_size { Some(h) => format!(";{}", h), None => "".to_string(), }, self.pan, self.pad, self.pixel_width.unwrap_or(0), self.pixel_height.unwrap_or(0) )?; } else { write!( f, "\x1bP{};{}{}q", match (self.pan, self.pad) { (2, 1) => 0, (5, 1) => 2, (3, 1) => 3, (1, 1) => 7, _ => { eprintln!("bad pad/pan combo: {:?}", self); return Err(std::fmt::Error); } }, if self.background_is_transparent { 1 } else { 0 }, match self.horizontal_grid_size { Some(h) => format!(";{}", h), None => "".to_string(), }, )?; } for d in &self.data { d.fmt(f)?; } // The sixel data itself doesn't contain the ST // write!(f, "\x1b\\")?; Ok(()) } } /// A decoded 6-bit sixel value. /// Each sixel represents a six-pixel tall bitmap where /// the least significant bit is the topmost bit. pub type SixelValue = u8; #[derive(Debug, Clone, PartialEq, Eq)] pub enum SixelData { /// A single sixel value Data(SixelValue), /// Run-length encoding; allows repeating a sixel value /// the specified number of times Repeat { repeat_count: u32, data: SixelValue }, /// Set the specified color map entry to the specified /// linear RGB color value DefineColorMapRGB { color_number: u16, rgb: crate::color::RgbColor, }, DefineColorMapHSL { color_number: u16, /// 0 to 360 degrees hue_angle: u16, /// 0 to 100 lightness: u8, /// 0 to 100 saturation: u8, }, /// Select the numbered color from the color map entry SelectColorMapEntry(u16), /// Move the x position to the left page border of the /// current sixel line. CarriageReturn, /// Move the x position to the left page border and /// the y position down to the next sixel line. NewLine, } impl Display for SixelData { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match self { Self::Data(value) => write!(f, "{}", (value + 0x3f) as char), Self::Repeat { repeat_count, data } => { write!(f, "!{}{}", repeat_count, (data + 0x3f) as char) } Self::DefineColorMapRGB { color_number, rgb } => { let LinearRgba(r, g, b, _) = rgb.to_linear_tuple_rgba(); write!( f, "#{};2;{};{};{}", color_number, (r * 100.) as u8, (g * 100.) as u8, (b * 100.0) as u8 ) } Self::DefineColorMapHSL { color_number, hue_angle, lightness, saturation, } => write!( f, "#{};1;{};{};{}", color_number, hue_angle, lightness, saturation ), Self::SelectColorMapEntry(n) => write!(f, "#{}", n), Self::CarriageReturn => write!(f, "$"), Self::NewLine => write!(f, "-"), } } } /// C0 or C1 control codes #[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive)] #[repr(u8)] pub enum ControlCode { Null = 0, StartOfHeading = 1, StartOfText = 2, EndOfText = 3, EndOfTransmission = 4, Enquiry = 5, Acknowledge = 6, Bell = 7, Backspace = 8, HorizontalTab = b'\t', LineFeed = b'\n', VerticalTab = 0xb, FormFeed = 0xc, CarriageReturn = b'\r', ShiftOut = 0xe, ShiftIn = 0xf, DataLinkEscape = 0x10, DeviceControlOne = 0x11, DeviceControlTwo = 0x12, DeviceControlThree = 0x13, DeviceControlFour = 0x14, NegativeAcknowledge = 0x15, SynchronousIdle = 0x16, EndOfTransmissionBlock = 0x17, Cancel = 0x18, EndOfMedium = 0x19, Substitute = 0x1a, Escape = 0x1b, FileSeparator = 0x1c, GroupSeparator = 0x1d, RecordSeparator = 0x1e, UnitSeparator = 0x1f, // C1 8-bit values BPH = 0x82, NBH = 0x83, IND = 0x84, NEL = 0x85, SSA = 0x86, ESA = 0x87, HTS = 0x88, HTJ = 0x89, VTS = 0x8a, PLD = 0x8b, PLU = 0x8c, RI = 0x8d, SS2 = 0x8e, SS3 = 0x8f, DCS = 0x90, PU1 = 0x91, PU2 = 0x92, STS = 0x93, CCH = 0x94, MW = 0x95, SPA = 0x96, EPA = 0x97, SOS = 0x98, SCI = 0x9a, CSI = 0x9b, ST = 0x9c, OSC = 0x9d, PM = 0x9e, APC = 0x9f, } /// A helper type to avoid accidentally tripping over problems with /// 1-based values in escape sequences. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct OneBased { value: u32, } impl OneBased { pub fn new(value: u32) -> Self { debug_assert!( value != 0, "programmer error: deliberately assigning zero to a OneBased" ); Self { value } } pub fn from_zero_based(value: u32) -> Self { Self { value: value + 1 } } /// Map a value from an escape sequence parameter. /// 0 is equivalent to 1 pub fn from_esc_param(v: &CsiParam) -> Result { match v { CsiParam::Integer(v) if *v == 0 => Ok(Self { value: num_traits::one(), }), CsiParam::Integer(v) if *v > 0 && *v <= i64::from(u32::max_value()) => { Ok(Self { value: *v as u32 }) } _ => Err(()), } } /// Map a value from an escape sequence parameter. /// 0 is equivalent to max_value. pub fn from_esc_param_with_big_default(v: &CsiParam) -> Result { match v { CsiParam::Integer(v) if *v == 0 => Ok(Self { value: u32::max_value(), }), CsiParam::Integer(v) if *v > 0 && *v <= i64::from(u32::max_value()) => { Ok(Self { value: *v as u32 }) } _ => Err(()), } } /// Map a value from an optional escape sequence parameter pub fn from_optional_esc_param(o: Option<&CsiParam>) -> Result { Self::from_esc_param(o.unwrap_or(&CsiParam::Integer(1))) } /// Return the underlying value as a 0-based value pub fn as_zero_based(self) -> u32 { self.value.saturating_sub(1) } pub fn as_one_based(self) -> u32 { self.value } } impl Display for OneBased { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { self.value.fmt(f) } } termwiz-0.22.0/src/escape/osc.rs000064400000000000000000001756601046102023000146060ustar 00000000000000use crate::color::SrgbaTuple; pub use crate::hyperlink::Hyperlink; use crate::{bail, ensure, Result}; use base64::Engine; use bitflags::bitflags; use num_derive::*; use num_traits::FromPrimitive; use ordered_float::NotNan; use std::collections::HashMap; use std::fmt::{Display, Error as FmtError, Formatter, Result as FmtResult}; use std::str; use std::str::FromStr; #[derive(Debug, Clone, PartialEq)] pub enum ColorOrQuery { Color(SrgbaTuple), Query, } impl Display for ColorOrQuery { fn fmt(&self, f: &mut Formatter) -> FmtResult { match self { ColorOrQuery::Query => write!(f, "?"), ColorOrQuery::Color(c) => write!(f, "{}", c.to_x11_16bit_rgb_string()), } } } #[derive(Debug, Clone, PartialEq)] pub enum OperatingSystemCommand { SetIconNameAndWindowTitle(String), SetWindowTitle(String), SetWindowTitleSun(String), SetIconName(String), SetIconNameSun(String), SetHyperlink(Option), ClearSelection(Selection), QuerySelection(Selection), SetSelection(Selection, String), SystemNotification(String), ITermProprietary(ITermProprietary), FinalTermSemanticPrompt(FinalTermSemanticPrompt), ChangeColorNumber(Vec), ChangeDynamicColors(DynamicColorNumber, Vec), ResetDynamicColor(DynamicColorNumber), CurrentWorkingDirectory(String), ResetColors(Vec), RxvtExtension(Vec), Unspecified(Vec>), } #[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive)] #[repr(u8)] pub enum DynamicColorNumber { TextForegroundColor = 10, TextBackgroundColor = 11, TextCursorColor = 12, MouseForegroundColor = 13, MouseBackgroundColor = 14, TektronixForegroundColor = 15, TektronixBackgroundColor = 16, HighlightBackgroundColor = 17, TektronixCursorColor = 18, HighlightForegroundColor = 19, } #[derive(Debug, Clone, PartialEq)] pub struct ChangeColorPair { pub palette_index: u8, pub color: ColorOrQuery, } bitflags! { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Selection :u16{ const NONE = 0; const CLIPBOARD = 1<<1; const PRIMARY=1<<2; const SELECT=1<<3; const CUT0=1<<4; const CUT1=1<<5; const CUT2=1<<6; const CUT3=1<<7; const CUT4=1<<8; const CUT5=1<<9; const CUT6=1<<10; const CUT7=1<<11; const CUT8=1<<12; const CUT9=1<<13; } } impl Selection { fn try_parse(buf: &[u8]) -> Result { if buf == b"" { Ok(Selection::SELECT | Selection::CUT0) } else { let mut s = Selection::NONE; for c in buf { s |= match c { b'c' => Selection::CLIPBOARD, b'p' => Selection::PRIMARY, b's' => Selection::SELECT, b'0' => Selection::CUT0, b'1' => Selection::CUT1, b'2' => Selection::CUT2, b'3' => Selection::CUT3, b'4' => Selection::CUT4, b'5' => Selection::CUT5, b'6' => Selection::CUT6, b'7' => Selection::CUT7, b'8' => Selection::CUT8, b'9' => Selection::CUT9, _ => bail!("invalid selection {:?}", buf), } } Ok(s) } } } impl Display for Selection { fn fmt(&self, f: &mut Formatter) -> FmtResult { macro_rules! item { ($variant:ident, $s:expr) => { if (*self & Selection::$variant) != Selection::NONE { write!(f, $s)?; } }; } item!(CLIPBOARD, "c"); item!(PRIMARY, "p"); item!(SELECT, "s"); item!(CUT0, "0"); item!(CUT1, "1"); item!(CUT2, "2"); item!(CUT3, "3"); item!(CUT4, "4"); item!(CUT5, "5"); item!(CUT6, "6"); item!(CUT7, "7"); item!(CUT8, "8"); item!(CUT9, "9"); Ok(()) } } impl OperatingSystemCommand { pub fn parse(osc: &[&[u8]]) -> Self { Self::internal_parse(osc).unwrap_or_else(|err| { let mut vec = Vec::new(); for slice in osc { vec.push(slice.to_vec()); } log::trace!( "OSC internal parse err: {}, track as Unspecified {:?}", err, vec ); OperatingSystemCommand::Unspecified(vec) }) } fn parse_selection(osc: &[&[u8]]) -> Result { if osc.len() == 2 { Selection::try_parse(osc[1]).map(OperatingSystemCommand::ClearSelection) } else if osc.len() == 3 && osc[2] == b"?" { Selection::try_parse(osc[1]).map(OperatingSystemCommand::QuerySelection) } else if osc.len() == 3 { let sel = Selection::try_parse(osc[1])?; let bytes = base64_decode(osc[2])?; let s = String::from_utf8(bytes)?; Ok(OperatingSystemCommand::SetSelection(sel, s)) } else { bail!("unhandled OSC 52: {:?}", osc); } } fn parse_reset_colors(osc: &[&[u8]]) -> Result { let mut colors = vec![]; let mut iter = osc.iter(); iter.next(); // skip the command word that we already know is present while let Some(index) = iter.next() { if index.is_empty() { continue; } let index: u8 = str::from_utf8(index)?.parse()?; colors.push(index); } Ok(OperatingSystemCommand::ResetColors(colors)) } fn parse_change_color_number(osc: &[&[u8]]) -> Result { let mut pairs = vec![]; let mut iter = osc.iter(); iter.next(); // skip the command word that we already know is present while let (Some(index), Some(spec)) = (iter.next(), iter.next()) { let index: u8 = str::from_utf8(index)?.parse()?; let spec = str::from_utf8(spec)?; let spec = if spec == "?" { ColorOrQuery::Query } else { ColorOrQuery::Color( SrgbaTuple::from_str(spec) .map_err(|()| format!("invalid color spec {:?}", spec))?, ) }; pairs.push(ChangeColorPair { palette_index: index, color: spec, }); } Ok(OperatingSystemCommand::ChangeColorNumber(pairs)) } fn parse_reset_dynamic_color_number(idx: u8) -> Result { let which_color: DynamicColorNumber = FromPrimitive::from_u8(idx) .ok_or_else(|| format!("osc code is not a valid DynamicColorNumber!?"))?; Ok(OperatingSystemCommand::ResetDynamicColor(which_color)) } fn parse_change_dynamic_color_number(idx: u8, osc: &[&[u8]]) -> Result { let which_color: DynamicColorNumber = FromPrimitive::from_u8(idx) .ok_or_else(|| format!("osc code is not a valid DynamicColorNumber!?"))?; let mut colors = vec![]; for spec in osc.iter().skip(1) { if spec == b"?" { colors.push(ColorOrQuery::Query); } else { let spec = str::from_utf8(spec)?; colors.push(ColorOrQuery::Color( SrgbaTuple::from_str(spec) .map_err(|()| format!("invalid color spec {:?}", spec))?, )); } } Ok(OperatingSystemCommand::ChangeDynamicColors( which_color, colors, )) } fn internal_parse(osc: &[&[u8]]) -> Result { ensure!(!osc.is_empty(), "no params"); let p1str = String::from_utf8_lossy(osc[0]); if p1str.is_empty() { bail!("zero length osc"); } // Ugh, this is to handle "OSC ltitle" which is a legacyish // OSC for encoding a window title change request. These days // OSC 2 is preferred for this purpose, but we need to support // generating and parsing the legacy form because it is the // response for the CSI ReportWindowTitle. // So, for non-numeric OSCs, we look up the prefix and use that. // This only works if the non-numeric OSC code has length == 1. let osc_code = if !p1str.chars().nth(0).unwrap().is_ascii_digit() && osc.len() == 1 { let mut p1 = String::new(); p1.push(p1str.chars().nth(0).unwrap()); OperatingSystemCommandCode::from_code(&p1) } else { OperatingSystemCommandCode::from_code(&p1str) } .ok_or_else(|| format!("unknown code"))?; macro_rules! single_string { ($variant:ident) => {{ if osc.len() != 2 { bail!("wrong param count"); } let s = String::from_utf8(osc[1].to_vec())?; Ok(OperatingSystemCommand::$variant(s)) }}; } macro_rules! single_title_string { ($variant:ident) => {{ if osc.len() < 2 { bail!("wrong param count"); } let mut s = String::from_utf8(osc[1].to_vec())?; for i in 2..osc.len() { s = [s, String::from_utf8(osc[i].to_vec())?].join(";"); } Ok(OperatingSystemCommand::$variant(s)) }}; } use self::OperatingSystemCommandCode::*; match osc_code { SetIconNameAndWindowTitle => single_title_string!(SetIconNameAndWindowTitle), SetWindowTitle => single_title_string!(SetWindowTitle), SetWindowTitleSun => Ok(OperatingSystemCommand::SetWindowTitleSun( p1str[1..].to_owned(), )), SetIconName => single_title_string!(SetIconName), SetIconNameSun => Ok(OperatingSystemCommand::SetIconNameSun( p1str[1..].to_owned(), )), SetHyperlink => Ok(OperatingSystemCommand::SetHyperlink(Hyperlink::parse(osc)?)), ManipulateSelectionData => Self::parse_selection(osc), SystemNotification => single_string!(SystemNotification), SetCurrentWorkingDirectory => single_string!(CurrentWorkingDirectory), ITermProprietary => { self::ITermProprietary::parse(osc).map(OperatingSystemCommand::ITermProprietary) } RxvtProprietary => { let mut vec = vec![]; for slice in osc.iter().skip(1) { vec.push(String::from_utf8_lossy(slice).to_string()); } Ok(OperatingSystemCommand::RxvtExtension(vec)) } FinalTermSemanticPrompt => self::FinalTermSemanticPrompt::parse(osc) .map(OperatingSystemCommand::FinalTermSemanticPrompt), ChangeColorNumber => Self::parse_change_color_number(osc), ResetColors => Self::parse_reset_colors(osc), ResetSpecialColor | ResetTextForegroundColor | ResetTextBackgroundColor | ResetTextCursorColor | ResetMouseForegroundColor | ResetMouseBackgroundColor | ResetTektronixForegroundColor | ResetTektronixBackgroundColor | ResetHighlightColor | ResetTektronixCursorColor | ResetHighlightForegroundColor => Self::parse_reset_dynamic_color_number( p1str.parse::().unwrap().saturating_sub(100), ), SetTextForegroundColor | SetTextBackgroundColor | SetTextCursorColor | SetMouseForegroundColor | SetMouseBackgroundColor | SetTektronixForegroundColor | SetTektronixBackgroundColor | SetHighlightBackgroundColor | SetTektronixCursorColor | SetHighlightForegroundColor => { Self::parse_change_dynamic_color_number(p1str.parse::().unwrap(), osc) } osc_code => bail!("{:?} not impl", osc_code), } } } macro_rules! osc_entries { ($( $( #[doc=$doc:expr] )* $label:ident = $value:expr ),* $(,)?) => { #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, Hash, Copy)] pub enum OperatingSystemCommandCode { $( $( #[doc=$doc] )* $label, )* } impl OscMap { fn new() -> Self { let mut code_to_variant = HashMap::new(); let mut variant_to_code = HashMap::new(); use OperatingSystemCommandCode::*; $( code_to_variant.insert($value, $label); variant_to_code.insert($label, $value); )* Self { code_to_variant, variant_to_code, } } } }; } osc_entries!( SetIconNameAndWindowTitle = "0", SetIconName = "1", SetWindowTitle = "2", SetXWindowProperty = "3", ChangeColorNumber = "4", ChangeSpecialColorNumber = "5", /// iTerm2 ChangeTitleTabColor = "6", SetCurrentWorkingDirectory = "7", /// See https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda SetHyperlink = "8", /// iTerm2 SystemNotification = "9", SetTextForegroundColor = "10", SetTextBackgroundColor = "11", SetTextCursorColor = "12", SetMouseForegroundColor = "13", SetMouseBackgroundColor = "14", SetTektronixForegroundColor = "15", SetTektronixBackgroundColor = "16", SetHighlightBackgroundColor = "17", SetTektronixCursorColor = "18", SetHighlightForegroundColor = "19", SetLogFileName = "46", SetFont = "50", EmacsShell = "51", ManipulateSelectionData = "52", ResetColors = "104", ResetSpecialColor = "105", ResetTextForegroundColor = "110", ResetTextBackgroundColor = "111", ResetTextCursorColor = "112", ResetMouseForegroundColor = "113", ResetMouseBackgroundColor = "114", ResetTektronixForegroundColor = "115", ResetTektronixBackgroundColor = "116", ResetHighlightColor = "117", ResetTektronixCursorColor = "118", ResetHighlightForegroundColor = "119", RxvtProprietary = "777", FinalTermSemanticPrompt = "133", ITermProprietary = "1337", /// Here the "Sun" suffix comes from the table in /// /// that lays out various window related escape sequences. SetWindowTitleSun = "l", SetIconNameSun = "L", ); struct OscMap { code_to_variant: HashMap<&'static str, OperatingSystemCommandCode>, variant_to_code: HashMap, } lazy_static::lazy_static! { static ref OSC_MAP: OscMap = OscMap::new(); } impl OperatingSystemCommandCode { fn from_code(code: &str) -> Option { OSC_MAP.code_to_variant.get(code).copied() } fn as_code(self) -> &'static str { OSC_MAP.variant_to_code.get(&self).unwrap() } } impl Display for OperatingSystemCommand { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "\x1b]")?; macro_rules! single_string { ($variant:ident, $s:expr) => {{ let code = OperatingSystemCommandCode::$variant.as_code(); match OperatingSystemCommandCode::$variant { OperatingSystemCommandCode::SetWindowTitleSun | OperatingSystemCommandCode::SetIconNameSun => { // For the legacy sun terminals, the `l` and `L` OSCs are // not separated by `;`. write!(f, "{}{}", code, $s)?; } _ => { // In the common case, the OSC is numeric and is separated // from the rest of the string write!(f, "{};{}", code, $s)?; } } }}; } use self::OperatingSystemCommand::*; match self { SetIconNameAndWindowTitle(title) => single_string!(SetIconNameAndWindowTitle, title), SetWindowTitle(title) => single_string!(SetWindowTitle, title), SetWindowTitleSun(title) => single_string!(SetWindowTitleSun, title), SetIconName(title) => single_string!(SetIconName, title), SetIconNameSun(title) => single_string!(SetIconNameSun, title), SetHyperlink(Some(link)) => link.fmt(f)?, SetHyperlink(None) => write!(f, "8;;")?, RxvtExtension(params) => write!(f, "777;{}", params.join(";"))?, Unspecified(v) => { for (idx, item) in v.iter().enumerate() { if idx > 0 { write!(f, ";")?; } f.write_str(&String::from_utf8_lossy(item))?; } } ClearSelection(s) => write!(f, "52;{}", s)?, QuerySelection(s) => write!(f, "52;{};?", s)?, SetSelection(s, val) => write!(f, "52;{};{}", s, base64_encode(val))?, SystemNotification(s) => write!(f, "9;{}", s)?, ITermProprietary(i) => i.fmt(f)?, FinalTermSemanticPrompt(i) => i.fmt(f)?, ResetColors(colors) => { write!(f, "104")?; for c in colors { write!(f, ";{}", c)?; } } ChangeColorNumber(specs) => { write!(f, "4;")?; for pair in specs { write!(f, "{};{}", pair.palette_index, pair.color)? } } ChangeDynamicColors(first_color, colors) => { write!(f, "{}", *first_color as u8)?; for color in colors { write!(f, ";{}", color)? } } ResetDynamicColor(color) => { write!(f, "{}", 100 + *color as u8)?; } CurrentWorkingDirectory(s) => write!(f, "7;{}", s)?, }; // Use the longer form ST as neovim doesn't like the BEL version write!(f, "\x1b\\")?; Ok(()) } } /// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md #[derive(Debug, Clone, PartialEq, Eq)] pub enum FinalTermClick { /// Allow motion only within the single input line using left/right arrow keys Line, /// Allow moving between multiple lines of input using left/right arrow keys MultipleLine, /// Allow left/right and conservative up/down arrow motion ConservativeVertical, /// Allow left/right and up/down motion, and the line editor ensures that /// there are no spurious trailing spaces at ends of lines and that vertical /// motion across shorter lines causes some horizontal cursor motion. SmartVertical, } impl std::convert::TryFrom<&str> for FinalTermClick { type Error = crate::Error; fn try_from(s: &str) -> Result { match s { "line" => Ok(Self::Line), "m" => Ok(Self::MultipleLine), "v" => Ok(Self::ConservativeVertical), "w" => Ok(Self::SmartVertical), _ => bail!("invalid FinalTermClick {}", s), } } } impl Display for FinalTermClick { fn fmt(&self, f: &mut Formatter) -> FmtResult { match self { Self::Line => write!(f, "line"), Self::MultipleLine => write!(f, "m"), Self::ConservativeVertical => write!(f, "v"), Self::SmartVertical => write!(f, "w"), } } } /// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md #[derive(Debug, Clone, PartialEq, Eq)] pub enum FinalTermPromptKind { /// A normal left side primary prompt Initial, /// A right-aligned prompt RightSide, /// A continuation prompt for an input that can be edited Continuation, /// A continuation prompt where the input cannot be edited Secondary, } impl Default for FinalTermPromptKind { fn default() -> Self { Self::Initial } } impl std::convert::TryFrom<&str> for FinalTermPromptKind { type Error = crate::Error; fn try_from(s: &str) -> Result { match s { "i" => Ok(Self::Initial), "r" => Ok(Self::RightSide), "c" => Ok(Self::Continuation), "s" => Ok(Self::Secondary), _ => bail!("invalid FinalTermPromptKind {}", s), } } } impl Display for FinalTermPromptKind { fn fmt(&self, f: &mut Formatter) -> FmtResult { match self { Self::Initial => write!(f, "i"), Self::RightSide => write!(f, "r"), Self::Continuation => write!(f, "c"), Self::Secondary => write!(f, "s"), } } } /// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md #[derive(Debug, Clone, PartialEq, Eq)] pub enum FinalTermSemanticPrompt { /// Do a "fresh line"; if the cursor is at the left margin then /// do nothing, otherwise perform the equivalent of "\r\n" FreshLine, /// Do a "fresh line" as above and then place the terminal into /// prompt mode; the output between now and the next marker is /// considered part of the prompt. FreshLineAndStartPrompt { aid: Option, cl: Option, }, /// Denote the end of a command output and then perform FreshLine MarkEndOfCommandWithFreshLine { aid: Option, cl: Option, }, /// Start a prompt StartPrompt(FinalTermPromptKind), /// Mark the end of a prompt and the start of the user input. /// The terminal considers all subsequent output to be "user input" /// until the next semantic marker. MarkEndOfPromptAndStartOfInputUntilNextMarker, /// Mark the end of a prompt and the start of the user input. /// The terminal considers all subsequent output to be "user input" /// until the end of the line. MarkEndOfPromptAndStartOfInputUntilEndOfLine, MarkEndOfInputAndStartOfOutput { aid: Option, }, /// Indicates the result of the command CommandStatus { status: i32, aid: Option, }, } impl FinalTermSemanticPrompt { fn parse(osc: &[&[u8]]) -> Result { ensure!(osc.len() > 1, "not enough args"); let param = String::from_utf8_lossy(osc[1]); macro_rules! single { ($variant:ident, $text:expr) => { if osc.len() == 2 && param == $text { return Ok(FinalTermSemanticPrompt::$variant); } }; } single!(FreshLine, "L"); single!(MarkEndOfPromptAndStartOfInputUntilNextMarker, "B"); single!(MarkEndOfPromptAndStartOfInputUntilEndOfLine, "I"); let mut params = HashMap::new(); use std::convert::TryInto; for s in osc.iter().skip(if param == "D" { 3 } else { 2 }) { if let Some(equal) = s.iter().position(|c| *c == b'=') { let key = &s[..equal]; let value = &s[equal + 1..]; params.insert(str::from_utf8(key)?, str::from_utf8(value)?); } else if !s.is_empty() { bail!("malformed FinalTermSemanticPrompt"); } } if param == "A" { return Ok(Self::FreshLineAndStartPrompt { aid: params.get("aid").map(|&s| s.to_owned()), cl: match params.get("cl") { Some(&cl) => Some(cl.try_into()?), None => None, }, }); } if param == "C" { return Ok(Self::MarkEndOfInputAndStartOfOutput { aid: params.get("aid").map(|&s| s.to_owned()), }); } if param == "D" { let status = match osc.get(2).map(|&p| p) { Some(s) => match str::from_utf8(s) { Ok(s) => s.parse().unwrap_or(0), _ => 0, }, _ => 0, }; return Ok(Self::CommandStatus { status, aid: params.get("aid").map(|&s| s.to_owned()), }); } if param == "N" { return Ok(Self::MarkEndOfCommandWithFreshLine { aid: params.get("aid").map(|&s| s.to_owned()), cl: match params.get("cl") { Some(&cl) => Some(cl.try_into()?), None => None, }, }); } if param == "P" { return Ok(Self::StartPrompt(match params.get("k") { Some(&cl) => cl.try_into()?, None => FinalTermPromptKind::default(), })); } bail!( "invalid FinalTermSemanticPrompt p1:{:?}, params:{:?}", param, params ); } } impl Display for FinalTermSemanticPrompt { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "133;")?; match self { Self::FreshLine => write!(f, "L")?, Self::FreshLineAndStartPrompt { aid, cl } => { write!(f, "A")?; if let Some(aid) = aid { write!(f, ";aid={}", aid)?; } if let Some(cl) = cl { write!(f, ";cl={}", cl)?; } } Self::MarkEndOfCommandWithFreshLine { aid, cl } => { write!(f, "N")?; if let Some(aid) = aid { write!(f, ";aid={}", aid)?; } if let Some(cl) = cl { write!(f, ";cl={}", cl)?; } } Self::StartPrompt(kind) => { write!(f, "P;k={}", kind)?; } Self::MarkEndOfPromptAndStartOfInputUntilNextMarker => write!(f, "B")?, Self::MarkEndOfPromptAndStartOfInputUntilEndOfLine => write!(f, "I")?, Self::MarkEndOfInputAndStartOfOutput { aid } => { write!(f, "C")?; if let Some(aid) = aid { write!(f, ";aid={}", aid)?; } } Self::CommandStatus { status, aid: Some(aid), } => { write!(f, "D;{};err={};aid={}", status, status, aid)?; } Self::CommandStatus { status, aid: None } => { write!(f, "D;{}", status)?; } } Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum ITermProprietary { /// The "Set Mark" command allows you to record a location and then jump back to it later SetMark, /// To bring iTerm2 to the foreground StealFocus, /// To erase the scrollback history ClearScrollback, /// To inform iTerm2 of the current directory to help semantic history CurrentDir(String), /// To change the session's profile on the fly SetProfile(String), /// Currently defined values for the string parameter are "rule", "find", "font" /// or an empty string. iTerm2 will go into paste mode until EndCopy is received. CopyToClipboard(String), /// Ends CopyToClipboard mode in iTerm2. EndCopy, /// The boolean should be yes or no. This shows or hides the cursor guide HighlightCursorLine(bool), /// Request that the terminal send a ReportCellSize response RequestCellSize, /// The response to RequestCellSize. The height and width are the dimensions /// of a cell measured in points according to the docs, but in practice, they /// are actually pixels. /// If scale is_some(), the width and height will be multiplied by scale to /// get the true device dimensions ReportCellSize { height_pixels: NotNan, width_pixels: NotNan, scale: Option>, }, /// Place a string in the systems pasteboard Copy(String), /// Each iTerm2 session has internal variables (as described in /// ). This escape sequence reports /// a variable's value. The response is another ReportVariable. ReportVariable(String), /// User-defined variables may be set with the following escape sequence SetUserVar { name: String, value: String, }, SetBadgeFormat(String), /// Download file data from the application. File(Box), /// Configure unicode version UnicodeVersion(ITermUnicodeVersionOp), } #[derive(Debug, Clone, PartialEq, Eq)] pub enum ITermUnicodeVersionOp { Set(u8), Push(Option), Pop(Option), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ITermFileData { /// file name pub name: Option, /// size of the data in bytes; this is used by iterm to show progress /// while waiting for the rest of the payload pub size: Option, /// width to render pub width: ITermDimension, /// height to render pub height: ITermDimension, /// if true, preserve aspect ratio when fitting to width/height pub preserve_aspect_ratio: bool, /// if true, attempt to display in the terminal rather than downloading to /// the users download directory pub inline: bool, /// if true, do not move the cursor pub do_not_move_cursor: bool, /// The data to transfer pub data: Vec, } impl ITermFileData { fn parse(osc: &[&[u8]]) -> Result { let mut params = HashMap::new(); // Unfortunately, the encoding for the file download data is // awkward to fit in the conventional OSC data that our parser // expects at a higher level. // We have a mix of '=', ';' and ':' separated keys and values, // and a number of them are optional. // ESC ] 1337 ; File = [optional arguments] : base-64 encoded file contents ^G let mut data = None; let last = osc.len() - 1; for (idx, s) in osc.iter().enumerate().skip(1) { let param = if idx == 1 { if s.len() >= 5 { // skip over File= &s[5..] } else { bail!("failed to parse file data; File= not found"); } } else { s }; let param = if idx == last { // The final argument contains `:base64`, so look for that if let Some(colon) = param.iter().position(|c| *c == b':') { data = Some(base64_decode(¶m[colon + 1..])?); ¶m[..colon] } else { // If we don't find the colon in the last piece, we've // got nothing useful bail!("failed to parse file data; no colon found"); } } else { param }; // eg: `File=;size=1234` case. if param.is_empty() { continue; } // look for k=v in param if let Some(equal) = param.iter().position(|c| *c == b'=') { let key = ¶m[..equal]; let value = ¶m[equal + 1..]; params.insert(str::from_utf8(key)?, str::from_utf8(value)?); } else if idx != last { bail!("failed to parse file data; no equals found"); } } let name = params .get("name") .and_then(|s| base64_decode(s).ok()) .and_then(|b| String::from_utf8(b).ok()); let size = params.get("size").and_then(|s| s.parse().ok()); let width = params .get("width") .and_then(|s| ITermDimension::parse(s).ok()) .unwrap_or(ITermDimension::Automatic); let height = params .get("height") .and_then(|s| ITermDimension::parse(s).ok()) .unwrap_or(ITermDimension::Automatic); let preserve_aspect_ratio = params .get("preserveAspectRatio") .map(|s| *s != "0") .unwrap_or(true); let inline = params.get("inline").map(|s| *s != "0").unwrap_or(false); let do_not_move_cursor = params .get("doNotMoveCursor") .map(|s| *s != "0") .unwrap_or(false); let data = data.ok_or_else(|| format!("didn't set data"))?; Ok(Self { name, size, width, height, preserve_aspect_ratio, inline, do_not_move_cursor, data, }) } } impl Display for ITermFileData { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "File")?; let mut sep = "="; let emit_sep = |sep, f: &mut Formatter| -> std::result::Result<&str, FmtError> { write!(f, "{}", sep)?; Ok(";") }; if let Some(size) = self.size { sep = emit_sep(sep, f)?; write!(f, "size={}", size)?; } if let Some(ref name) = self.name { sep = emit_sep(sep, f)?; write!(f, "name={}", base64_encode(name))?; } if self.width != ITermDimension::Automatic { sep = emit_sep(sep, f)?; write!(f, "width={}", self.width)?; } if self.height != ITermDimension::Automatic { sep = emit_sep(sep, f)?; write!(f, "height={}", self.height)?; } if !self.preserve_aspect_ratio { sep = emit_sep(sep, f)?; write!(f, "preserveAspectRatio=0")?; } if self.inline { sep = emit_sep(sep, f)?; write!(f, "inline=1")?; } if self.do_not_move_cursor { sep = emit_sep(sep, f)?; write!(f, "doNotMoveCursor=1")?; } // Ensure that we emit a sep if we didn't already. // It will still be set to '=' in that case. if sep == "=" { write!(f, "=")?; } write!(f, ":{}", base64_encode(&self.data))?; Ok(()) } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ITermDimension { Automatic, Cells(i64), Pixels(i64), Percent(i64), } impl Default for ITermDimension { fn default() -> Self { Self::Automatic } } impl Display for ITermDimension { fn fmt(&self, f: &mut Formatter) -> FmtResult { use self::ITermDimension::*; match self { Automatic => write!(f, "auto"), Cells(n) => write!(f, "{}", n), Pixels(n) => write!(f, "{}px", n), Percent(n) => write!(f, "{}%", n), } } } impl std::str::FromStr for ITermDimension { type Err = crate::Error; fn from_str(s: &str) -> Result { ITermDimension::parse(s) } } impl ITermDimension { fn parse(s: &str) -> Result { if s == "auto" { Ok(ITermDimension::Automatic) } else if s.ends_with("px") { let s = &s[..s.len() - 2]; let num = s.parse()?; Ok(ITermDimension::Pixels(num)) } else if s.ends_with('%') { let s = &s[..s.len() - 1]; let num = s.parse()?; Ok(ITermDimension::Percent(num)) } else { let num = s.parse()?; Ok(ITermDimension::Cells(num)) } } /// Convert the dimension into a number of pixels based on the provided /// size of a cell and number of cells in that dimension. /// Returns None for the Automatic variant. pub fn to_pixels(&self, cell_size: usize, num_cells: usize) -> Option { match self { ITermDimension::Automatic => None, ITermDimension::Cells(n) => Some((*n).max(0) as usize * cell_size), ITermDimension::Pixels(n) => Some((*n).max(0) as usize), ITermDimension::Percent(n) => Some( (((*n).max(0).min(100) as f32 / 100.0) * num_cells as f32 * cell_size as f32) as usize, ), } } } impl ITermProprietary { #[cfg_attr( feature = "cargo-clippy", allow(clippy::cyclomatic_complexity, clippy::cognitive_complexity) )] fn parse(osc: &[&[u8]]) -> Result { // iTerm has a number of different styles of OSC parameter // encodings, which makes this section of code a bit gnarly. ensure!(osc.len() > 1, "not enough args"); let param = String::from_utf8_lossy(osc[1]); let mut iter = param.splitn(2, '='); let keyword = iter.next().ok_or_else(|| format!("bad params"))?; let p1 = iter.next(); macro_rules! single { ($variant:ident, $text:expr) => { if osc.len() == 2 && keyword == $text && p1.is_none() { return Ok(ITermProprietary::$variant); } }; } macro_rules! one_str { ($variant:ident, $text:expr) => { if osc.len() == 2 && keyword == $text { if let Some(p1) = p1 { return Ok(ITermProprietary::$variant(p1.into())); } } }; } macro_rules! const_arg { ($variant:ident, $text:expr, $value:expr, $res:expr) => { if osc.len() == 2 && keyword == $text { if let Some(p1) = p1 { if p1 == $value { return Ok(ITermProprietary::$variant($res)); } } } }; } single!(SetMark, "SetMark"); single!(StealFocus, "StealFocus"); single!(ClearScrollback, "ClearScrollback"); single!(EndCopy, "EndCopy"); single!(RequestCellSize, "ReportCellSize"); const_arg!(HighlightCursorLine, "HighlightCursorLine", "yes", true); const_arg!(HighlightCursorLine, "HighlightCursorLine", "no", false); one_str!(CurrentDir, "CurrentDir"); one_str!(SetProfile, "SetProfile"); one_str!(CopyToClipboard, "CopyToClipboard"); let p1_empty = match p1 { Some(p1) if p1 == "" => true, None => true, _ => false, }; if osc.len() == 3 && keyword == "Copy" && p1_empty { return Ok(ITermProprietary::Copy(String::from_utf8(base64_decode( osc[2], )?)?)); } if osc.len() == 3 && keyword == "SetBadgeFormat" && p1_empty { return Ok(ITermProprietary::SetBadgeFormat(String::from_utf8( base64_decode(osc[2])?, )?)); } if osc.len() == 3 && keyword == "ReportCellSize" && p1.is_some() { if let Some(p1) = p1 { return Ok(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(p1.parse()?)?, width_pixels: NotNan::new(String::from_utf8_lossy(osc[2]).parse()?)?, scale: None, }); } } if osc.len() == 4 && keyword == "ReportCellSize" && p1.is_some() { if let Some(p1) = p1 { return Ok(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(p1.parse()?)?, width_pixels: NotNan::new(String::from_utf8_lossy(osc[2]).parse()?)?, scale: Some(NotNan::new(String::from_utf8_lossy(osc[3]).parse()?)?), }); } } if osc.len() == 2 && keyword == "SetUserVar" { if let Some(p1) = p1 { let mut iter = p1.splitn(2, '='); let p1 = iter.next(); let p2 = iter.next(); if let (Some(k), Some(v)) = (p1, p2) { return Ok(ITermProprietary::SetUserVar { name: k.to_string(), value: String::from_utf8(base64_decode(v)?)?, }); } } } if osc.len() == 2 && keyword == "UnicodeVersion" { if let Some(p1) = p1 { let mut iter = p1.splitn(2, ' '); let keyword = iter.next(); let label = iter.next(); if let Some("push") = keyword { return Ok(ITermProprietary::UnicodeVersion( ITermUnicodeVersionOp::Push(label.map(|s| s.to_string())), )); } if let Some("pop") = keyword { return Ok(ITermProprietary::UnicodeVersion( ITermUnicodeVersionOp::Pop(label.map(|s| s.to_string())), )); } if let Ok(n) = p1.parse::() { return Ok(ITermProprietary::UnicodeVersion( ITermUnicodeVersionOp::Set(n), )); } } } if keyword == "File" { return Ok(ITermProprietary::File(Box::new(ITermFileData::parse(osc)?))); } bail!("ITermProprietary {:?}", osc); } } /// base64::encode is deprecated, so make a less frustrating helper pub(crate) fn base64_encode>(s: T) -> String { base64::engine::general_purpose::STANDARD.encode(s) } /// base64::decode is deprecated, so make a less frustrating helper pub(crate) fn base64_decode>( s: T, ) -> std::result::Result, base64::DecodeError> { use base64::engine::{GeneralPurpose, GeneralPurposeConfig}; GeneralPurpose::new( &base64::alphabet::STANDARD, GeneralPurposeConfig::new().with_decode_allow_trailing_bits(true), ) .decode(s) } impl Display for ITermProprietary { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "1337;")?; use self::ITermProprietary::*; match self { SetMark => write!(f, "SetMark")?, StealFocus => write!(f, "StealFocus")?, ClearScrollback => write!(f, "ClearScrollback")?, CurrentDir(s) => write!(f, "CurrentDir={}", s)?, SetProfile(s) => write!(f, "SetProfile={}", s)?, CopyToClipboard(s) => write!(f, "CopyToClipboard={}", s)?, EndCopy => write!(f, "EndCopy")?, HighlightCursorLine(yes) => { write!(f, "HighlightCursorLine={}", if *yes { "yes" } else { "no" })? } RequestCellSize => write!(f, "ReportCellSize")?, ReportCellSize { height_pixels, width_pixels, scale: None, } => write!(f, "ReportCellSize={height_pixels:.1};{width_pixels:.1}")?, ReportCellSize { height_pixels, width_pixels, scale: Some(scale), } => write!( f, "ReportCellSize={height_pixels:.1};{width_pixels:.1};{scale:.1}", )?, Copy(s) => write!(f, "Copy=;{}", base64_encode(s))?, ReportVariable(s) => write!(f, "ReportVariable={}", base64_encode(s))?, SetUserVar { name, value } => { write!(f, "SetUserVar={}={}", name, base64_encode(value))? } SetBadgeFormat(s) => write!(f, "SetBadgeFormat={}", base64_encode(s))?, File(file) => file.fmt(f)?, UnicodeVersion(ITermUnicodeVersionOp::Set(n)) => write!(f, "UnicodeVersion={}", n)?, UnicodeVersion(ITermUnicodeVersionOp::Push(Some(label))) => { write!(f, "UnicodeVersion=push {}", label)? } UnicodeVersion(ITermUnicodeVersionOp::Push(None)) => write!(f, "UnicodeVersion=push")?, UnicodeVersion(ITermUnicodeVersionOp::Pop(Some(label))) => { write!(f, "UnicodeVersion=pop {}", label)? } UnicodeVersion(ITermUnicodeVersionOp::Pop(None)) => write!(f, "UnicodeVersion=pop")?, } Ok(()) } } #[cfg(test)] mod test { use super::*; fn encode(osc: &OperatingSystemCommand) -> String { format!("{}", osc) } fn parse(osc: &[&str], expected: &str) -> OperatingSystemCommand { let mut v = Vec::new(); for s in osc { v.push(s.as_bytes()); } let result = OperatingSystemCommand::parse(&v); assert_eq!(encode(&result), expected); result } #[test] fn reset_colors() { assert_eq!( parse(&["104"], "\x1b]104\x1b\\"), OperatingSystemCommand::ResetColors(vec![]) ); assert_eq!( parse(&["104", ""], "\x1b]104\x1b\\"), OperatingSystemCommand::ResetColors(vec![]) ); assert_eq!( parse(&["104", "1"], "\x1b]104;1\x1b\\"), OperatingSystemCommand::ResetColors(vec![1]) ); assert_eq!( parse(&["112"], "\x1b]112\x1b\\"), OperatingSystemCommand::ResetDynamicColor(DynamicColorNumber::TextCursorColor) ); } #[test] fn title() { assert_eq!( parse(&["0", "hello"], "\x1b]0;hello\x1b\\"), OperatingSystemCommand::SetIconNameAndWindowTitle("hello".into()) ); assert_eq!( parse(&["0", "hello \u{1f915}"], "\x1b]0;hello \u{1f915}\x1b\\"), OperatingSystemCommand::SetIconNameAndWindowTitle("hello \u{1f915}".into()) ); assert_eq!( parse( &["0", "hello \u{1f915}", " world"], "\x1b]0;hello \u{1f915}; world\x1b\\" ), OperatingSystemCommand::SetIconNameAndWindowTitle("hello \u{1f915}; world".into()) ); // Missing title parameter assert_eq!( parse(&["0"], "\x1b]0\x1b\\"), OperatingSystemCommand::Unspecified(vec![b"0".to_vec()]) ); // parsing legacy sun OSC; why bother? This format is used in response // to the CSI ReportWindowTitle sequence assert_eq!( parse(&["lhello"], "\x1b]lhello\x1b\\"), OperatingSystemCommand::SetWindowTitleSun("hello".into()) ); } #[test] fn hyperlink() { assert_eq!( parse( &["8", "id=foo", "http://example.com"], "\x1b]8;id=foo;http://example.com\x1b\\" ), OperatingSystemCommand::SetHyperlink(Some(Hyperlink::new_with_id( "http://example.com", "foo" ))) ); assert_eq!( parse(&["8", "", ""], "\x1b]8;;\x1b\\"), OperatingSystemCommand::SetHyperlink(None) ); // too many params assert_eq!( parse(&["8", "1", "2"], "\x1b]8;1;2\x1b\\"), OperatingSystemCommand::Unspecified(vec![b"8".to_vec(), b"1".to_vec(), b"2".to_vec()]) ); assert_eq!( Hyperlink::parse(&[b"8", b"", b"x"]).unwrap(), Some(Hyperlink::new("x")) ); } #[test] fn finalterm() { assert_eq!( parse(&["133", "L"], "\x1b]133;L\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::FreshLine) ); assert_eq!( parse(&["133", "C"], "\x1b]133;C\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfInputAndStartOfOutput { aid: None } ) ); assert_eq!( parse(&["133", "C", "aid=123"], "\x1b]133;C;aid=123\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfInputAndStartOfOutput { aid: Some("123".to_string()) } ) ); assert_eq!( parse(&["133", "D", "1"], "\x1b]133;D;1\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 1, aid: None } ) ); assert_eq!( parse(&["133", "D", "0"], "\x1b]133;D;0\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 0, aid: None } ) ); assert_eq!( parse( &["133", "D", "0", "aid=23"], "\x1b]133;D;0;err=0;aid=23\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 0, aid: Some("23".to_owned()) } ) ); assert_eq!( parse( &["133", "D", "1", "aid=23"], "\x1b]133;D;1;err=1;aid=23\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::CommandStatus { status: 1, aid: Some("23".to_owned()) } ) ); assert_eq!( parse(&["133", "P"], "\x1b]133;P;k=i\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Initial )) ); assert_eq!( parse(&["133", "P", "k=i"], "\x1b]133;P;k=i\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Initial )) ); assert_eq!( parse(&["133", "P", "k=r"], "\x1b]133;P;k=r\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::RightSide )) ); assert_eq!( parse(&["133", "P", "k=c"], "\x1b]133;P;k=c\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Continuation )) ); assert_eq!( parse(&["133", "P", "k=s"], "\x1b]133;P;k=s\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt(FinalTermSemanticPrompt::StartPrompt( FinalTermPromptKind::Secondary )) ); assert_eq!( parse(&["133", "B"], "\x1b]133;B\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfPromptAndStartOfInputUntilNextMarker ), ); assert_eq!( parse(&["133", "I"], "\x1b]133;I\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfPromptAndStartOfInputUntilEndOfLine ), ); assert_eq!( parse(&["133", "N"], "\x1b]133;N\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: None, cl: None, } ), ); assert_eq!( parse(&["133", "N", "aid=12"], "\x1b]133;N;aid=12\x1b\\"), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: None, } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=line"], "\x1b]133;N;aid=12;cl=line\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::Line), } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=m"], "\x1b]133;N;aid=12;cl=m\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::MultipleLine), } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=v"], "\x1b]133;N;aid=12;cl=v\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::ConservativeVertical), } ), ); assert_eq!( parse( &["133", "N", "aid=12", "cl=w"], "\x1b]133;N;aid=12;cl=w\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::MarkEndOfCommandWithFreshLine { aid: Some("12".to_owned()), cl: Some(FinalTermClick::SmartVertical), } ), ); assert_eq!( parse( &["133", "A", "aid=12", "cl=w"], "\x1b]133;A;aid=12;cl=w\x1b\\" ), OperatingSystemCommand::FinalTermSemanticPrompt( FinalTermSemanticPrompt::FreshLineAndStartPrompt { aid: Some("12".to_owned()), cl: Some(FinalTermClick::SmartVertical), } ), ); } #[test] fn rxvt() { assert_eq!( parse( &["777", "notify", "alert user", "the tea is ready"], "\x1b]777;notify;alert user;the tea is ready\x1b\\" ), OperatingSystemCommand::RxvtExtension(vec![ "notify".into(), "alert user".into(), "the tea is ready".into() ]), ) } #[test] fn iterm() { assert_eq!( parse(&["1337", "SetMark"], "\x1b]1337;SetMark\x1b\\"), OperatingSystemCommand::ITermProprietary(ITermProprietary::SetMark) ); assert_eq!( parse( &["1337", "CurrentDir=woot"], "\x1b]1337;CurrentDir=woot\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::CurrentDir("woot".into())) ); assert_eq!( parse( &["1337", "HighlightCursorLine=yes"], "\x1b]1337;HighlightCursorLine=yes\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::HighlightCursorLine(true)) ); assert_eq!( parse( &["1337", "Copy=", "aGVsbG8="], "\x1b]1337;Copy=;aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::Copy("hello".into())) ); assert_eq!( parse( &["1337", "SetUserVar=foo=aGVsbG8="], "\x1b]1337;SetUserVar=foo=aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::SetUserVar { name: "foo".into(), value: "hello".into() }) ); assert_eq!( parse( &["1337", "SetBadgeFormat=", "aGVsbG8="], "\x1b]1337;SetBadgeFormat=aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::SetBadgeFormat( "hello".into() )) ); assert_eq!( parse( &["1337", "ReportCellSize=12.0", "15.5"], "\x1b]1337;ReportCellSize=12.0;15.5\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(12.0).unwrap(), width_pixels: NotNan::new(15.5).unwrap(), scale: None, }) ); assert_eq!( parse( &["1337", "ReportCellSize=12.0", "15.5", "2.0"], "\x1b]1337;ReportCellSize=12.0;15.5;2.0\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::ReportCellSize { height_pixels: NotNan::new(12.0).unwrap(), width_pixels: NotNan::new(15.5).unwrap(), scale: Some(NotNan::new(2.0).unwrap()), }) ); assert_eq!( parse( &["1337", "File=:aGVsbG8="], "\x1b]1337;File=:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: None, size: None, width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l:aGVsbG8="], "\x1b]1337;File=name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: None, width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=size=123", "name=bXluYW1l:aGVsbG8="], "\x1b]1337;File=size=123;name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(123), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &[ "1337", "File=name=bXluYW1l", "width=auto", "size=234:aGVsbG8=" ], "\x1b]1337;File=size=234;name=bXluYW1l:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "width=5", "size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l;width=5:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &[ "1337", "File=name=bXluYW1l", "width=5", "height=10%", "size=234:aGVsbG8=" ], "\x1b]1337;File=size=234;name=bXluYW1l;width=5;height=10%:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Percent(10), preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "preserveAspectRatio=0", "width=5", "inline=1", "height=10px","size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l;width=5;height=10px;preserveAspectRatio=0;inline=1:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Pixels(10), preserve_aspect_ratio: false, inline: true, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ); assert_eq!( parse( &["1337", "File=name=bXluYW1l", "preserveAspectRatio=0", "width=5", "inline=1", "doNotMoveCursor=1", "height=10px","size=234:aGVsbG8="], "\x1b]1337;File=size=234;name=bXluYW1l;width=5;height=10px;preserveAspectRatio=0;inline=1;doNotMoveCursor=1:aGVsbG8=\x1b\\" ), OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: Some("myname".into()), size: Some(234), width: ITermDimension::Cells(5), height: ITermDimension::Pixels(10), preserve_aspect_ratio: false, inline: true, do_not_move_cursor: true, data: b"hello".to_vec(), } ))) ); } } termwiz-0.22.0/src/escape/parser/mod.rs000064400000000000000000001156111046102023000160630ustar 00000000000000#![allow(clippy::many_single_char_names)] use crate::escape::{ Action, DeviceControlMode, EnterDeviceControlMode, Esc, OperatingSystemCommand, ShortDeviceControl, CSI, }; use crate::tmux_cc::Event; use log::error; use num_traits::FromPrimitive; use std::borrow::BorrowMut; use std::cell::RefCell; use vtparse::{CsiParam, VTActor, VTParser}; mod sixel; use sixel::SixelBuilder; #[derive(Default)] struct GetTcapBuilder { current: Vec, names: Vec, } impl GetTcapBuilder { fn flush(&mut self) { let decoded = hex::decode(&self.current) .map(|s| String::from_utf8_lossy(&s).to_string()) .unwrap_or_else(|_| String::from_utf8_lossy(&self.current).to_string()); self.names.push(decoded); self.current.clear(); } pub fn push(&mut self, data: u8) { if data == b';' { self.flush(); } else { self.current.push(data); } } pub fn finish(mut self) -> Vec { self.flush(); self.names } } #[derive(Default)] struct ParseState { sixel: Option, dcs: Option, get_tcap: Option, tmux_state: Option>, } /// The `Parser` struct holds the state machine that is used to decode /// a sequence of bytes. The byte sequence can be streaming into the /// state machine. /// You can either have the parser trigger a callback as `Action`s are /// decoded, or have it return a `Vec` holding zero-or-more /// decoded actions. pub struct Parser { state_machine: VTParser, state: RefCell, } impl Default for Parser { fn default() -> Self { Self::new() } } impl Parser { pub fn new() -> Self { Self { state_machine: VTParser::new(), state: RefCell::new(Default::default()), } } /// advance with tmux parser, bypass VTParse fn advance_tmux_bytes(&mut self, bytes: &[u8]) -> anyhow::Result> { let parser_state = self.state.borrow(); let tmux_state = parser_state.tmux_state.as_ref().unwrap(); let mut tmux_parser = tmux_state.borrow_mut(); return tmux_parser.advance_bytes(bytes); } pub fn parse(&mut self, bytes: &[u8], mut callback: F) { let is_tmux_mode: bool = self.state.borrow().tmux_state.is_some(); if is_tmux_mode { match self.advance_tmux_bytes(bytes) { Ok(tmux_events) => { callback(Action::DeviceControl(DeviceControlMode::TmuxEvents( Box::new(tmux_events), ))); } Err(err_buf) => { // capture bytes cannot be parsed let unparsed_str = err_buf.to_string().to_owned(); let mut parser_state = self.state.borrow_mut(); parser_state.tmux_state = None; let mut perform = Performer { callback: &mut callback, state: &mut parser_state, }; self.state_machine .parse(unparsed_str.as_bytes(), &mut perform); } } } else { let mut perform = Performer { callback: &mut callback, state: &mut self.state.borrow_mut(), }; self.state_machine.parse(bytes, &mut perform); } } /// A specialized version of the parser that halts after recognizing the /// first action from the stream of bytes. The return value is the action /// that was recognized and the length of the byte stream that was fed in /// to the parser to yield it. pub fn parse_first(&mut self, bytes: &[u8]) -> Option<(Action, usize)> { // holds the first action. We need to use RefCell to deal with // the Performer holding a reference to this via the closure we set up. let first = RefCell::new(None); // will hold the iterator index when we emit an action let mut first_idx = None; { let mut perform = Performer { callback: &mut |action| { // capture the action, but only if it is the first one // we've seen. Preserve an existing one if any. if first.borrow().is_some() { return; } *first.borrow_mut() = Some(action); }, state: &mut self.state.borrow_mut(), }; for (idx, b) in bytes.iter().enumerate() { self.state_machine.parse_byte(*b, &mut perform); if first.borrow().is_some() { // if we recognized an action, record the iterator index first_idx = Some(idx); break; } } } match (first.into_inner(), first_idx) { // if we matched an action, transform the iterator index to // the length of the string that was consumed (+1) (Some(action), Some(idx)) => Some((action, idx + 1)), _ => None, } } pub fn parse_as_vec(&mut self, bytes: &[u8]) -> Vec { let mut result = Vec::new(); self.parse(bytes, |action| result.push(action)); result } /// Similar to `parse_first` but collects all actions from the first sequence, /// and guarantees the state machine is in the ground state at the end of this /// sequence. pub fn parse_first_as_vec(&mut self, bytes: &[u8]) -> Option<(Vec, usize)> { let mut actions = Vec::new(); let mut first_idx = None; for (idx, b) in bytes.iter().enumerate() { self.state_machine.parse_byte( *b, &mut Performer { callback: &mut |action| actions.push(action), state: &mut self.state.borrow_mut(), }, ); if !actions.is_empty() && self.state_machine.is_ground() { // if we recognized any actions, record the iterator index first_idx = Some(idx); break; } } first_idx.map(|idx| (actions, idx + 1)) } } struct Performer<'a, F: FnMut(Action) + 'a> { callback: &'a mut F, state: &'a mut ParseState, } fn is_short_dcs(intermediates: &[u8], byte: u8) -> bool { if intermediates == &[b'$'] && byte == b'q' { // DECRQSS true } else { false } } impl<'a, F: FnMut(Action)> VTActor for Performer<'a, F> { fn print(&mut self, c: char) { (self.callback)(Action::Print(c)); } fn execute_c0_or_c1(&mut self, byte: u8) { match FromPrimitive::from_u8(byte) { Some(code) => (self.callback)(Action::Control(code)), None => error!( "impossible C0/C1 control code {:?} 0x{:x} was dropped", byte as char, byte ), } } fn apc_dispatch(&mut self, data: Vec) { if let Some(img) = super::KittyImage::parse_apc(&data) { (self.callback)(Action::KittyImage(Box::new(img))) } else { log::trace!("Ignoring APC data: {:?}", String::from_utf8_lossy(&data)); } } fn dcs_hook( &mut self, byte: u8, params: &[i64], intermediates: &[u8], ignored_extra_intermediates: bool, ) { self.state.sixel.take(); self.state.get_tcap.take(); self.state.dcs.take(); if byte == b'q' && intermediates.is_empty() && !ignored_extra_intermediates { self.state.sixel.replace(SixelBuilder::new(params)); } else if byte == b'q' && intermediates == [b'+'] { self.state.get_tcap.replace(GetTcapBuilder::default()); } else if !ignored_extra_intermediates && is_short_dcs(intermediates, byte) { self.state.dcs.replace(ShortDeviceControl { params: params.to_vec(), intermediates: intermediates.to_vec(), byte, data: vec![], }); } else { if byte == b'p' && params == [1000] { // into tmux_cc mode self.state.borrow_mut().tmux_state = Some(RefCell::new(crate::tmux_cc::Parser::new())); } (self.callback)(Action::DeviceControl(DeviceControlMode::Enter(Box::new( EnterDeviceControlMode { byte, params: params.to_vec(), intermediates: intermediates.to_vec(), ignored_extra_intermediates, }, )))); } } fn dcs_put(&mut self, data: u8) { if let Some(dcs) = self.state.dcs.as_mut() { dcs.data.push(data); } else if let Some(sixel) = self.state.sixel.as_mut() { sixel.push(data); } else if let Some(tcap) = self.state.get_tcap.as_mut() { tcap.push(data); } else { if let Some(tmux_state) = &self.state.tmux_state { let mut tmux_parser = tmux_state.borrow_mut(); match tmux_parser.advance_byte(data) { Ok(optional_events) => { if let Some(tmux_event) = optional_events { (self.callback)(Action::DeviceControl(DeviceControlMode::TmuxEvents( Box::new(vec![tmux_event]), ))); } } Err(_) => { drop(tmux_parser); self.state.tmux_state = None; // drop tmux state } } } else { (self.callback)(Action::DeviceControl(DeviceControlMode::Data(data))); } } } fn dcs_unhook(&mut self) { if let Some(dcs) = self.state.dcs.take() { (self.callback)(Action::DeviceControl( DeviceControlMode::ShortDeviceControl(Box::new(dcs)), )); } else if let Some(mut sixel) = self.state.sixel.take() { sixel.finish(); (self.callback)(Action::Sixel(Box::new(sixel.sixel))); } else if let Some(tcap) = self.state.get_tcap.take() { (self.callback)(Action::XtGetTcap(tcap.finish())); } else { (self.callback)(Action::DeviceControl(DeviceControlMode::Exit)); } } fn osc_dispatch(&mut self, osc: &[&[u8]]) { let osc = OperatingSystemCommand::parse(osc); (self.callback)(Action::OperatingSystemCommand(Box::new(osc))); } fn csi_dispatch(&mut self, params: &[CsiParam], parameters_truncated: bool, control: u8) { for action in CSI::parse(params, parameters_truncated, control as char) { (self.callback)(Action::CSI(action)); } } fn esc_dispatch( &mut self, _params: &[i64], intermediates: &[u8], _ignored_extra_intermediates: bool, control: u8, ) { // It doesn't appear to be possible for params.len() > 1 due to the way // that the state machine in vte functions. As such, it also seems to // be impossible for ignored_extra_intermediates to be true too. (self.callback)(Action::Esc(Esc::parse( if intermediates.len() == 1 { Some(intermediates[0]) } else { None }, control, ))); } } #[cfg(test)] mod test { use super::*; use crate::cell::{Intensity, Underline}; use crate::color::ColorSpec; use crate::escape::csi::{ CharacterPath, DecPrivateMode, DecPrivateModeCode, Device, Mode, Sgr, Window, XtSmGraphics, XtSmGraphicsItem, XtermKeyModifierResource, }; use crate::escape::{EscCode, OneBased}; use k9::assert_equal as assert_eq; use std::io::Write; fn encode(seq: &Vec) -> String { let mut res = Vec::new(); for s in seq { write!(res, "{}", s).unwrap(); } String::from_utf8(res).unwrap() } // #[test] fn osc_bel_parse_first_as_vec() { let data = b"\x1b]8;;http://example.com\x07example\x1b]8;;\x07"; let mut p = Parser::new(); let mut offset = 0; let mut actions = vec![]; while let Some((mut act, off)) = p.parse_first_as_vec(&data[offset..]) { actions.append(&mut act); offset += off; } k9::snapshot!( actions, r#" [ OperatingSystemCommand( SetHyperlink( Some( Hyperlink { params: {}, uri: "http://example.com", implicit: false, }, ), ), ), Print( 'e', ), Print( 'x', ), Print( 'a', ), Print( 'm', ), Print( 'p', ), Print( 'l', ), Print( 'e', ), OperatingSystemCommand( SetHyperlink( None, ), ), ] "# ); } // #[test] fn osc_st_parse_first_as_vec() { // This string includes an assitional trailing ST sequence which should // be parsed separately. let data = b"\x1b]8;;http://example.com\x1b\\example\x1b]8;;\x1b\\\x1b\\"; let mut p = Parser::new(); let mut offset = 0; let mut actions = vec![]; let mut slices = vec![]; while let Some((act, off)) = p.parse_first_as_vec(&data[offset..]) { // Store each vec of actions so we can confirm that the ST sequence is bundled with the // OSC SetHyperlink command. actions.push(act); // Additionally store all non-single-character slices so we can confirm these are split // correctly. if off > 1 { slices.push(&data[offset..offset + off]); } offset += off; } assert_eq!( slices, vec![ b"\x1b]8;;http://example.com\x1b\\".as_slice(), b"\x1b]8;;\x1b\\".as_slice(), b"\x1b\\".as_slice() ] ); k9::snapshot!( actions, r#" [ [ OperatingSystemCommand( SetHyperlink( Some( Hyperlink { params: {}, uri: "http://example.com", implicit: false, }, ), ), ), Esc( Code( StringTerminator, ), ), ], [ Print( 'e', ), ], [ Print( 'x', ), ], [ Print( 'a', ), ], [ Print( 'm', ), ], [ Print( 'p', ), ], [ Print( 'l', ), ], [ Print( 'e', ), ], [ OperatingSystemCommand( SetHyperlink( None, ), ), Esc( Code( StringTerminator, ), ), ], [ Esc( Code( StringTerminator, ), ), ], ] "# ); } #[test] fn basic_parse() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"hello"); assert_eq!( vec![ Action::Print('h'), Action::Print('e'), Action::Print('l'), Action::Print('l'), Action::Print('o'), ], actions ); assert_eq!(encode(&actions), "hello"); } #[test] fn basic_bold() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[1mb"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('b'), ], actions ); assert_eq!(encode(&actions), "\x1b[1mb"); } #[test] fn basic_bold_italic() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[1;3mb"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Italic(true))), Action::Print('b'), ], actions ); assert_eq!(encode(&actions), "\x1b[1m\x1b[3mb"); } #[test] fn fancy_underline() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[4:0;4:1;4:2;4:3;4:4;4:5mb"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Underline(Underline::None))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Single))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Double))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Curly))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Dotted))), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Dashed))), Action::Print('b'), ], actions ); assert_eq!( encode(&actions), "\x1b[24m\x1b[4m\x1b[21m\x1b[4:3m\x1b[4:4m\x1b[4:5mb" ); } #[test] fn true_color() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[38:2::128:64:192mw"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (128, 64, 192).into() )))), Action::Print('w'), ], actions ); assert_eq!(encode(&actions), "\u{1b}[38:2::128:64:192mw"); let actions = p.parse_as_vec(b"\x1b[38:2:0:255:0mw"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (0, 255, 0).into() )))), Action::Print('w'), ], actions ); let actions = p.parse_as_vec(b"\x1b[38:6:0:255:0:127mw"); assert_eq!( vec![ Action::CSI(CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor( (0, 255, 0, 127).into() )))), Action::Print('w'), ], actions ); } #[test] fn basic_osc() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b]0;hello\x07"); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::SetIconNameAndWindowTitle("hello".to_owned()), ))], actions ); assert_eq!(encode(&actions), "\x1b]0;hello\x1b\\"); let actions = p.parse_as_vec(b"\x1b]532534523;hello\x07"); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::Unspecified(vec![b"532534523".to_vec(), b"hello".to_vec()]), ))], actions ); assert_eq!(encode(&actions), "\x1b]532534523;hello\x1b\\"); } #[test] fn test_emoji_title_osc() { let input = "\x1b]0;\u{1f915}\x07"; let mut p = Parser::new(); let actions = p.parse_as_vec(input.as_bytes()); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::SetIconNameAndWindowTitle("\u{1f915}".to_owned()), ))], actions ); assert_eq!(encode(&actions), "\x1b]0;\u{1f915}\x1b\\"); } #[test] fn basic_esc() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1bH"); assert_eq!( vec![Action::Esc(Esc::Code(EscCode::HorizontalTabSet))], actions ); assert_eq!(encode(&actions), "\x1bH"); let actions = p.parse_as_vec(b"\x1b%H"); assert_eq!( vec![Action::Esc(Esc::Unspecified { intermediate: Some(b'%'), control: b'H', })], actions ); assert_eq!(encode(&actions), "\x1b%H"); } #[test] fn soft_reset() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b[!p"); assert_eq!( vec![Action::CSI(CSI::Device(Box::new( crate::escape::csi::Device::SoftReset )))], actions ); assert_eq!(encode(&actions), "\x1b[!p"); } #[test] fn tmux_title_escape() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1bktitle\x1b\\"); assert_eq!( vec![ Action::Esc(Esc::Code(EscCode::TmuxTitle)), Action::Print('t'), Action::Print('i'), Action::Print('t'), Action::Print('l'), Action::Print('e'), Action::Esc(Esc::Code(EscCode::StringTerminator)), ], actions ); } fn round_trip_parse(s: &str) -> Vec { let mut p = Parser::new(); let actions = p.parse_as_vec(s.as_bytes()); println!("actions: {:?}", actions); assert_eq!(s, encode(&actions)); actions } fn parse_as(s: &str, expected: &str) -> Vec { let mut p = Parser::new(); let actions = p.parse_as_vec(s.as_bytes()); println!("actions: {:?}", actions); assert_eq!(expected, encode(&actions)); actions } #[test] fn xtgettcap() { assert_eq!( round_trip_parse("\x1bP+q544e\x1b\\"), vec![ Action::XtGetTcap(vec!["TN".to_string()]), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); } #[test] fn bidi_modes() { assert_eq!( round_trip_parse("\x1b[1 k"), vec![Action::CSI(CSI::SelectCharacterPath( CharacterPath::LeftToRightOrTopToBottom, 0 ))] ); assert_eq!( round_trip_parse("\x1b[2;1 k"), vec![Action::CSI(CSI::SelectCharacterPath( CharacterPath::RightToLeftOrBottomToTop, 1 ))] ); } #[test] fn xterm_key() { assert_eq!( round_trip_parse("\x1b[>4;2m"), vec![Action::CSI(CSI::Mode(Mode::XtermKeyMode { resource: XtermKeyModifierResource::OtherKeys, value: Some(2), }))] ); assert_eq!( round_trip_parse("\x1b[>4;m"), vec![Action::CSI(CSI::Mode(Mode::XtermKeyMode { resource: XtermKeyModifierResource::OtherKeys, value: None, }))] ); } #[test] fn window() { assert_eq!( round_trip_parse("\x1b[22;2t"), vec![Action::CSI(CSI::Window(Box::new(Window::PushWindowTitle)))] ); } #[test] fn checksum_area() { assert_eq!( round_trip_parse("\x1b[1;2;3;4;5;6*y"), vec![Action::CSI(CSI::Window(Box::new( Window::ChecksumRectangularArea { request_id: 1, page_number: 2, top: OneBased::new(3), left: OneBased::new(4), bottom: OneBased::new(5), right: OneBased::new(6), } )))] ); } #[test] fn dec_private_modes() { assert_eq!( parse_as("\x1b[?1;1006h", "\x1b[?1h\x1b[?1006h"), vec![ Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ApplicationCursorKeys ),))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::SGRMouse ),))), ] ); } #[test] fn xtsmgraphics() { assert_eq!( round_trip_parse("\x1b[?1;3;256S"), vec![Action::CSI(CSI::Device(Box::new(Device::XtSmGraphics( XtSmGraphics { item: XtSmGraphicsItem::NumberOfColorRegisters, action_or_status: 3, value: vec![256] } ))))] ); } #[test] fn req_attr() { assert_eq!( round_trip_parse("\x1b[=c"), vec![Action::CSI(CSI::Device(Box::new( Device::RequestTertiaryDeviceAttributes )))] ); assert_eq!( round_trip_parse("\x1b[>c"), vec![Action::CSI(CSI::Device(Box::new( Device::RequestSecondaryDeviceAttributes )))] ); } #[test] fn sgr() { assert_eq!( parse_as("\x1b[;4m", "\x1b[0m\x1b[4m"), vec![ Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Underline(Underline::Single))), ] ); } #[test] fn kitty_img() { use crate::escape::apc::*; assert_eq!( round_trip_parse("\x1b_Gf=24,s=10,v=20;aGVsbG8=\x1b\\"), vec![ Action::KittyImage(Box::new(KittyImage::TransmitData { transmit: KittyImageTransmit { format: Some(KittyImageFormat::Rgb), data: KittyImageData::Direct("aGVsbG8=".to_string()), width: Some(10), height: Some(20), image_id: None, image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, verbosity: KittyImageVerbosity::Verbose, })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); assert_eq!( parse_as( "\x1b_Ga=q,s=1,v=1,i=1;YWJjZA==\x1b\\", "\x1b_Ga=q,i=1,s=1,v=1;YWJjZA==\x1b\\" ), vec![ Action::KittyImage(Box::new(KittyImage::Query { transmit: KittyImageTransmit { format: None, data: KittyImageData::Direct("YWJjZA==".to_string()), width: Some(1), height: Some(1), image_id: Some(1), image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); assert_eq!( parse_as( "\x1b_Ga=q,t=f,s=1,v=1,i=2;L3Zhci90bXAvdG1wdGYxd3E4Ym4=\x1b\\", "\x1b_Ga=q,i=2,s=1,t=f,v=1;L3Zhci90bXAvdG1wdGYxd3E4Ym4=\x1b\\" ), vec![ Action::KittyImage(Box::new(KittyImage::Query { transmit: KittyImageTransmit { format: None, data: KittyImageData::File { path: "/var/tmp/tmptf1wq8bn".to_string(), data_offset: None, data_size: None, }, width: Some(1), height: Some(1), image_id: Some(2), image_number: None, compression: KittyImageCompression::None, more_data_follows: false, }, })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ] ); } /* Withdrawn because xterm introduced a conflict: * * #[test] fn dec_private_sgr() { use crate::cell::{VerticalAlign}; assert_eq!( parse_as("\x1b[?0m", "\x1b[0m"), vec![Action::CSI(CSI::Sgr(Sgr::Reset))] ); assert_eq!( parse_as("\x1b[?4m", "\x1b[73m"), vec![Action::CSI(CSI::Sgr(Sgr::VerticalAlign( VerticalAlign::SuperScript )))] ); assert_eq!( parse_as("\x1b[?5m", "\x1b[74m"), vec![Action::CSI(CSI::Sgr(Sgr::VerticalAlign( VerticalAlign::SubScript )))] ); assert_eq!( parse_as("\x1b[?24m", "\x1b[75m"), vec![Action::CSI(CSI::Sgr(Sgr::VerticalAlign( VerticalAlign::BaseLine )))] ); assert_eq!( parse_as("\x1b[?6m", "\x1b[53m"), vec![Action::CSI(CSI::Sgr(Sgr::Overline(true)))] ); assert_eq!( parse_as("\x1b[?26m", "\x1b[55m"), vec![Action::CSI(CSI::Sgr(Sgr::Overline(false)))] ); } */ #[test] fn decset() { assert_eq!( round_trip_parse("\x1b[?23434h"), vec![Action::CSI(CSI::Mode(Mode::SetDecPrivateMode( DecPrivateMode::Unspecified(23434), )))] ); /* { let res = CSI::parse(&[CsiParam::Integer(2026)], &[b'?', b'$'], false, 'p').collect(); assert_eq!(encode(&res), "\x1b[?2026$p"); } */ assert_eq!( round_trip_parse("\x1b[?1l"), vec![Action::CSI(CSI::Mode(Mode::ResetDecPrivateMode( DecPrivateMode::Code(DecPrivateModeCode::ApplicationCursorKeys,) )))] ); assert_eq!( round_trip_parse("\x1b[?25s"), vec![Action::CSI(CSI::Mode(Mode::SaveDecPrivateMode( DecPrivateMode::Code(DecPrivateModeCode::ShowCursor,) )))] ); assert_eq!( round_trip_parse("\x1b[?2004r"), vec![Action::CSI(CSI::Mode(Mode::RestoreDecPrivateMode( DecPrivateMode::Code(DecPrivateModeCode::BracketedPaste), )))] ); assert_eq!( round_trip_parse("\x1b[?12h\x1b[?25h"), vec![ Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::StartBlinkingCursor, )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ShowCursor, )))), ] ); assert_eq!( round_trip_parse("\x1b[?1002h\x1b[?1003h\x1b[?1005h\x1b[?1006h"), vec![ Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ButtonEventMouse, )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::AnyEventMouse, )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::Utf8Mouse )))), Action::CSI(CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::SGRMouse, )))), ] ); } #[test] fn issue_1291() { use crate::escape::osc::{ITermDimension, ITermFileData, ITermProprietary}; let mut p = Parser::new(); // Note the empty k=v pair immediately following `File=` let actions = p.parse_as_vec(b"\x1b]1337;File=;size=234:aGVsbG8=\x07"); assert_eq!( vec![Action::OperatingSystemCommand(Box::new( OperatingSystemCommand::ITermProprietary(ITermProprietary::File(Box::new( ITermFileData { name: None, size: Some(234), width: ITermDimension::Automatic, height: ITermDimension::Automatic, preserve_aspect_ratio: true, inline: false, do_not_move_cursor: false, data: b"hello".to_vec(), } ))) ))], actions ); } #[test] fn itermfiledata_oob() { let mut p = Parser::new(); p.parse_as_vec(b"\x9d1337\xff;File\x1b"); } /// vtparse's MAX_OSC was set too low to fully parse this escape sequence. /// This test verifies that the correct number of actions comes back. #[test] fn dynamic_colors() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1b]4;0;#000000;1;#aa3731;2;#448c27;3;#cb9000;4;#325cc0;5;#7a3e9d;6;#0083b2;7;#f7f7f7;8;#777777;9;#f05050;10;#60cb00;11;#ffbc5d;12;#007acc;13;#e64ce6;14;#00aacb;15;#f7f7f7\x07"); k9::snapshot!( actions, " [ OperatingSystemCommand( ChangeColorNumber( [ ChangeColorPair { palette_index: 0, color: Color( SrgbaTuple( 0.0, 0.0, 0.0, 1.0, ), ), }, ChangeColorPair { palette_index: 1, color: Color( SrgbaTuple( 0.6666667, 0.21568628, 0.19215687, 1.0, ), ), }, ChangeColorPair { palette_index: 2, color: Color( SrgbaTuple( 0.26666668, 0.54901963, 0.15294118, 1.0, ), ), }, ChangeColorPair { palette_index: 3, color: Color( SrgbaTuple( 0.79607844, 0.5647059, 0.0, 1.0, ), ), }, ChangeColorPair { palette_index: 4, color: Color( SrgbaTuple( 0.19607843, 0.36078432, 0.7529412, 1.0, ), ), }, ChangeColorPair { palette_index: 5, color: Color( SrgbaTuple( 0.47843137, 0.24313726, 0.6156863, 1.0, ), ), }, ChangeColorPair { palette_index: 6, color: Color( SrgbaTuple( 0.0, 0.5137255, 0.69803923, 1.0, ), ), }, ChangeColorPair { palette_index: 7, color: Color( SrgbaTuple( 0.96862745, 0.96862745, 0.96862745, 1.0, ), ), }, ChangeColorPair { palette_index: 8, color: Color( SrgbaTuple( 0.46666667, 0.46666667, 0.46666667, 1.0, ), ), }, ChangeColorPair { palette_index: 9, color: Color( SrgbaTuple( 0.9411765, 0.3137255, 0.3137255, 1.0, ), ), }, ChangeColorPair { palette_index: 10, color: Color( SrgbaTuple( 0.3764706, 0.79607844, 0.0, 1.0, ), ), }, ChangeColorPair { palette_index: 11, color: Color( SrgbaTuple( 1.0, 0.7372549, 0.3647059, 1.0, ), ), }, ChangeColorPair { palette_index: 12, color: Color( SrgbaTuple( 0.0, 0.47843137, 0.8, 1.0, ), ), }, ChangeColorPair { palette_index: 13, color: Color( SrgbaTuple( 0.9019608, 0.29803923, 0.9019608, 1.0, ), ), }, ChangeColorPair { palette_index: 14, color: Color( SrgbaTuple( 0.0, 0.6666667, 0.79607844, 1.0, ), ), }, ChangeColorPair { palette_index: 15, color: Color( SrgbaTuple( 0.96862745, 0.96862745, 0.96862745, 1.0, ), ), }, ], ), ), ] " ); } } termwiz-0.22.0/src/escape/parser/sixel.rs000064400000000000000000000234411046102023000164270ustar 00000000000000use crate::color::RgbColor; use crate::escape::{Sixel, SixelData}; const MAX_PARAMS: usize = 5; const MAX_SIXEL_SIZE: usize = 100_000_000; pub struct SixelBuilder { pub sixel: Sixel, params: [i64; MAX_PARAMS], param_no: usize, current_command: u8, } impl SixelBuilder { pub fn new(params: &[i64]) -> Self { let pan = match params.get(0).unwrap_or(&0) { 7 | 8 | 9 => 1, 0 | 1 | 5 | 6 => 2, 3 | 4 => 3, 2 => 5, _ => 2, }; let background_is_transparent = match params.get(1).unwrap_or(&0) { 1 => true, _ => false, }; let horizontal_grid_size = params.get(2).map(|&x| x); Self { sixel: Sixel { pan, pad: 1, pixel_width: None, pixel_height: None, background_is_transparent, horizontal_grid_size, data: vec![], }, param_no: 0, params: [-1; MAX_PARAMS], current_command: 0, } } pub fn push(&mut self, data: u8) { match data { b'$' => { self.finish_command(); self.sixel.data.push(SixelData::CarriageReturn); } b'-' => { self.finish_command(); self.sixel.data.push(SixelData::NewLine); } 0x3f..=0x7e if self.current_command == b'!' => { self.sixel.data.push(SixelData::Repeat { repeat_count: self.params[0] as u32, data: data - 0x3f, }); self.finish_command(); } 0x3f..=0x7e => { self.finish_command(); self.sixel.data.push(SixelData::Data(data - 0x3f)); } b'#' | b'!' | b'"' => { self.finish_command(); self.current_command = data; } b'0'..=b'9' if self.current_command != 0 => { let pos = self.param_no; if pos >= MAX_PARAMS { return; } if self.params[pos] == -1 { self.params[pos] = 0; } self.params[pos] = self.params[pos] .saturating_mul(10) .saturating_add((data - b'0') as i64); } b';' if self.current_command != 0 => { let pos = self.param_no; if pos >= MAX_PARAMS { return; } self.param_no += 1; } _ => { // Invalid; break out of current command self.finish_command(); } } } fn finish_command(&mut self) { match self.current_command { b'#' if self.param_no >= 4 => { // Define a color let color_number = self.params[0] as u16; let system = self.params[1] as u16; let a = self.params[2] as u16; let b = self.params[3] as u8; let c = self.params[4] as u8; if system == 1 { self.sixel.data.push(SixelData::DefineColorMapHSL { color_number, hue_angle: a, lightness: b, saturation: c, }); } else { let r = a as f32 * 255.0 / 100.; let g = b as f32 * 255.0 / 100.; let b = c as f32 * 255.0 / 100.; let rgb = RgbColor::new_8bpc(r as u8, g as u8, b as u8); // FIXME: from linear self.sixel .data .push(SixelData::DefineColorMapRGB { color_number, rgb }); } } b'#' => { // Use a color let color_number = self.params[0] as u16; self.sixel .data .push(SixelData::SelectColorMapEntry(color_number)); } b'"' => { // Set raster attributes let pan = if self.params[0] == -1 { 2 } else { self.params[0] }; let pad = if self.params[1] == -1 { 1 } else { self.params[1] }; let pixel_width = self.params[2]; let pixel_height = self.params[3]; self.sixel.pan = pan; self.sixel.pad = pad; if self.param_no >= 3 { self.sixel.pixel_width.replace(pixel_width as u32); self.sixel.pixel_height.replace(pixel_height as u32); let (size, overflow) = (pixel_width as usize).overflowing_mul(pixel_height as usize); // Ideally we'd just use `try_reserve` here, but that is // nightly Rust only at the time of writing this comment: // if size > MAX_SIXEL_SIZE || overflow { log::error!( "Ignoring sixel data {}x{} because {} bytes \ either overflows or exceeds the max allowed {}", pixel_width, pixel_height, size, MAX_SIXEL_SIZE ); self.sixel.pixel_width = None; self.sixel.pixel_height = None; self.sixel.data.clear(); return; } self.sixel.data.reserve(size); } } _ => {} } self.param_no = 0; self.params = [-1; MAX_PARAMS]; self.current_command = 0; } pub fn finish(&mut self) { self.finish_command(); } } #[cfg(test)] mod test { use super::*; use crate::escape::parser::Parser; use crate::escape::{Action, Esc, EscCode}; use k9::assert_equal as assert_eq; #[test] fn sixel() { let mut p = Parser::new(); let actions = p.parse_as_vec(b"\x1bP1;2;3;q@\x1b\\"); assert_eq!( vec![ Action::Sixel(Box::new(Sixel { pan: 2, pad: 1, pixel_width: None, pixel_height: None, background_is_transparent: false, horizontal_grid_size: Some(3), data: vec![SixelData::Data(1)] })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ], actions ); assert_eq!(format!("{}", actions[0]), "\x1bP0;0;3q@"); // This is the "HI" example from wikipedia let mut p = Parser::new(); let actions = p.parse_as_vec( b"\x1bPq\ #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0\ #1~~@@vv@@~~@@~~$\ #2??}}GG}}??}}??-\ #1!14@\ \x1b\\", ); assert_eq!( format!("{}", actions[0]), "\x1bP0;0q\ #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0\ #1~~@@vv@@~~@@~~$\ #2??}}GG}}??}}??-\ #1!14@" ); use SixelData::*; assert_eq!( vec![ Action::Sixel(Box::new(Sixel { pan: 2, pad: 1, pixel_width: None, pixel_height: None, background_is_transparent: false, horizontal_grid_size: None, data: vec![ DefineColorMapRGB { color_number: 0, rgb: RgbColor::new_8bpc(0, 0, 0) }, DefineColorMapRGB { color_number: 1, rgb: RgbColor::new_8bpc(255, 255, 0) }, DefineColorMapRGB { color_number: 2, rgb: RgbColor::new_8bpc(0, 255, 0) }, SelectColorMapEntry(1), Data(63), Data(63), Data(1), Data(1), Data(55), Data(55), Data(1), Data(1), Data(63), Data(63), Data(1), Data(1), Data(63), Data(63), CarriageReturn, SelectColorMapEntry(2), Data(0), Data(0), Data(62), Data(62), Data(8), Data(8), Data(62), Data(62), Data(0), Data(0), Data(62), Data(62), Data(0), Data(0), NewLine, SelectColorMapEntry(1), Repeat { repeat_count: 14, data: 1 } ] })), Action::Esc(Esc::Code(EscCode::StringTerminator)), ], actions ); } } termwiz-0.22.0/src/hyperlink.rs000064400000000000000000000257421046102023000145620ustar 00000000000000//! Handling hyperlinks. //! This gist describes an escape sequence for explicitly managing hyperlinks: //! //! We use that as the foundation of our hyperlink support, and the game //! plan is to then implicitly enable the hyperlink attribute for a cell //! as we recognize linkable input text during print() processing. use crate::{ensure, format_err, Result}; use fancy_regex::{Captures, Regex}; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::collections::HashMap; use std::fmt::{Display, Error as FmtError, Formatter}; use std::hash::{Hash, Hasher}; use std::ops::Range; use std::sync::Arc; use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq, FromDynamic, ToDynamic)] pub struct Hyperlink { params: HashMap, uri: String, /// If the link was produced by an implicit or matching rule, /// this field will be set to true. implicit: bool, } impl Hyperlink { pub fn uri(&self) -> &str { &self.uri } pub fn compute_shape_hash(&self, hasher: &mut H) { self.uri.hash(hasher); for (k, v) in &self.params { k.hash(hasher); v.hash(hasher); } self.implicit.hash(hasher); } pub fn params(&self) -> &HashMap { &self.params } pub fn new>(uri: S) -> Self { Self { uri: uri.into(), params: HashMap::new(), implicit: false, } } #[inline] pub fn is_implicit(&self) -> bool { self.implicit } pub fn new_implicit>(uri: S) -> Self { Self { uri: uri.into(), params: HashMap::new(), implicit: true, } } pub fn new_with_id, S2: Into>(uri: S, id: S2) -> Self { let mut params = HashMap::new(); params.insert("id".into(), id.into()); Self { uri: uri.into(), params, implicit: false, } } pub fn new_with_params>(uri: S, params: HashMap) -> Self { Self { uri: uri.into(), params, implicit: false, } } pub fn parse(osc: &[&[u8]]) -> Result> { ensure!(osc.len() == 3, "wrong param count"); if osc[1].is_empty() && osc[2].is_empty() { // Clearing current hyperlink Ok(None) } else { let param_str = String::from_utf8(osc[1].to_vec())?; let uri = String::from_utf8(osc[2].to_vec())?; let mut params = HashMap::new(); if !param_str.is_empty() { for pair in param_str.split(':') { let mut iter = pair.splitn(2, '='); let key = iter.next().ok_or_else(|| format_err!("bad params"))?; let value = iter.next().ok_or_else(|| format_err!("bad params"))?; params.insert(key.to_owned(), value.to_owned()); } } Ok(Some(Hyperlink::new_with_params(uri, params))) } } } impl Display for Hyperlink { fn fmt(&self, f: &mut Formatter) -> std::result::Result<(), FmtError> { write!(f, "8;")?; for (idx, (k, v)) in self.params.iter().enumerate() { // TODO: protect against k, v containing : or = if idx > 0 { write!(f, ":")?; } write!(f, "{}={}", k, v)?; } // TODO: ensure that link.uri doesn't contain characters // outside the range 32-126. Need to pull in a URI/URL // crate to help with this. write!(f, ";{}", self.uri)?; Ok(()) } } /// In addition to handling explicit escape sequences to enable /// hyperlinks, we also support defining rules that match text /// from screen lines and generate implicit hyperlinks. This /// can be used both for making http URLs clickable and also to /// make other text clickable. For example, you might define /// a rule that makes bug or issue numbers expand to the corresponding /// URL to view the details for that issue. /// The Rule struct is configuration that is passed to the terminal /// and is evaluated when processing mouse hover events. #[cfg_attr(feature = "use_serde", derive(Deserialize, Serialize))] #[derive(Debug, Clone, FromDynamic, ToDynamic)] pub struct Rule { /// The compiled regex for the rule. This is used to match /// against a line of text from the screen (typically the line /// over which the mouse is hovering). #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_regex", serialize_with = "serialize_regex" ) )] #[dynamic(into = "RegexWrap", try_from = "RegexWrap")] pub regex: Regex, /// The format string that defines how to transform the matched /// text into a URL. For example, a format string of `$0` expands /// to the entire matched text, whereas `mailto:$0` expands to /// the matched text with a `mailto:` prefix. More formally, /// each instance of `$N` (where N is a number) in the `format` /// string is replaced by the capture number N from the regex. /// The replacements are carried out in reverse order, starting /// with the highest numbered capture first. This avoids issues /// with ambiguous replacement of `$11` vs `$1` in the case of /// more complex regexes. pub format: String, /// Which capture to highlight #[dynamic(default)] pub highlight: usize, } struct RegexWrap(Regex); impl FromDynamic for RegexWrap { fn from_dynamic( value: &Value, options: FromDynamicOptions, ) -> std::result::Result { let s = String::from_dynamic(value, options)?; Ok(RegexWrap(Regex::new(&s).map_err(|e| e.to_string())?)) } } impl From<&Regex> for RegexWrap { fn from(regex: &Regex) -> RegexWrap { RegexWrap(regex.clone()) } } impl Into for RegexWrap { fn into(self) -> Regex { self.0 } } impl ToDynamic for RegexWrap { fn to_dynamic(&self) -> Value { self.0.to_string().to_dynamic() } } #[cfg(feature = "use_serde")] fn deserialize_regex<'de, D>(deserializer: D) -> std::result::Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; Regex::new(&s).map_err(|e| serde::de::Error::custom(format!("{:?}", e))) } #[cfg(feature = "use_serde")] fn serialize_regex(regex: &Regex, serializer: S) -> std::result::Result where S: Serializer, { let s = regex.to_string(); s.serialize(serializer) } /// Holds a resolved rule match. #[derive(Debug, PartialEq)] pub struct RuleMatch { /// Holds the span (measured in bytes) of the matched text pub range: Range, /// Holds the created Hyperlink object that should be associated /// the cells that correspond to the span. pub link: Arc, } /// An internal intermediate match result #[derive(Debug)] struct Match<'t> { rule: &'t Rule, captures: Captures<'t>, } impl<'t> Match<'t> { /// Returns the length of the matched text in bytes (not cells!) fn len(&self) -> usize { let c0 = self.highlight().unwrap(); c0.end() - c0.start() } /// Returns the span of the matched text, measured in bytes (not cells!) fn range(&self) -> Range { let c0 = self.highlight().unwrap(); c0.start()..c0.end() } fn highlight(&self) -> Option { self.captures.get(self.rule.highlight) } /// Expand replacements in the format string to yield the URL /// The replacement is as described on Rule::format. fn expand(&self) -> String { let mut result = self.rule.format.clone(); // Start with the highest numbered capture and decrement. // This avoids ambiguity when replacing $11 vs $1. for n in (0..self.captures.len()).rev() { let search = format!("${}", n); if let Some(rep) = self.captures.get(n) { result = result.replace(&search, rep.as_str()); } else { result = result.replace(&search, ""); } } result } } impl Rule { /// Construct a new rule. It may fail if the regex is invalid. pub fn new(regex: &str, format: &str) -> Result { Self::with_highlight(regex, format, 0) } pub fn with_highlight(regex: &str, format: &str, highlight: usize) -> Result { Ok(Self { regex: Regex::new(regex)?, format: format.to_owned(), highlight, }) } /// Given a line of text from the terminal screen, and a set of /// rules, return the set of RuleMatches. pub fn match_hyperlinks(line: &str, rules: &[Rule]) -> Vec { let mut matches = Vec::new(); for rule in rules.iter() { for capture_result in rule.regex.captures_iter(line) { if let Ok(captures) = capture_result { let m = Match { rule, captures }; if m.highlight().is_some() { matches.push(m); } } } } // Sort the matches by descending match length. // This is to avoid confusion if multiple rules match the // same sections of text. matches.sort_by(|a, b| b.len().cmp(&a.len())); matches .into_iter() .map(|m| { let url = m.expand(); let link = Arc::new(Hyperlink::new_implicit(url)); RuleMatch { link, range: m.range(), } }) .collect() } } #[cfg(test)] mod test { use super::*; #[test] fn parse_implicit() { let rules = vec![ Rule::new(r"\b\w+://(?:[\w.-]+)\.[a-z]{2,15}\S*\b", "$0").unwrap(), Rule::new(r"\b\w+@[\w-]+(\.[\w-]+)+\b", "mailto:$0").unwrap(), ]; assert_eq!( Rule::match_hyperlinks(" http://example.com", &rules), vec![RuleMatch { range: 2..20, link: Arc::new(Hyperlink::new_implicit("http://example.com")), }] ); assert_eq!( Rule::match_hyperlinks(" foo@example.com woot@example.com", &rules), vec![ // Longest match first RuleMatch { range: 18..34, link: Arc::new(Hyperlink::new_implicit("mailto:woot@example.com")), }, RuleMatch { range: 2..17, link: Arc::new(Hyperlink::new_implicit("mailto:foo@example.com")), }, ] ); } } termwiz-0.22.0/src/image.rs000064400000000000000000000441171046102023000136340ustar 00000000000000//! Images. //! This module has some helpers for modeling terminal cells that are filled //! with image data. //! We're targeting the iTerm image protocol initially, with sixel as an obvious //! follow up. //! Kitty has an extensive and complex graphics protocol //! whose docs are here: //! //! Both iTerm2 and Sixel appear to have semantics that allow replacing the //! contents of a single chararcter cell with image data, whereas the kitty //! protocol appears to track the images out of band as attachments with //! z-order. use crate::error::InternalError; use ordered_float::NotNan; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::hash::{Hash, Hasher}; use std::sync::{Arc, Mutex, MutexGuard}; use std::time::Duration; use wezterm_blob_leases::{BlobLease, BlobManager}; #[cfg(feature = "use_serde")] fn deserialize_notnan<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let value = f32::deserialize(deserializer)?; NotNan::new(value).map_err(|e| serde::de::Error::custom(format!("{:?}", e))) } #[cfg(feature = "use_serde")] #[cfg_attr(feature = "cargo-clippy", allow(clippy::trivially_copy_pass_by_ref))] fn serialize_notnan(value: &NotNan, serializer: S) -> Result where S: Serializer, { value.into_inner().serialize(serializer) } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct TextureCoordinate { #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_notnan", serialize_with = "serialize_notnan" ) )] pub x: NotNan, #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_notnan", serialize_with = "serialize_notnan" ) )] pub y: NotNan, } impl TextureCoordinate { pub fn new(x: NotNan, y: NotNan) -> Self { Self { x, y } } pub fn new_f32(x: f32, y: f32) -> Self { let x = NotNan::new(x).unwrap(); let y = NotNan::new(y).unwrap(); Self::new(x, y) } } /// Tracks data for displaying an image in the place of the normal cell /// character data. Since an Image can span multiple cells, we need to logically /// carve up the image and track each slice of it. Each cell needs to know /// its "texture coordinates" within that image so that we can render the /// right slice. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct ImageCell { /// Texture coordinate for the top left of this cell. /// (0,0) is the top left of the ImageData. (1, 1) is /// the bottom right. top_left: TextureCoordinate, /// Texture coordinates for the bottom right of this cell. bottom_right: TextureCoordinate, /// References the underlying image data data: Arc, z_index: i32, /// When rendering in the cell, use this offset from the top left /// of the cell padding_left: u16, padding_top: u16, padding_right: u16, padding_bottom: u16, image_id: Option, placement_id: Option, } impl ImageCell { pub fn new( top_left: TextureCoordinate, bottom_right: TextureCoordinate, data: Arc, ) -> Self { Self::with_z_index(top_left, bottom_right, data, 0, 0, 0, 0, 0, None, None) } pub fn compute_shape_hash(&self, hasher: &mut H) { self.top_left.hash(hasher); self.bottom_right.hash(hasher); self.data.hash.hash(hasher); self.z_index.hash(hasher); self.padding_left.hash(hasher); self.padding_top.hash(hasher); self.padding_right.hash(hasher); self.padding_bottom.hash(hasher); self.image_id.hash(hasher); self.placement_id.hash(hasher); } pub fn with_z_index( top_left: TextureCoordinate, bottom_right: TextureCoordinate, data: Arc, z_index: i32, padding_left: u16, padding_top: u16, padding_right: u16, padding_bottom: u16, image_id: Option, placement_id: Option, ) -> Self { Self { top_left, bottom_right, data, z_index, padding_left, padding_top, padding_right, padding_bottom, image_id, placement_id, } } pub fn matches_placement(&self, image_id: u32, placement_id: Option) -> bool { self.image_id == Some(image_id) && self.placement_id == placement_id } pub fn has_placement_id(&self) -> bool { self.placement_id.is_some() } pub fn image_id(&self) -> Option { self.image_id } pub fn placement_id(&self) -> Option { self.placement_id } pub fn top_left(&self) -> TextureCoordinate { self.top_left } pub fn bottom_right(&self) -> TextureCoordinate { self.bottom_right } pub fn image_data(&self) -> &Arc { &self.data } /// negative z_index is rendered beneath the text layer. /// >= 0 is rendered above the text. /// negative z_index < INT32_MIN/2 will be drawn under cells /// with non-default background colors pub fn z_index(&self) -> i32 { self.z_index } /// Returns padding (left, top, right, bottom) pub fn padding(&self) -> (u16, u16, u16, u16) { ( self.padding_left, self.padding_top, self.padding_right, self.padding_bottom, ) } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Clone, PartialEq, Eq)] pub enum ImageDataType { /// Data is in the native image file format /// (best for file formats that have animated content) EncodedFile(Vec), /// Data is in the native image file format, /// (best for file formats that have animated content) /// and is stored as a blob via the blob manager. EncodedLease( #[cfg_attr( feature = "use_serde", serde(with = "wezterm_blob_leases::lease_bytes") )] BlobLease, ), /// Data is RGBA u8 data Rgba8 { data: Vec, width: u32, height: u32, hash: [u8; 32], }, /// Data is an animated sequence AnimRgba8 { width: u32, height: u32, durations: Vec, frames: Vec>, hashes: Vec<[u8; 32]>, }, } impl std::fmt::Debug for ImageDataType { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { match self { Self::EncodedFile(data) => fmt .debug_struct("EncodedFile") .field("data_of_len", &data.len()) .finish(), Self::EncodedLease(lease) => lease.fmt(fmt), Self::Rgba8 { data, width, height, hash, } => fmt .debug_struct("Rgba8") .field("data_of_len", &data.len()) .field("width", &width) .field("height", &height) .field("hash", &hash) .finish(), Self::AnimRgba8 { frames, width, height, durations, hashes, } => fmt .debug_struct("AnimRgba8") .field("frames_of_len", &frames.len()) .field("width", &width) .field("height", &height) .field("durations", durations) .field("hashes", hashes) .finish(), } } } impl ImageDataType { pub fn new_single_frame(width: u32, height: u32, data: Vec) -> Self { let hash = Self::hash_bytes(&data); assert_eq!( width * height * 4, data.len() as u32, "invalid dimensions {}x{} for pixel data of length {}", width, height, data.len() ); Self::Rgba8 { width, height, data, hash, } } /// Black pixels pub fn placeholder() -> Self { let mut data = vec![]; let size = 8; for _ in 0..size * size { data.extend_from_slice(&[0, 0, 0, 0xff]); } ImageDataType::new_single_frame(size, size, data) } pub fn hash_bytes(bytes: &[u8]) -> [u8; 32] { use sha2::Digest; let mut hasher = sha2::Sha256::new(); hasher.update(bytes); hasher.finalize().into() } pub fn compute_hash(&self) -> [u8; 32] { use sha2::Digest; let mut hasher = sha2::Sha256::new(); match self { ImageDataType::EncodedFile(data) => hasher.update(data), ImageDataType::EncodedLease(lease) => return lease.content_id().as_hash_bytes(), ImageDataType::Rgba8 { data, .. } => hasher.update(data), ImageDataType::AnimRgba8 { frames, durations, .. } => { for data in frames { hasher.update(data); } for d in durations { let d = d.as_secs_f32(); let b = d.to_ne_bytes(); hasher.update(b); } } }; hasher.finalize().into() } /// Divides the animation frame durations by the provided /// speed_factor, so a factor of 2 will halve the duration. /// # Panics /// if the speed_factor is negative, non-finite or the result /// overflows the allow Duration range. pub fn adjust_speed(&mut self, speed_factor: f32) { match self { Self::AnimRgba8 { durations, .. } => { for d in durations { *d = d.mul_f32(1. / speed_factor); } } _ => {} } } #[cfg(feature = "use_image")] pub fn dimensions(&self) -> Result<(u32, u32), InternalError> { fn dimensions_for_data(data: &[u8]) -> image::ImageResult<(u32, u32)> { let reader = image::io::Reader::new(std::io::Cursor::new(data)).with_guessed_format()?; let (width, height) = reader.into_dimensions()?; Ok((width, height)) } match self { ImageDataType::EncodedFile(data) => Ok(dimensions_for_data(data)?), ImageDataType::EncodedLease(lease) => Ok(dimensions_for_data(&lease.get_data()?)?), ImageDataType::AnimRgba8 { width, height, .. } | ImageDataType::Rgba8 { width, height, .. } => Ok((*width, *height)), } } /// Migrate an in-memory encoded image blob to on-disk to reduce /// the memory footprint pub fn swap_out(self) -> Result { match self { Self::EncodedFile(data) => match BlobManager::store(&data) { Ok(lease) => Ok(Self::EncodedLease(lease)), Err(wezterm_blob_leases::Error::StorageNotInit) => Ok(Self::EncodedFile(data)), Err(err) => Err(err.into()), }, other => Ok(other), } } /// Decode an encoded file into either an Rgba8 or AnimRgba8 variant /// if we recognize the file format, otherwise the EncodedFile data /// is preserved as is. #[cfg(feature = "use_image")] pub fn decode(self) -> Self { use image::{AnimationDecoder, ImageFormat}; match self { Self::EncodedFile(data) => { let format = match image::guess_format(&data) { Ok(format) => format, Err(err) => { log::warn!("Unable to decode raw image data: {:#}", err); return Self::EncodedFile(data); } }; match format { ImageFormat::Gif => image::codecs::gif::GifDecoder::new(&*data) .and_then(|decoder| decoder.into_frames().collect_frames()) .and_then(|frames| { if frames.is_empty() { log::error!("decoded image has 0 frames, using placeholder"); Ok(Self::placeholder()) } else { Ok(Self::decode_frames(frames)) } }) .unwrap_or_else(|err| { log::error!( "Unable to parse animated gif: {:#}, trying as single frame", err ); Self::decode_single(data) }), ImageFormat::Png => { let decoder = match image::codecs::png::PngDecoder::new(&*data) { Ok(d) => d, _ => return Self::EncodedFile(data), }; if decoder.is_apng() { match decoder.apng().into_frames().collect_frames() { Ok(frames) if frames.is_empty() => { log::error!("decoded image has 0 frames, using placeholder"); Self::placeholder() } Ok(frames) => Self::decode_frames(frames), _ => Self::EncodedFile(data), } } else { Self::decode_single(data) } } ImageFormat::WebP => { let decoder = match image::codecs::webp::WebPDecoder::new(&*data) { Ok(d) => d, _ => return Self::EncodedFile(data), }; match decoder.into_frames().collect_frames() { Ok(frames) if frames.is_empty() => { log::error!("decoded image has 0 frames, using placeholder"); Self::placeholder() } Ok(frames) => Self::decode_frames(frames), _ => Self::EncodedFile(data), } } _ => Self::decode_single(data), } } data => data, } } #[cfg(not(feature = "use_image"))] pub fn decode(self) -> Self { self } #[cfg(feature = "use_image")] fn decode_frames(img_frames: Vec) -> Self { let mut width = 0; let mut height = 0; let mut frames = vec![]; let mut durations = vec![]; let mut hashes = vec![]; for frame in img_frames.into_iter() { let duration: Duration = frame.delay().into(); durations.push(duration); let image = image::DynamicImage::ImageRgba8(frame.into_buffer()).to_rgba8(); let (w, h) = image.dimensions(); width = w; height = h; let data = image.into_vec(); hashes.push(Self::hash_bytes(&data)); frames.push(data); } Self::AnimRgba8 { width, height, frames, durations, hashes, } } #[cfg(feature = "use_image")] fn decode_single(data: Vec) -> Self { match image::load_from_memory(&data) { Ok(image) => { let image = image.to_rgba8(); let (width, height) = image.dimensions(); let data = image.into_vec(); let hash = Self::hash_bytes(&data); Self::Rgba8 { width, height, data, hash, } } _ => Self::EncodedFile(data), } } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] pub struct ImageData { data: Mutex, hash: [u8; 32], } struct HexSlice<'a>(&'a [u8]); impl<'a> std::fmt::Display for HexSlice<'a> { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { for byte in self.0 { write!(fmt, "{byte:x}")?; } Ok(()) } } impl std::fmt::Debug for ImageData { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { fmt.debug_struct("ImageData") .field("data", &self.data) .field("hash", &format_args!("{}", HexSlice(&self.hash))) .finish() } } impl Eq for ImageData {} impl PartialEq for ImageData { fn eq(&self, rhs: &Self) -> bool { self.hash == rhs.hash } } impl ImageData { /// Create a new ImageData struct with the provided raw data. pub fn with_raw_data(data: Vec) -> Self { let hash = ImageDataType::hash_bytes(&data); Self::with_data_and_hash(ImageDataType::EncodedFile(data).decode(), hash) } fn with_data_and_hash(data: ImageDataType, hash: [u8; 32]) -> Self { Self { data: Mutex::new(data), hash, } } pub fn with_data(data: ImageDataType) -> Self { let hash = data.compute_hash(); Self { data: Mutex::new(data), hash, } } /// Returns the in-memory footprint pub fn len(&self) -> usize { match &*self.data() { ImageDataType::EncodedFile(d) => d.len(), ImageDataType::EncodedLease(_) => 0, ImageDataType::Rgba8 { data, .. } => data.len(), ImageDataType::AnimRgba8 { frames, .. } => frames.len() * frames[0].len(), } } pub fn data(&self) -> MutexGuard { self.data.lock().unwrap() } pub fn hash(&self) -> [u8; 32] { self.hash } } termwiz-0.22.0/src/input.rs000064400000000000000000002061051046102023000137060ustar 00000000000000//! This module provides an InputParser struct to help with parsing //! input received from a terminal. use crate::bail; use crate::error::Result; use crate::escape::csi::{KittyKeyboardFlags, MouseReport}; use crate::escape::parser::Parser; use crate::escape::{Action, CSI}; use crate::keymap::{Found, KeyMap}; use crate::readbuf::ReadBuffer; use bitflags::bitflags; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::fmt::Write; use wezterm_input_types::ctrl_mapping; pub use wezterm_input_types::Modifiers; pub const CSI: &str = "\x1b["; pub const SS3: &str = "\x1bO"; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum KeyboardEncoding { Xterm, /// CsiU, /// Win32, /// Kitty(KittyKeyboardFlags), } /// Specifies terminal modes/configuration that can influence how a KeyCode /// is encoded when being sent to and application via the pty. #[derive(Debug, Clone, Copy)] pub struct KeyCodeEncodeModes { pub encoding: KeyboardEncoding, pub application_cursor_keys: bool, pub newline_mode: bool, pub modify_other_keys: Option, } #[cfg(windows)] use winapi::um::wincon::{ INPUT_RECORD, KEY_EVENT, KEY_EVENT_RECORD, MOUSE_EVENT, MOUSE_EVENT_RECORD, WINDOW_BUFFER_SIZE_EVENT, WINDOW_BUFFER_SIZE_RECORD, }; bitflags! { #[cfg_attr(feature="use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Default, Clone, PartialEq, Eq)] pub struct MouseButtons: u8 { const NONE = 0; const LEFT = 1<<1; const RIGHT = 1<<2; const MIDDLE = 1<<3; const VERT_WHEEL = 1<<4; const HORZ_WHEEL = 1<<5; /// if set then the wheel movement was in the positive /// direction, else the negative direction const WHEEL_POSITIVE = 1<<6; } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum InputEvent { Key(KeyEvent), Mouse(MouseEvent), PixelMouse(PixelMouseEvent), /// Detected that the user has resized the terminal Resized { cols: usize, rows: usize, }, /// For terminals that support Bracketed Paste mode, /// pastes are collected and reported as this variant. Paste(String), /// The program has woken the input thread. Wake, } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct MouseEvent { pub x: u16, pub y: u16, pub mouse_buttons: MouseButtons, pub modifiers: Modifiers, } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct PixelMouseEvent { pub x_pixels: u16, pub y_pixels: u16, pub mouse_buttons: MouseButtons, pub modifiers: Modifiers, } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct KeyEvent { /// Which key was pressed pub key: KeyCode, /// Which modifiers are down pub modifiers: Modifiers, } /// Which key is pressed. Not all of these are probable to appear /// on most systems. A lot of this list is @wez trawling docs and /// making an entry for things that might be possible in this first pass. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum KeyCode { /// The decoded unicode character Char(char), Hyper, Super, Meta, /// Ctrl-break on windows Cancel, Backspace, Tab, Clear, Enter, Shift, Escape, LeftShift, RightShift, Control, LeftControl, RightControl, Alt, LeftAlt, RightAlt, Menu, LeftMenu, RightMenu, Pause, CapsLock, PageUp, PageDown, End, Home, LeftArrow, RightArrow, UpArrow, DownArrow, Select, Print, Execute, PrintScreen, Insert, Delete, Help, LeftWindows, RightWindows, Applications, Sleep, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, Multiply, Add, Separator, Subtract, Decimal, Divide, /// F1-F24 are possible Function(u8), NumLock, ScrollLock, Copy, Cut, Paste, BrowserBack, BrowserForward, BrowserRefresh, BrowserStop, BrowserSearch, BrowserFavorites, BrowserHome, VolumeMute, VolumeDown, VolumeUp, MediaNextTrack, MediaPrevTrack, MediaStop, MediaPlayPause, ApplicationLeftArrow, ApplicationRightArrow, ApplicationUpArrow, ApplicationDownArrow, KeyPadHome, KeyPadEnd, KeyPadPageUp, KeyPadPageDown, KeyPadBegin, #[doc(hidden)] InternalPasteStart, #[doc(hidden)] InternalPasteEnd, } impl KeyCode { /// if SHIFT is held and we have KeyCode::Char('c') we want to normalize /// that keycode to KeyCode::Char('C'); that is what this function does. /// In theory we should give the same treatment to keys like `[` -> `{` /// but that assumes something about the keyboard layout and is probably /// better done in the gui frontend rather than this layer. /// In fact, this function might be better off if it lived elsewhere. pub fn normalize_shift_to_upper_case(self, modifiers: Modifiers) -> KeyCode { if modifiers.contains(Modifiers::SHIFT) { match self { KeyCode::Char(c) if c.is_ascii_lowercase() => KeyCode::Char(c.to_ascii_uppercase()), _ => self, } } else { self } } /// Return true if the key represents a modifier key. pub fn is_modifier(self) -> bool { matches!( self, Self::Hyper | Self::Super | Self::Meta | Self::Shift | Self::LeftShift | Self::RightShift | Self::Control | Self::LeftControl | Self::RightControl | Self::Alt | Self::LeftAlt | Self::RightAlt | Self::LeftWindows | Self::RightWindows ) } /// Returns the byte sequence that represents this KeyCode and Modifier combination, pub fn encode( &self, mods: Modifiers, modes: KeyCodeEncodeModes, is_down: bool, ) -> Result { if !is_down { // We only want down events return Ok(String::new()); } // We are encoding the key as an xterm-compatible sequence, which does not support // positional modifiers. let mods = mods.remove_positional_mods(); use KeyCode::*; let key = self.normalize_shift_to_upper_case(mods); // Normalize the modifier state for Char's that are uppercase; remove // the SHIFT modifier so that reduce ambiguity below let mods = match key { Char(c) if (c.is_ascii_punctuation() || c.is_ascii_uppercase()) && mods.contains(Modifiers::SHIFT) => { mods & !Modifiers::SHIFT } _ => mods, }; // Normalize Backspace and Delete let key = match key { Char('\x7f') => Delete, Char('\x08') => Backspace, c => c, }; let mut buf = String::new(); // TODO: also respect self.application_keypad match key { Char(c) if is_ambiguous_ascii_ctrl(c) && mods.contains(Modifiers::CTRL) && modes.encoding == KeyboardEncoding::CsiU => { csi_u_encode(&mut buf, c, mods, &modes)?; } Char(c) if c.is_ascii_uppercase() && mods.contains(Modifiers::CTRL) => { csi_u_encode(&mut buf, c, mods, &modes)?; } Char(c) if mods.contains(Modifiers::CTRL) && modes.modify_other_keys == Some(2) => { csi_u_encode(&mut buf, c, mods, &modes)?; } Char(c) if mods.contains(Modifiers::CTRL) && ctrl_mapping(c).is_some() => { let c = ctrl_mapping(c).unwrap(); if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } buf.push(c); } // When alt is pressed, send escape first to indicate to the peer that // ALT is pressed. We do this only for ascii alnum characters because // eg: on macOS generates altgr style glyphs and keeps the ALT key // in the modifier set. This confuses eg: zsh which then just displays // as the input, so we want to avoid that. Char(c) if (c.is_ascii_alphanumeric() || c.is_ascii_punctuation()) && mods.contains(Modifiers::ALT) => { buf.push(0x1b as char); buf.push(c); } Backspace => { // Backspace sends the default VERASE which is confusingly // the DEL ascii codepoint rather than BS. // We only send BS when CTRL is held. if mods.contains(Modifiers::CTRL) { csi_u_encode(&mut buf, '\x08', mods, &modes)?; } else if mods.contains(Modifiers::SHIFT) { csi_u_encode(&mut buf, '\x7f', mods, &modes)?; } else { if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } buf.push('\x7f'); } } Enter | Escape => { let c = match key { Enter => '\r', Escape => '\x1b', _ => unreachable!(), }; if mods.contains(Modifiers::SHIFT) || mods.contains(Modifiers::CTRL) { csi_u_encode(&mut buf, c, mods, &modes)?; } else { if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } buf.push(c); if modes.newline_mode && key == Enter { buf.push(0x0a as char); } } } Tab if !mods.is_empty() && modes.modify_other_keys.is_some() => { csi_u_encode(&mut buf, '\t', mods, &modes)?; } Tab => { if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } let mods = mods & !Modifiers::ALT; if mods == Modifiers::CTRL { buf.push_str("\x1b[9;5u"); } else if mods == Modifiers::CTRL | Modifiers::SHIFT { buf.push_str("\x1b[1;5Z"); } else if mods == Modifiers::SHIFT { buf.push_str("\x1b[Z"); } else { buf.push('\t'); } } Char(c) => { if mods.is_empty() { buf.push(c); } else { csi_u_encode(&mut buf, c, mods, &modes)?; } } Home | KeyPadHome | End | KeyPadEnd | UpArrow | DownArrow | RightArrow | LeftArrow | ApplicationUpArrow | ApplicationDownArrow | ApplicationRightArrow | ApplicationLeftArrow => { let (force_app, c) = match key { UpArrow => (false, 'A'), DownArrow => (false, 'B'), RightArrow => (false, 'C'), LeftArrow => (false, 'D'), KeyPadHome | Home => (false, 'H'), End | KeyPadEnd => (false, 'F'), ApplicationUpArrow => (true, 'A'), ApplicationDownArrow => (true, 'B'), ApplicationRightArrow => (true, 'C'), ApplicationLeftArrow => (true, 'D'), _ => unreachable!(), }; let csi_or_ss3 = if force_app || ( modes.application_cursor_keys // Strict reading of DECCKM suggests that application_cursor_keys // only applies when DECANM and DECKPAM are active, but that seems // to break unmodified cursor keys in vim /* && self.dec_ansi_mode && self.application_keypad */ ) { // Use SS3 in application mode SS3 } else { // otherwise use regular CSI CSI }; if mods.contains(Modifiers::ALT) || mods.contains(Modifiers::SHIFT) || mods.contains(Modifiers::CTRL) { write!(buf, "{}1;{}{}", CSI, 1 + mods.encode_xterm(), c)?; } else { write!(buf, "{}{}", csi_or_ss3, c)?; } } PageUp | PageDown | KeyPadPageUp | KeyPadPageDown | Insert | Delete => { let c = match key { Insert => 2, Delete => 3, KeyPadPageUp | PageUp => 5, KeyPadPageDown | PageDown => 6, _ => unreachable!(), }; if mods.contains(Modifiers::ALT) || mods.contains(Modifiers::SHIFT) || mods.contains(Modifiers::CTRL) { write!(buf, "\x1b[{};{}~", c, 1 + mods.encode_xterm())?; } else { write!(buf, "\x1b[{}~", c)?; } } Function(n) => { if mods.is_empty() && n < 5 { // F1-F4 are encoded using SS3 if there are no modifiers write!( buf, "{}", match n { 1 => "\x1bOP", 2 => "\x1bOQ", 3 => "\x1bOR", 4 => "\x1bOS", _ => unreachable!("wat?"), } )?; } else if n < 5 { // Special case for F1-F4 with modifiers let code = match n { 1 => 'P', 2 => 'Q', 3 => 'R', 4 => 'S', _ => unreachable!("wat?"), }; write!(buf, "\x1b[1;{}{code}", 1 + mods.encode_xterm())?; } else { // Higher numbered F-keys using CSI instead of SS3. let intro = match n { 1 => "\x1b[11", 2 => "\x1b[12", 3 => "\x1b[13", 4 => "\x1b[14", 5 => "\x1b[15", 6 => "\x1b[17", 7 => "\x1b[18", 8 => "\x1b[19", 9 => "\x1b[20", 10 => "\x1b[21", 11 => "\x1b[23", 12 => "\x1b[24", 13 => "\x1b[25", 14 => "\x1b[26", 15 => "\x1b[28", 16 => "\x1b[29", 17 => "\x1b[31", 18 => "\x1b[32", 19 => "\x1b[33", 20 => "\x1b[34", 21 => "\x1b[42", 22 => "\x1b[43", 23 => "\x1b[44", 24 => "\x1b[45", _ => bail!("unhandled fkey number {}", n), }; let encoded_mods = mods.encode_xterm(); if encoded_mods == 0 { // If no modifiers are held, don't send the modifier // sequence, as the modifier encoding is a CSI-u extension. write!(buf, "{}~", intro)?; } else { write!(buf, "{};{}~", intro, 1 + encoded_mods)?; } } } Numpad0 | Numpad3 | Numpad9 | Decimal => { let intro = match key { Numpad0 => "\x1b[2", Numpad3 => "\x1b[6", Numpad9 => "\x1b[6", Decimal => "\x1b[3", _ => unreachable!(), }; let encoded_mods = mods.encode_xterm(); if encoded_mods == 0 { // If no modifiers are held, don't send the modifier // sequence, as the modifier encoding is a CSI-u extension. write!(buf, "{}~", intro)?; } else { write!(buf, "{};{}~", intro, 1 + encoded_mods)?; } } Numpad1 | Numpad2 | Numpad4 | Numpad5 | KeyPadBegin | Numpad6 | Numpad7 | Numpad8 => { let c = match key { Numpad1 => "F", Numpad2 => "B", Numpad4 => "D", KeyPadBegin | Numpad5 => "E", Numpad6 => "C", Numpad7 => "H", Numpad8 => "A", _ => unreachable!(), }; let encoded_mods = mods.encode_xterm(); if encoded_mods == 0 { // If no modifiers are held, don't send the modifier write!(buf, "{}{}", CSI, c)?; } else { write!(buf, "{}1;{}{}", CSI, 1 + encoded_mods, c)?; } } Multiply | Add | Separator | Subtract | Divide => {} // Modifier keys pressed on their own don't expand to anything Control | LeftControl | RightControl | Alt | LeftAlt | RightAlt | Menu | LeftMenu | RightMenu | Super | Hyper | Shift | LeftShift | RightShift | Meta | LeftWindows | RightWindows | NumLock | ScrollLock | Cancel | Clear | Pause | CapsLock | Select | Print | PrintScreen | Execute | Help | Applications | Sleep | Copy | Cut | Paste | BrowserBack | BrowserForward | BrowserRefresh | BrowserStop | BrowserSearch | BrowserFavorites | BrowserHome | VolumeMute | VolumeDown | VolumeUp | MediaNextTrack | MediaPrevTrack | MediaStop | MediaPlayPause | InternalPasteStart | InternalPasteEnd => {} }; Ok(buf) } } /// characters that when masked for CTRL could be an ascii control character /// or could be a key that a user legitimately wants to process in their /// terminal application fn is_ambiguous_ascii_ctrl(c: char) -> bool { match c { 'i' | 'I' | 'm' | 'M' | '[' | '{' | '@' => true, _ => false, } } fn is_ascii(c: char) -> bool { (c as u32) < 0x80 } fn csi_u_encode( buf: &mut String, c: char, mods: Modifiers, modes: &KeyCodeEncodeModes, ) -> Result<()> { if modes.encoding == KeyboardEncoding::CsiU && is_ascii(c) { write!(buf, "\x1b[{};{}u", c as u32, 1 + mods.encode_xterm())?; return Ok(()); } // match (c, modes.modify_other_keys) { ('c' | 'd' | '\x1b' | '\x7f' | '\x08', Some(1)) => { // Exclude well-known keys from modifyOtherKeys mode 1 } (c, Some(_)) => { write!(buf, "\x1b[27;{};{}~", 1 + mods.encode_xterm(), c as u32)?; return Ok(()); } _ => {} } let c = if mods.contains(Modifiers::CTRL) && ctrl_mapping(c).is_some() { ctrl_mapping(c).unwrap() } else { c }; if mods.contains(Modifiers::ALT) { buf.push(0x1b as char); } write!(buf, "{}", c)?; Ok(()) } #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum InputState { Normal, EscapeMaybeAlt, Pasting(usize), } #[derive(Debug)] pub struct InputParser { key_map: KeyMap, buf: ReadBuffer, state: InputState, } #[cfg(windows)] mod windows { use super::*; use std; use winapi::um::winuser; fn modifiers_from_ctrl_key_state(state: u32) -> Modifiers { use winapi::um::wincon::*; let mut mods = Modifiers::NONE; if (state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) != 0 { mods |= Modifiers::ALT; } if (state & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0 { mods |= Modifiers::CTRL; } if (state & SHIFT_PRESSED) != 0 { mods |= Modifiers::SHIFT; } // TODO: we could report caps lock, numlock and scrolllock mods } impl InputParser { fn decode_key_record( &mut self, event: &KEY_EVENT_RECORD, callback: &mut F, ) { // TODO: do we want downs instead of ups? if event.bKeyDown == 0 { return; } let key_code = match std::char::from_u32(*unsafe { event.uChar.UnicodeChar() } as u32) { Some(unicode) if unicode > '\x00' => { let mut buf = [0u8; 4]; self.buf .extend_with(unicode.encode_utf8(&mut buf).as_bytes()); self.process_bytes(callback, true); return; } _ => match event.wVirtualKeyCode as i32 { winuser::VK_CANCEL => KeyCode::Cancel, winuser::VK_BACK => KeyCode::Backspace, winuser::VK_TAB => KeyCode::Tab, winuser::VK_CLEAR => KeyCode::Clear, winuser::VK_RETURN => KeyCode::Enter, winuser::VK_SHIFT => KeyCode::Shift, winuser::VK_CONTROL => KeyCode::Control, winuser::VK_MENU => KeyCode::Menu, winuser::VK_PAUSE => KeyCode::Pause, winuser::VK_CAPITAL => KeyCode::CapsLock, winuser::VK_ESCAPE => KeyCode::Escape, winuser::VK_PRIOR => KeyCode::PageUp, winuser::VK_NEXT => KeyCode::PageDown, winuser::VK_END => KeyCode::End, winuser::VK_HOME => KeyCode::Home, winuser::VK_LEFT => KeyCode::LeftArrow, winuser::VK_RIGHT => KeyCode::RightArrow, winuser::VK_UP => KeyCode::UpArrow, winuser::VK_DOWN => KeyCode::DownArrow, winuser::VK_SELECT => KeyCode::Select, winuser::VK_PRINT => KeyCode::Print, winuser::VK_EXECUTE => KeyCode::Execute, winuser::VK_SNAPSHOT => KeyCode::PrintScreen, winuser::VK_INSERT => KeyCode::Insert, winuser::VK_DELETE => KeyCode::Delete, winuser::VK_HELP => KeyCode::Help, winuser::VK_LWIN => KeyCode::LeftWindows, winuser::VK_RWIN => KeyCode::RightWindows, winuser::VK_APPS => KeyCode::Applications, winuser::VK_SLEEP => KeyCode::Sleep, winuser::VK_NUMPAD0 => KeyCode::Numpad0, winuser::VK_NUMPAD1 => KeyCode::Numpad1, winuser::VK_NUMPAD2 => KeyCode::Numpad2, winuser::VK_NUMPAD3 => KeyCode::Numpad3, winuser::VK_NUMPAD4 => KeyCode::Numpad4, winuser::VK_NUMPAD5 => KeyCode::Numpad5, winuser::VK_NUMPAD6 => KeyCode::Numpad6, winuser::VK_NUMPAD7 => KeyCode::Numpad7, winuser::VK_NUMPAD8 => KeyCode::Numpad8, winuser::VK_NUMPAD9 => KeyCode::Numpad9, winuser::VK_MULTIPLY => KeyCode::Multiply, winuser::VK_ADD => KeyCode::Add, winuser::VK_SEPARATOR => KeyCode::Separator, winuser::VK_SUBTRACT => KeyCode::Subtract, winuser::VK_DECIMAL => KeyCode::Decimal, winuser::VK_DIVIDE => KeyCode::Divide, winuser::VK_F1 => KeyCode::Function(1), winuser::VK_F2 => KeyCode::Function(2), winuser::VK_F3 => KeyCode::Function(3), winuser::VK_F4 => KeyCode::Function(4), winuser::VK_F5 => KeyCode::Function(5), winuser::VK_F6 => KeyCode::Function(6), winuser::VK_F7 => KeyCode::Function(7), winuser::VK_F8 => KeyCode::Function(8), winuser::VK_F9 => KeyCode::Function(9), winuser::VK_F10 => KeyCode::Function(10), winuser::VK_F11 => KeyCode::Function(11), winuser::VK_F12 => KeyCode::Function(12), winuser::VK_F13 => KeyCode::Function(13), winuser::VK_F14 => KeyCode::Function(14), winuser::VK_F15 => KeyCode::Function(15), winuser::VK_F16 => KeyCode::Function(16), winuser::VK_F17 => KeyCode::Function(17), winuser::VK_F18 => KeyCode::Function(18), winuser::VK_F19 => KeyCode::Function(19), winuser::VK_F20 => KeyCode::Function(20), winuser::VK_F21 => KeyCode::Function(21), winuser::VK_F22 => KeyCode::Function(22), winuser::VK_F23 => KeyCode::Function(23), winuser::VK_F24 => KeyCode::Function(24), winuser::VK_NUMLOCK => KeyCode::NumLock, winuser::VK_SCROLL => KeyCode::ScrollLock, winuser::VK_LSHIFT => KeyCode::LeftShift, winuser::VK_RSHIFT => KeyCode::RightShift, winuser::VK_LCONTROL => KeyCode::LeftControl, winuser::VK_RCONTROL => KeyCode::RightControl, winuser::VK_LMENU => KeyCode::LeftMenu, winuser::VK_RMENU => KeyCode::RightMenu, winuser::VK_BROWSER_BACK => KeyCode::BrowserBack, winuser::VK_BROWSER_FORWARD => KeyCode::BrowserForward, winuser::VK_BROWSER_REFRESH => KeyCode::BrowserRefresh, winuser::VK_BROWSER_STOP => KeyCode::BrowserStop, winuser::VK_BROWSER_SEARCH => KeyCode::BrowserSearch, winuser::VK_BROWSER_FAVORITES => KeyCode::BrowserFavorites, winuser::VK_BROWSER_HOME => KeyCode::BrowserHome, winuser::VK_VOLUME_MUTE => KeyCode::VolumeMute, winuser::VK_VOLUME_DOWN => KeyCode::VolumeDown, winuser::VK_VOLUME_UP => KeyCode::VolumeUp, winuser::VK_MEDIA_NEXT_TRACK => KeyCode::MediaNextTrack, winuser::VK_MEDIA_PREV_TRACK => KeyCode::MediaPrevTrack, winuser::VK_MEDIA_STOP => KeyCode::MediaStop, winuser::VK_MEDIA_PLAY_PAUSE => KeyCode::MediaPlayPause, _ => return, }, }; let mut modifiers = modifiers_from_ctrl_key_state(event.dwControlKeyState); let key_code = key_code.normalize_shift_to_upper_case(modifiers); if let KeyCode::Char(c) = key_code { if c.is_ascii_uppercase() { modifiers.remove(Modifiers::SHIFT); } } let input_event = InputEvent::Key(KeyEvent { key: key_code, modifiers, }); for _ in 0..event.wRepeatCount { callback(input_event.clone()); } } fn decode_mouse_record( &self, event: &MOUSE_EVENT_RECORD, callback: &mut F, ) { use winapi::um::wincon::*; let mut buttons = MouseButtons::NONE; if (event.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) != 0 { buttons |= MouseButtons::LEFT; } if (event.dwButtonState & RIGHTMOST_BUTTON_PRESSED) != 0 { buttons |= MouseButtons::RIGHT; } if (event.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) != 0 { buttons |= MouseButtons::MIDDLE; } let modifiers = modifiers_from_ctrl_key_state(event.dwControlKeyState); if (event.dwEventFlags & MOUSE_WHEELED) != 0 { buttons |= MouseButtons::VERT_WHEEL; if (event.dwButtonState >> 8) != 0 { buttons |= MouseButtons::WHEEL_POSITIVE; } } else if (event.dwEventFlags & MOUSE_HWHEELED) != 0 { buttons |= MouseButtons::HORZ_WHEEL; if (event.dwButtonState >> 8) != 0 { buttons |= MouseButtons::WHEEL_POSITIVE; } } let mouse = InputEvent::Mouse(MouseEvent { x: event.dwMousePosition.X as u16, y: event.dwMousePosition.Y as u16, mouse_buttons: buttons, modifiers, }); if (event.dwEventFlags & DOUBLE_CLICK) != 0 { callback(mouse.clone()); } callback(mouse); } fn decode_resize_record( &self, event: &WINDOW_BUFFER_SIZE_RECORD, callback: &mut F, ) { callback(InputEvent::Resized { rows: event.dwSize.Y as usize, cols: event.dwSize.X as usize, }); } pub fn decode_input_records( &mut self, records: &[INPUT_RECORD], callback: &mut F, ) { for record in records { match record.EventType { KEY_EVENT => { self.decode_key_record(unsafe { record.Event.KeyEvent() }, callback) } MOUSE_EVENT => { self.decode_mouse_record(unsafe { record.Event.MouseEvent() }, callback) } WINDOW_BUFFER_SIZE_EVENT => self.decode_resize_record( unsafe { record.Event.WindowBufferSizeEvent() }, callback, ), _ => {} } } self.process_bytes(callback, false); } } } impl Default for InputParser { fn default() -> Self { Self::new() } } impl InputParser { pub fn new() -> Self { Self { key_map: Self::build_basic_key_map(), buf: ReadBuffer::new(), state: InputState::Normal, } } fn build_basic_key_map() -> KeyMap { let mut map = KeyMap::new(); let modifier_combos = &[ ("", Modifiers::NONE), (";1", Modifiers::NONE), (";2", Modifiers::SHIFT), (";3", Modifiers::ALT), (";4", Modifiers::ALT | Modifiers::SHIFT), (";5", Modifiers::CTRL), (";6", Modifiers::CTRL | Modifiers::SHIFT), (";7", Modifiers::CTRL | Modifiers::ALT), (";8", Modifiers::CTRL | Modifiers::ALT | Modifiers::SHIFT), ]; // Meta is theoretically a distinct modifier of its own, but modern systems don't // have a dedicated Meta key and use the Alt/Option key instead. The mapping // below is reproduced from the xterm documentation from a time where it was // possible to hold both Alt and Meta down as modifiers. Since we define meta to // ALT, the use of `meta | ALT` in the table below appears to be redundant, // but makes it easier to see that the mapping matches xterm when viewing // its documentation. let meta = Modifiers::ALT; let meta_modifier_combos = &[ (";9", meta), (";10", meta | Modifiers::SHIFT), (";11", meta | Modifiers::ALT), (";12", meta | Modifiers::ALT | Modifiers::SHIFT), (";13", meta | Modifiers::CTRL), (";14", meta | Modifiers::CTRL | Modifiers::SHIFT), (";15", meta | Modifiers::CTRL | Modifiers::ALT), ( ";16", meta | Modifiers::CTRL | Modifiers::ALT | Modifiers::SHIFT, ), ]; let modifier_combos_including_meta = || modifier_combos.iter().chain(meta_modifier_combos.iter()); for alpha in b'A'..=b'Z' { // Ctrl-[A..=Z] are sent as 1..=26 let ctrl = [alpha & 0x1f]; map.insert( &ctrl, InputEvent::Key(KeyEvent { key: KeyCode::Char((alpha as char).to_ascii_lowercase()), modifiers: Modifiers::CTRL, }), ); // ALT A-Z is often sent with a leading ESC let alt = [0x1b, alpha]; map.insert( &alt, InputEvent::Key(KeyEvent { key: KeyCode::Char(alpha as char), modifiers: Modifiers::ALT, }), ); } for c in 0..=0x7fu8 { for (suffix, modifiers) in modifier_combos { // `CSI u` encodings for the ascii range; // see http://www.leonerd.org.uk/hacks/fixterms/ let key = format!("\x1b[{}{}u", c, suffix); map.insert( key, InputEvent::Key(KeyEvent { key: KeyCode::Char(c as char), modifiers: *modifiers, }), ); if !suffix.is_empty() { // xterm modifyOtherKeys sequences let key = format!("\x1b[27{};{}~", suffix, c); map.insert( key, InputEvent::Key(KeyEvent { key: match c { 8 | 0x7f => KeyCode::Backspace, 0x1b => KeyCode::Escape, 9 => KeyCode::Tab, 10 | 13 => KeyCode::Enter, _ => KeyCode::Char(c as char), }, modifiers: *modifiers, }), ); } } } // Common arrow keys for (keycode, dir) in &[ (KeyCode::UpArrow, b'A'), (KeyCode::DownArrow, b'B'), (KeyCode::RightArrow, b'C'), (KeyCode::LeftArrow, b'D'), (KeyCode::Home, b'H'), (KeyCode::End, b'F'), ] { // Arrow keys in normal mode encoded using CSI let arrow = [0x1b, b'[', *dir]; map.insert( &arrow, InputEvent::Key(KeyEvent { key: *keycode, modifiers: Modifiers::NONE, }), ); for (suffix, modifiers) in modifier_combos_including_meta() { let key = format!("\x1b[1{}{}", suffix, *dir as char); map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } for &(keycode, dir) in &[ (KeyCode::UpArrow, b'a'), (KeyCode::DownArrow, b'b'), (KeyCode::RightArrow, b'c'), (KeyCode::LeftArrow, b'd'), ] { // rxvt-specific modified arrows. for &(seq, mods) in &[ ([0x1b, b'[', dir], Modifiers::SHIFT), ([0x1b, b'O', dir], Modifiers::CTRL), ] { map.insert( &seq, InputEvent::Key(KeyEvent { key: keycode, modifiers: mods, }), ); } } for (keycode, dir) in &[ (KeyCode::ApplicationUpArrow, b'A'), (KeyCode::ApplicationDownArrow, b'B'), (KeyCode::ApplicationRightArrow, b'C'), (KeyCode::ApplicationLeftArrow, b'D'), ] { // Arrow keys in application cursor mode encoded using SS3 let app = [0x1b, b'O', *dir]; map.insert( &app, InputEvent::Key(KeyEvent { key: *keycode, modifiers: Modifiers::NONE, }), ); for (suffix, modifiers) in modifier_combos { let key = format!("\x1bO1{}{}", suffix, *dir as char); map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } // Function keys 1-4 with no modifiers encoded using SS3 for (keycode, c) in &[ (KeyCode::Function(1), b'P'), (KeyCode::Function(2), b'Q'), (KeyCode::Function(3), b'R'), (KeyCode::Function(4), b'S'), ] { let key = [0x1b, b'O', *c]; map.insert( &key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: Modifiers::NONE, }), ); } // Function keys 1-4 with modifiers for (keycode, c) in &[ (KeyCode::Function(1), b'P'), (KeyCode::Function(2), b'Q'), (KeyCode::Function(3), b'R'), (KeyCode::Function(4), b'S'), ] { for (suffix, modifiers) in modifier_combos_including_meta() { let key = format!("\x1b[1{suffix}{code}", code = *c as char, suffix = suffix); map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } // Function keys with modifiers encoded using CSI. // http://aperiodic.net/phil/archives/Geekery/term-function-keys.html for (range, offset) in &[ // F1-F5 encoded as 11-15 (1..=5, 10), // F6-F10 encoded as 17-21 (6..=10, 11), // F11-F14 encoded as 23-26 (11..=14, 12), // F15-F16 encoded as 28-29 (15..=16, 13), // F17-F20 encoded as 31-34 (17..=20, 14), ] { for n in range.clone() { for (suffix, modifiers) in modifier_combos_including_meta() { let key = format!("\x1b[{code}{suffix}~", code = n + offset, suffix = suffix); map.insert( key, InputEvent::Key(KeyEvent { key: KeyCode::Function(n), modifiers: *modifiers, }), ); } } } for (keycode, c) in &[ (KeyCode::Insert, b'2'), (KeyCode::Delete, b'3'), (KeyCode::Home, b'1'), (KeyCode::End, b'4'), (KeyCode::PageUp, b'5'), (KeyCode::PageDown, b'6'), // rxvt (KeyCode::Home, b'7'), (KeyCode::End, b'8'), ] { for (suffix, modifiers) in &[ (b'~', Modifiers::NONE), (b'$', Modifiers::SHIFT), (b'^', Modifiers::CTRL), (b'@', Modifiers::SHIFT | Modifiers::CTRL), ] { let key = [0x1b, b'[', *c, *suffix]; map.insert( key, InputEvent::Key(KeyEvent { key: *keycode, modifiers: *modifiers, }), ); } } map.insert( &[0x7f], InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::NONE, }), ); map.insert( &[0x8], InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::NONE, }), ); map.insert( &[0x1b], InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, }), ); map.insert( &[b'\t'], InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[Z", InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::SHIFT, }), ); map.insert( &[b'\r'], InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::NONE, }), ); map.insert( &[b'\n'], InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[200~", InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteStart, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[201~", InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteEnd, modifiers: Modifiers::NONE, }), ); map.insert( b"\x1b[", InputEvent::Key(KeyEvent { key: KeyCode::Char('['), modifiers: Modifiers::ALT, }), ); map } /// Returns the first char from a str and the length of that char /// in *bytes*. fn first_char_and_len(s: &str) -> (char, usize) { let mut iter = s.chars(); let c = iter.next().unwrap(); (c, c.len_utf8()) } /// This is a horrible function to pull off the first unicode character /// from the sequence of bytes and return it and the remaining slice. fn decode_one_char(bytes: &[u8]) -> Option<(char, usize)> { // This has the potential to be an ugly hotspot since the complexity // is a function of the length of the entire buffer rather than the length // of the first char component. A simple mitigation might be to slice off // the first 4 bytes. We pick 4 bytes because the docs for str::len_utf8() // state that the maximum expansion for a `char` is 4 bytes. let bytes = &bytes[..bytes.len().min(4)]; match std::str::from_utf8(bytes) { Ok(s) => { let (c, len) = Self::first_char_and_len(s); Some((c, len)) } Err(err) => { let (valid, _after_valid) = bytes.split_at(err.valid_up_to()); if !valid.is_empty() { let s = unsafe { std::str::from_utf8_unchecked(valid) }; let (c, len) = Self::first_char_and_len(s); Some((c, len)) } else { None } } } } fn dispatch_callback(&mut self, mut callback: F, event: InputEvent) { match (self.state, event) { ( InputState::Normal, InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteStart, .. }), ) => { self.state = InputState::Pasting(0); } ( InputState::EscapeMaybeAlt, InputEvent::Key(KeyEvent { key: KeyCode::InternalPasteStart, .. }), ) => { // The prior ESC was not part of an ALT sequence, so emit // it before we start collecting for paste. callback(InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, })); self.state = InputState::Pasting(0); } (InputState::EscapeMaybeAlt, InputEvent::Key(KeyEvent { key, modifiers })) => { // Treat this as ALT-key self.state = InputState::Normal; callback(InputEvent::Key(KeyEvent { key, modifiers: modifiers | Modifiers::ALT, })); } (InputState::EscapeMaybeAlt, event) => { // The prior ESC was not part of an ALT sequence, so emit // both it and the current event callback(InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, })); callback(event); } (_, event) => callback(event), } } fn process_bytes(&mut self, mut callback: F, maybe_more: bool) { while !self.buf.is_empty() { match self.state { InputState::Pasting(offset) => { let end_paste = b"\x1b[201~"; if let Some(idx) = self.buf.find_subsequence(offset, end_paste) { let pasted = String::from_utf8_lossy(&self.buf.as_slice()[0..idx]).to_string(); self.buf.advance(pasted.len() + end_paste.len()); callback(InputEvent::Paste(pasted)); self.state = InputState::Normal; } else { // Advance our offset so that in the case where we receive a paste that // is spread across N reads of size 8K, we don't need to search for the // end marker in 8K, 16K, 24K etc. of text until the final buffer is received. // Ensure that we use saturating math here for the case where the amount // of buffered data after the begin paste is smaller than the end paste marker // self.state = InputState::Pasting(self.buf.len().saturating_sub(end_paste.len())); return; } } InputState::EscapeMaybeAlt | InputState::Normal => { if self.state == InputState::Normal && self.buf.as_slice()[0] == b'\x1b' { // This feels a bit gross because we have two different parsers at play // here. We want to re-use the escape sequence parser to crack the // parameters out from things like mouse reports. The keymap tree doesn't // know how to grok this. let mut parser = Parser::new(); if let Some((Action::CSI(CSI::Mouse(mouse)), len)) = parser.parse_first(self.buf.as_slice()) { self.buf.advance(len); match mouse { MouseReport::SGR1006 { x, y, button, modifiers, } => { callback(InputEvent::Mouse(MouseEvent { x, y, mouse_buttons: button.into(), modifiers, })); } MouseReport::SGR1016 { x_pixels, y_pixels, button, modifiers, } => { callback(InputEvent::PixelMouse(PixelMouseEvent { x_pixels: x_pixels, y_pixels: y_pixels, mouse_buttons: button.into(), modifiers, })); } } continue; } } match ( self.key_map.lookup(self.buf.as_slice(), maybe_more), maybe_more, ) { // If we got an unambiguous ESC and we have more data to // follow, then this is likely the Meta version of the // following keypress. Buffer up the escape key and // consume it from the input. dispatch_callback() will // emit either the ESC or the ALT modified following key. ( Found::Exact( len, InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, }), ), _, ) if self.state == InputState::Normal && self.buf.len() > len => { self.state = InputState::EscapeMaybeAlt; self.buf.advance(len); } (Found::Exact(len, event), _) | (Found::Ambiguous(len, event), false) => { self.dispatch_callback(&mut callback, event.clone()); self.buf.advance(len); } (Found::Ambiguous(_, _), true) | (Found::NeedData, true) => { return; } (Found::None, _) | (Found::NeedData, false) => { // No pre-defined key, so pull out a unicode character if let Some((c, len)) = Self::decode_one_char(self.buf.as_slice()) { self.buf.advance(len); self.dispatch_callback( &mut callback, InputEvent::Key(KeyEvent { key: KeyCode::Char(c), modifiers: Modifiers::NONE, }), ); } else { // We need more data to recognize the input, so // yield the remainder of the slice return; } } } } } } } /// Push a sequence of bytes into the parser. /// Each time input is recognized, the provided `callback` will be passed /// the decoded `InputEvent`. /// If not enough data are available to fully decode a sequence, the /// remaining data will be buffered until the next call. /// The `maybe_more` flag controls how ambiguous partial sequences are /// handled. The intent is that `maybe_more` should be set to true if /// you believe that you will be able to provide more data momentarily. /// This will cause the parser to defer judgement on partial prefix /// matches. You should attempt to read and pass the new data in /// immediately afterwards. If you have attempted a read and no data is /// immediately available, you should follow up with a call to parse /// with an empty slice and `maybe_more=false` to allow the partial /// data to be recognized and processed. pub fn parse(&mut self, bytes: &[u8], callback: F, maybe_more: bool) { self.buf.extend_with(bytes); self.process_bytes(callback, maybe_more); } pub fn parse_as_vec(&mut self, bytes: &[u8], maybe_more: bool) -> Vec { let mut result = Vec::new(); self.parse(bytes, |event| result.push(event), maybe_more); result } #[cfg(windows)] pub fn decode_input_records_as_vec(&mut self, records: &[INPUT_RECORD]) -> Vec { let mut result = Vec::new(); self.decode_input_records(records, &mut |event| result.push(event)); result } } #[cfg(test)] mod test { use super::*; const NO_MORE: bool = false; const MAYBE_MORE: bool = true; #[test] fn simple() { let mut p = InputParser::new(); let inputs = p.parse_as_vec(b"hello", NO_MORE); assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('h'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('e'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('l'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('l'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('o'), }), ], inputs ); } #[test] fn control_characters() { let mut p = InputParser::new(); let inputs = p.parse_as_vec(b"\x03\x1bJ\x7f", NO_MORE); assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::CTRL, key: KeyCode::Char('c'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::ALT, key: KeyCode::Char('J'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Backspace, }), ], inputs ); } #[test] fn arrow_keys() { let mut p = InputParser::new(); let inputs = p.parse_as_vec(b"\x1bOA\x1bOB\x1bOC\x1bOD", NO_MORE); assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationUpArrow, }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationDownArrow, }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationRightArrow, }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::ApplicationLeftArrow, }), ], inputs ); } #[test] fn partial() { let mut p = InputParser::new(); let mut inputs = Vec::new(); // Fragment this F-key sequence across two different pushes p.parse(b"\x1b[11", |evt| inputs.push(evt), true); p.parse(b"~", |evt| inputs.push(evt), true); // make sure we recognize it as just the F-key assert_eq!( vec![InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Function(1), })], inputs ); } #[test] fn partial_ambig() { let mut p = InputParser::new(); assert_eq!( vec![InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::NONE, })], p.parse_as_vec(b"\x1b", false) ); let mut inputs = Vec::new(); // An incomplete F-key sequence fragmented across two different pushes p.parse(b"\x1b[11", |evt| inputs.push(evt), MAYBE_MORE); p.parse(b"", |evt| inputs.push(evt), NO_MORE); // since we finish with maybe_more false (NO_MORE), the results should be the longest matching // parts of said f-key sequence assert_eq!( vec![ InputEvent::Key(KeyEvent { modifiers: Modifiers::ALT, key: KeyCode::Char('['), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('1'), }), InputEvent::Key(KeyEvent { modifiers: Modifiers::NONE, key: KeyCode::Char('1'), }), ], inputs ); } #[test] fn alt_left_bracket() { // tests that `Alt` + `[` is recognized as a single // event rather than two events (one `Esc` the second `Char('[')`) let mut p = InputParser::new(); let mut inputs = Vec::new(); p.parse(b"\x1b[", |evt| inputs.push(evt), false); assert_eq!( vec![InputEvent::Key(KeyEvent { modifiers: Modifiers::ALT, key: KeyCode::Char('['), }),], inputs ); } #[test] fn modify_other_keys_parse() { let mut p = InputParser::new(); let inputs = p.parse_as_vec( b"\x1b[27;5;13~\x1b[27;5;9~\x1b[27;6;8~\x1b[27;2;127~\x1b[27;6;27~", NO_MORE, ); assert_eq!( vec![ InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::CTRL, }), InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::CTRL, }), InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::CTRL | Modifiers::SHIFT, }), InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::SHIFT, }), InputEvent::Key(KeyEvent { key: KeyCode::Escape, modifiers: Modifiers::CTRL | Modifiers::SHIFT, }), ], inputs ); } #[test] fn modify_other_keys_encode() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; let mode_1 = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: Some(1), }; let mode_2 = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: Some(2), }; assert_eq!( KeyCode::Enter.encode(Modifiers::CTRL, mode, true).unwrap(), "\r".to_string() ); assert_eq!( KeyCode::Enter .encode(Modifiers::CTRL, mode_1, true) .unwrap(), "\x1b[27;5;13~".to_string() ); assert_eq!( KeyCode::Enter .encode(Modifiers::CTRL | Modifiers::SHIFT, mode_1, true) .unwrap(), "\x1b[27;6;13~".to_string() ); // This case is not conformant with xterm! // xterm just returns tab for CTRL-Tab when modify_other_keys // is not set. assert_eq!( KeyCode::Tab.encode(Modifiers::CTRL, mode, true).unwrap(), "\x1b[9;5u".to_string() ); assert_eq!( KeyCode::Tab.encode(Modifiers::CTRL, mode_1, true).unwrap(), "\x1b[27;5;9~".to_string() ); assert_eq!( KeyCode::Tab .encode(Modifiers::CTRL | Modifiers::SHIFT, mode_1, true) .unwrap(), "\x1b[27;6;9~".to_string() ); assert_eq!( KeyCode::Char('c') .encode(Modifiers::CTRL, mode, true) .unwrap(), "\x03".to_string() ); assert_eq!( KeyCode::Char('c') .encode(Modifiers::CTRL, mode_1, true) .unwrap(), "\x03".to_string() ); assert_eq!( KeyCode::Char('c') .encode(Modifiers::CTRL, mode_2, true) .unwrap(), "\x1b[27;5;99~".to_string() ); assert_eq!( KeyCode::Char('1') .encode(Modifiers::CTRL, mode, true) .unwrap(), "1".to_string() ); assert_eq!( KeyCode::Char('1') .encode(Modifiers::CTRL, mode_2, true) .unwrap(), "\x1b[27;5;49~".to_string() ); assert_eq!( KeyCode::Char(',') .encode(Modifiers::CTRL, mode, true) .unwrap(), ",".to_string() ); assert_eq!( KeyCode::Char(',') .encode(Modifiers::CTRL, mode_2, true) .unwrap(), "\x1b[27;5;44~".to_string() ); } #[test] fn encode_issue_892() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; assert_eq!( KeyCode::LeftArrow .encode(Modifiers::NONE, mode, true) .unwrap(), "\x1b[D".to_string() ); assert_eq!( KeyCode::LeftArrow .encode(Modifiers::ALT, mode, true) .unwrap(), "\x1b[1;3D".to_string() ); assert_eq!( KeyCode::Home.encode(Modifiers::NONE, mode, true).unwrap(), "\x1b[H".to_string() ); assert_eq!( KeyCode::Home.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b[1;3H".to_string() ); assert_eq!( KeyCode::End.encode(Modifiers::NONE, mode, true).unwrap(), "\x1b[F".to_string() ); assert_eq!( KeyCode::End.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b[1;3F".to_string() ); assert_eq!( KeyCode::Tab.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b\t".to_string() ); assert_eq!( KeyCode::PageUp.encode(Modifiers::ALT, mode, true).unwrap(), "\x1b[5;3~".to_string() ); assert_eq!( KeyCode::Function(1) .encode(Modifiers::NONE, mode, true) .unwrap(), "\x1bOP".to_string() ); } #[test] fn partial_bracketed_paste() { let mut p = InputParser::new(); let input = b"\x1b[200~1234"; let input2 = b"5678\x1b[201~"; let mut inputs = vec![]; p.parse(input, |e| inputs.push(e), false); p.parse(input2, |e| inputs.push(e), false); assert_eq!(vec![InputEvent::Paste("12345678".to_owned())], inputs) } #[test] fn mouse_horizontal_scroll() { let mut p = InputParser::new(); let input = b"\x1b[<66;42;12M\x1b[<67;42;12M"; let res = p.parse_as_vec(input, MAYBE_MORE); assert_eq!( vec![ InputEvent::Mouse(MouseEvent { x: 42, y: 12, mouse_buttons: MouseButtons::HORZ_WHEEL | MouseButtons::WHEEL_POSITIVE, modifiers: Modifiers::NONE, }), InputEvent::Mouse(MouseEvent { x: 42, y: 12, mouse_buttons: MouseButtons::HORZ_WHEEL, modifiers: Modifiers::NONE, }) ], res ); } #[test] fn encode_issue_3478_xterm() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; assert_eq!( KeyCode::Numpad0 .encode(Modifiers::NONE, mode, true) .unwrap(), "\u{1b}[2~".to_string() ); assert_eq!( KeyCode::Numpad0 .encode(Modifiers::SHIFT, mode, true) .unwrap(), "\u{1b}[2;2~".to_string() ); assert_eq!( KeyCode::Numpad1 .encode(Modifiers::NONE, mode, true) .unwrap(), "\u{1b}[F".to_string() ); assert_eq!( KeyCode::Numpad1 .encode(Modifiers::NONE | Modifiers::SHIFT, mode, true) .unwrap(), "\u{1b}[1;2F".to_string() ); } #[test] fn encode_tab_with_modifiers() { let mode = KeyCodeEncodeModes { encoding: KeyboardEncoding::Xterm, newline_mode: false, application_cursor_keys: false, modify_other_keys: None, }; let mods_to_result = [ (Modifiers::SHIFT, "\u{1b}[Z"), (Modifiers::SHIFT | Modifiers::LEFT_SHIFT, "\u{1b}[Z"), (Modifiers::SHIFT | Modifiers::RIGHT_SHIFT, "\u{1b}[Z"), (Modifiers::CTRL, "\u{1b}[9;5u"), (Modifiers::CTRL | Modifiers::LEFT_CTRL, "\u{1b}[9;5u"), (Modifiers::CTRL | Modifiers::RIGHT_CTRL, "\u{1b}[9;5u"), ( Modifiers::SHIFT | Modifiers::CTRL | Modifiers::LEFT_CTRL | Modifiers::LEFT_SHIFT, "\u{1b}[1;5Z", ), ]; for (mods, result) in mods_to_result { assert_eq!( KeyCode::Tab.encode(mods, mode, true).unwrap(), result, "{:?}", mods ); } } } termwiz-0.22.0/src/istty.rs000064400000000000000000000022031046102023000137140ustar 00000000000000//! Making it a little more convenient and safe to query whether //! something is a terminal teletype or not. //! This module defines the IsTty trait and the is_tty method to //! return true if the item represents a terminal. #[cfg(unix)] use std::os::unix::io::AsRawFd; #[cfg(windows)] use std::os::windows::io::AsRawHandle; #[cfg(windows)] use winapi::um::consoleapi::GetConsoleMode; /// Adds the is_tty method to types that might represent a terminal pub trait IsTty { /// Returns true if the instance is a terminal teletype, false /// otherwise. fn is_tty(&self) -> bool; } /// On unix, the `isatty()` library function returns true if a file /// descriptor is a terminal. Let's implement `IsTty` for anything /// that has an associated raw file descriptor. #[cfg(unix)] impl IsTty for S { fn is_tty(&self) -> bool { let fd = self.as_raw_fd(); unsafe { libc::isatty(fd) == 1 } } } #[cfg(windows)] impl IsTty for S { fn is_tty(&self) -> bool { let mut mode = 0; let ok = unsafe { GetConsoleMode(self.as_raw_handle() as *mut _, &mut mode) }; ok == 1 } } termwiz-0.22.0/src/keymap.rs000064400000000000000000000225411046102023000140350ustar 00000000000000//! A datastructure for holding key map entries use std::fmt::Debug; #[derive(Debug, Clone)] struct Node { label: u8, children: Vec>, value: Option, } impl Node { fn new(label: u8) -> Self { Self { label, children: Vec::new(), value: None, } } fn insert(&mut self, key: &[u8], value: Value) { if key.is_empty() { // We've reached the leaf self.value = Some(value); return; } match self .children .binary_search_by(|node| node.label.cmp(&key[0])) { Ok(idx) => { self.children[idx].insert(&key[1..], value); } Err(idx) => { self.children.insert(idx, Node::new(key[0])); self.children[idx].insert(&key[1..], value); } } } fn lookup(&self, key: &[u8], depth: usize, maybe_more: bool) -> NodeFind<&Value> { if key.is_empty() { // We've matched the maximum extent of the input key. if self.children.is_empty() { match self.value.as_ref() { Some(value) => { // An unambiguous match for the entire input return NodeFind::Exact(depth, value); } None => panic!("Node has no children and no value!?"), } } return match self.value.as_ref() { Some(value) => { if maybe_more { NodeFind::AmbiguousMatch(depth, value) } else { NodeFind::Exact(depth, value) } } None => NodeFind::AmbiguousBackTrack, }; } match self .children .binary_search_by(|node| node.label.cmp(&key[0])) { Ok(idx) => { match self.children[idx].lookup(&key[1..], depth + 1, maybe_more) { NodeFind::AmbiguousBackTrack => { // The child didn't have an exact match, so check // whether we do match self.value.as_ref() { Some(value) => { // We do! If we're expecting more, let's return an AmbiguousMatch, // otherwise, let's treat this as an Exact match // // see the "lookup_with_multiple_ambiguous_matches_" // test cases in this file for an example if maybe_more { NodeFind::AmbiguousMatch(depth, value) } else { NodeFind::Exact(depth, value) } } None => NodeFind::AmbiguousBackTrack, } } result => result, } } Err(_) => { if depth == 0 { NodeFind::None } else { match self.value.as_ref() { Some(value) => NodeFind::Exact(depth, value), None => NodeFind::AmbiguousBackTrack, } } } } } } /// Internal lookup disposition enum NodeFind { /// No possible matches None, /// Found an exact match. (match-len, value) Exact(usize, Value), /// Didn't find an exact match at the full extent of the key, /// so ask the upper layer to back track to find a partial. AmbiguousBackTrack, /// After backtracking, found a prefix match, but we know that /// there might be a more specific match given more data. (match-len, /// value). AmbiguousMatch(usize, Value), } /// Holds the result of a lookup operation #[derive(Debug, Clone, PartialEq, Eq)] pub enum Found { /// There are definitively no possible matches None, /// We found an unambiguous match. /// The data is (length-of-match, value) Exact(usize, Value), /// We found a match, but there are other longer matches /// that are possible. Ideally we'd accumulate more data /// to know for sure. /// The data is (length-of-shortest-match, value) Ambiguous(usize, Value), /// If we had more data, we might match something NeedData, } /// The `KeyMap` struct is intended to hold the text sequences /// generated by unix terminal programs. Those sequences have /// overlapping/ambiguous meaning which requires having more /// data to correctly interpret the sequence. /// The `lookup` operation returns an enum describing the /// confidence of a match rather than a simple map lookup. #[derive(Debug, Clone)] pub struct KeyMap { root: Node, } impl Default for KeyMap { fn default() -> Self { Self::new() } } impl KeyMap { pub fn new() -> Self { Self { root: Node::new(0) } } /// Insert a value into the keymap pub fn insert>(&mut self, key: K, value: Value) { self.root.insert(key.as_ref(), value) } /// Perform a lookup for `key`. /// `key` can be a string consisting of a sequence of bytes. /// The `lookup` operation considers the prefix of `key` and searches /// for a match. /// /// If `Found::None` is returned then the prefix for key has no matching /// keymap entry. /// /// If `Found::Exact` is returned then the returned value informs the caller /// of the length of the key that was matched; the remainder of the key /// was not considered and is something that should be considered again /// in a subsequent lookup operation. /// /// If `Found::Ambiguous` is returned then the key matched a valid /// entry (which is returned as the value), but there is at least one /// other entry that could match if more data were available. If the caller /// knows that no more data is available immediately then it may be valid /// to treat this result as equivalent to `Found::Exact`. The intended /// use for this variant is to handle the case where a sequence straddles /// a buffer boundary (eg: fixed size buffer receives a partial sequence, /// and the remainder is immediately available on the next read) without /// misinterpreting the read data. /// /// If `Found::NeedData` is returned it indicates that `key` is too short /// to determine a match. The purpose is similar to the `Found::Ambiguous` /// case; if the caller knows that no more data is available this can be /// treated as `Found::None`, but otherwise it would be best to read more /// data from the stream and retry with a longer input. pub fn lookup>(&self, key: S, maybe_more: bool) -> Found { match self.root.lookup(key.as_ref(), 0, maybe_more) { NodeFind::None => Found::None, NodeFind::AmbiguousBackTrack => Found::NeedData, NodeFind::Exact(depth, value) => Found::Exact(depth, value.clone()), NodeFind::AmbiguousMatch(depth, value) => Found::Ambiguous(depth, value.clone()), } } } #[cfg(test)] mod test { use super::*; const NO_MORE: bool = false; const MAYBE_MORE: bool = true; #[test] fn lookup_empty() { let km: KeyMap = KeyMap::new(); assert_eq!(km.lookup("boo", true), Found::None); } #[test] fn lookup() { let mut km = KeyMap::new(); km.insert("boa", true); km.insert("boo", true); km.insert("boom", false); assert_eq!(km.lookup("b", MAYBE_MORE), Found::NeedData); assert_eq!(km.lookup("bo", MAYBE_MORE), Found::NeedData); assert_eq!(km.lookup("boa", MAYBE_MORE), Found::Exact(3, true),); assert_eq!(km.lookup("boo", MAYBE_MORE), Found::Ambiguous(3, true),); assert_eq!(km.lookup("boom", MAYBE_MORE), Found::Exact(4, false),); assert_eq!(km.lookup("boom!", MAYBE_MORE), Found::Exact(4, false),); } #[test] fn lookup_with_multiple_ambiguous_matches_without_additional_input() { let mut km = KeyMap::new(); km.insert("boa", false); km.insert("boo", false); km.insert("boom", true); km.insert("boom!!", false); assert_eq!(km.lookup("boom!", NO_MORE), Found::Exact(4, true)); } #[test] fn lookup_with_multiple_ambiguous_matches_with_potential_additional_input() { let mut km = KeyMap::new(); km.insert("boa", false); km.insert("boo", false); km.insert("boom", true); km.insert("boom!!", false); assert_eq!(km.lookup("boom!", MAYBE_MORE), Found::Ambiguous(4, true)); } #[test] fn sequence() { let mut km = KeyMap::new(); km.insert("\x03", true); km.insert("\x27", true); km.insert("\x03XYZ", true); assert_eq!(km.lookup("\x03", MAYBE_MORE), Found::Ambiguous(1, true),); assert_eq!(km.lookup("\x03foo", MAYBE_MORE), Found::Exact(1, true),); assert_eq!(km.lookup("\x03X", MAYBE_MORE), Found::Ambiguous(1, true),); } } termwiz-0.22.0/src/lib.rs000064400000000000000000000046071046102023000133200ustar 00000000000000//! # Terminal Wizardry //! //! This is a rust crate that provides a number of support functions //! for applications interested in either displaying data to a terminal //! or in building a terminal emulator. //! //! It is currently in active development and subject to fairly wild //! sweeping changes. //! //! Included functionality: //! //! * `Surface` models a terminal display and its component `Cell`s //! * Terminal attributes are aware of modern features such as //! True Color, [Hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda) //! and will also support sixel and iterm style terminal graphics display. //! * `Surface`s include a log of `Change`s and an API for consuming //! and applying deltas. This is a powerful building block for //! synchronizing screen instances. //! * Escape sequence parser decodes inscrutable escape sequences //! and gives them semantic meaning, making the code that uses //! them clearer. The decoded escapes can be re-encoded, allowing //! applications to start with the semantic meaning and emit //! the appropriate escape sequence without embedding obscure //! binary bytes. //! * `Capabilities` allows probing for terminal capabilities //! that may not be included in the system terminfo database, //! and overriding them in an embedding application. //! * `Terminal` trait provides an abstraction over unix style ttys //! and Windows style console APIs. `Change`s from `Surface` //! can be rendered to `Terminal`s. `Terminal`s allow decoding //! mouse and keyboard inputs in both blocking or non-blocking //! mode. //! * `Widget` trait allows composition of UI elements at a higher //! level. //! * `LineEditor` provides line editing facilities similar to those //! in the unix shell. //! //! ## Features //! //! * `widgets` - enables the widget layout and related traits //! * `use_serde` - makes a number of structs serde serializable mod emoji; mod emoji_presentation; mod emoji_variation; mod widechar_width; pub mod caps; pub mod cell; pub mod cellcluster; pub mod color; pub mod error; pub mod escape; pub mod hyperlink; pub mod image; pub mod input; pub mod istty; pub mod keymap; pub mod lineedit; mod macros; pub mod nerdfonts; mod nerdfonts_data; mod readbuf; pub mod render; pub mod surface; pub mod terminal; pub mod tmux_cc; #[cfg(feature = "widgets")] pub mod widgets; pub use error::{Context, Error, Result}; termwiz-0.22.0/src/lineedit/actions.rs000064400000000000000000000011601046102023000157760ustar 00000000000000pub type RepeatCount = usize; #[derive(Debug, Clone, Copy)] pub enum Movement { BackwardChar(RepeatCount), BackwardWord(RepeatCount), ForwardChar(RepeatCount), ForwardWord(RepeatCount), StartOfLine, EndOfLine, None, } #[derive(Debug, Clone)] pub enum Action { AcceptLine, Cancel, EndOfFile, InsertChar(RepeatCount, char), InsertText(RepeatCount, String), Repaint, Move(Movement), Kill(Movement), KillAndMove(Movement, Movement), HistoryPrevious, HistoryNext, Complete, NoAction, HistoryIncSearchBackwards, HistoryIncSearchForwards, } termwiz-0.22.0/src/lineedit/history.rs000064400000000000000000000074011046102023000160430ustar 00000000000000use std::borrow::Cow; use std::collections::VecDeque; /// Represents a position within the history. /// Smaller numbers are assumed to be before larger numbers, /// and the indices are assumed to be contiguous. pub type HistoryIndex = usize; /// Defines the history interface for the line editor. pub trait History { /// Lookup the line corresponding to an index. fn get(&self, idx: HistoryIndex) -> Option>; /// Return the index for the most recently added entry. fn last(&self) -> Option; /// Add an entry. /// Note that the LineEditor will not automatically call /// the add method. fn add(&mut self, line: &str); /// Search for a matching entry relative to the specified history index. fn search( &self, idx: HistoryIndex, style: SearchStyle, direction: SearchDirection, pattern: &str, ) -> Option; } #[derive(Debug, Clone, Eq, PartialEq)] pub struct SearchResult<'a> { pub line: Cow<'a, str>, pub idx: HistoryIndex, pub cursor: usize, } #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum SearchStyle { Substring, } impl SearchStyle { /// Matches pattern against line, returning the byte index of the /// first matching character pub fn match_against(&self, pattern: &str, line: &str) -> Option { match self { Self::Substring => line.find(pattern), } } } /// Encodes the direction the search should take, relative to the /// current HistoryIndex. #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum SearchDirection { /// The search goes backwards towards the smaller HistoryIndex values /// at the beginning of history. Backwards, /// The search goes forwards towarrds the larger HistoryIndex values /// at the end of history. Forwards, } impl SearchDirection { /// Given a history index, compute the next value in the /// encoded search directory. /// Returns `None` if the search would overflow. pub fn next(self, idx: HistoryIndex) -> Option { let (next, overflow) = match self { Self::Backwards => idx.overflowing_sub(1), Self::Forwards => idx.overflowing_add(1), }; if overflow { None } else { Some(next) } } } /// A simple history implementation that holds entries in memory. #[derive(Default)] pub struct BasicHistory { entries: VecDeque, } impl History for BasicHistory { fn get(&self, idx: HistoryIndex) -> Option> { self.entries.get(idx).map(|s| Cow::Borrowed(s.as_str())) } fn last(&self) -> Option { if self.entries.is_empty() { None } else { Some(self.entries.len() - 1) } } fn add(&mut self, line: &str) { if self.entries.back().map(String::as_str) == Some(line) { // Ignore duplicates return; } self.entries.push_back(line.to_owned()); } fn search( &self, idx: HistoryIndex, style: SearchStyle, direction: SearchDirection, pattern: &str, ) -> Option { let mut idx = idx; loop { let line = match self.entries.get(idx) { Some(line) => line, None => return None, }; if let Some(cursor) = style.match_against(pattern, line) { return Some(SearchResult { line: Cow::Borrowed(line.as_str()), idx, cursor, }); } idx = match direction.next(idx) { None => return None, Some(idx) => idx, }; } } } termwiz-0.22.0/src/lineedit/host.rs000064400000000000000000000123051046102023000153160ustar 00000000000000use crate::cell::{AttributeChange, CellAttributes}; use crate::input::InputEvent; use crate::lineedit::actions::Action; use crate::lineedit::{BasicHistory, History, LineEditor}; use crate::surface::Change; /// The `OutputElement` type allows returning graphic attribute changes /// as well as textual output. pub enum OutputElement { /// Change a single attribute Attribute(AttributeChange), /// Change all possible attributes to the given set of values AllAttributes(CellAttributes), /// Printable text. /// Control characters are rendered inert by transforming them /// to space. CR and LF characters are interpreted by moving /// the cursor position. CR moves the cursor to the start of /// the line and LF moves the cursor down to the next line. /// You typically want to use both together when sending in /// a line break. Text(String), } impl Into for OutputElement { fn into(self) -> Change { match self { OutputElement::Attribute(a) => Change::Attribute(a), OutputElement::AllAttributes(a) => Change::AllAttributes(a), OutputElement::Text(t) => Change::Text(t), } } } /// The `LineEditorHost` trait allows an embedding application to influence /// how the line editor functions. /// A concrete implementation of the host with neutral defaults is provided /// as `NopLineEditorHost`. pub trait LineEditorHost { /// Given a prompt string, return the rendered form of the prompt as /// a sequence of `OutputElement` instances. /// The implementation is free to interpret the prompt string however /// it chooses; for instance, the application can opt to expand its own /// application specific escape sequences as it sees fit. /// The `OutputElement` type allows returning graphic attribute changes /// as well as textual output. /// The default implementation returns the prompt as-is with no coloring /// and no textual transformation. fn render_prompt(&self, prompt: &str) -> Vec { vec![OutputElement::Text(prompt.to_owned())] } /// Given a reference to the current line being edited, render a preview /// of its outcome. The preview is cleared when the input is accepted, /// or canceled. fn render_preview(&self, _line: &str) -> Vec { Vec::new() } /// Given a reference to the current line being edited and the position /// of the cursor, return the rendered form of the line as a sequence /// of `OutputElement` instances. /// While this interface technically allows returning arbitrary Text sequences, /// the application should preserve the column positions of the graphemes, /// otherwise the terminal cursor position won't match up to the correct /// location. /// The `OutputElement` type allows returning graphic attribute changes /// as well as textual output. /// The default implementation returns the line as-is with no coloring. fn highlight_line(&self, line: &str, cursor_position: usize) -> (Vec, usize) { let cursor_x_pos = crate::cell::unicode_column_width(&line[0..cursor_position], None); (vec![OutputElement::Text(line.to_owned())], cursor_x_pos) } /// Returns the history implementation fn history(&mut self) -> &mut dyn History; /// Tab completion support. /// The line and current cursor position are provided and it is up to the /// embedding application to produce a list of completion candidates. /// The default implementation is an empty list. fn complete(&self, _line: &str, _cursor_position: usize) -> Vec { vec![] } /// Allows the embedding application an opportunity to override or /// remap keys to alternative actions. /// Return `None` to indicate that the default keymap processing /// should occur. /// Otherwise return an `Action` enum variant indicating the action /// that should be taken. /// Use `Some(Action::NoAction)` to indicate that no action should be taken. /// `editor` is provided so that your application can implement custom /// actions and apply them to the editor buffer. Use `LineEditor::get_line_and_cursor` /// and `LineEditor::set_line_and_cursor` for that and return `Some(Action::NoAction)` /// to prevent any default action from being taken. fn resolve_action(&mut self, _event: &InputEvent, _editor: &mut LineEditor) -> Option { None } } /// A candidate for tab completion. /// If the line and cursor look like "why he" and if "hello" is a valid /// completion of "he" in that context, then the corresponding CompletionCandidate /// would have its range set to [4..6] (the "he" slice range) and its text /// set to "hello". pub struct CompletionCandidate { /// The section of the input line to be replaced pub range: std::ops::Range, /// The replacement text pub text: String, } /// A concrete implementation of `LineEditorHost` that uses the default behaviors. #[derive(Default)] pub struct NopLineEditorHost { history: BasicHistory, } impl LineEditorHost for NopLineEditorHost { fn history(&mut self) -> &mut dyn History { &mut self.history } } termwiz-0.22.0/src/lineedit/mod.rs000064400000000000000000001056041046102023000151250ustar 00000000000000//! The `LineEditor` struct provides line editing facilities similar //! to those in the unix shell. //! //! ```no_run //! use termwiz::lineedit::{line_editor_terminal, NopLineEditorHost, LineEditor}; //! //! fn main() -> termwiz::Result<()> { //! let mut terminal = line_editor_terminal()?; //! let mut editor = LineEditor::new(&mut terminal); //! let mut host = NopLineEditorHost::default(); //! //! let line = editor.read_line(&mut host)?; //! println!("read line: {:?}", line); //! //! Ok(()) //! } //! ``` //! //! ## Key Bindings //! //! The following key bindings are supported: //! //! Keystroke | Action //! --------- | ------ //! Ctrl-A, Home | Move cursor to the beginning of the line //! Ctrl-E, End | Move cursor to the end of the line //! Ctrl-B, Left | Move cursor one grapheme to the left //! Ctrl-C | Cancel the line editor //! Ctrl-D | Cancel the line editor with an End-of-File result //! Ctrl-F, Right | Move cursor one grapheme to the right //! Ctrl-H, Backspace | Delete the grapheme to the left of the cursor //! Delete | Delete the grapheme to the right of the cursor //! Ctrl-J, Ctrl-M, Enter | Finish line editing and accept the current line //! Ctrl-K | Delete from cursor to end of line //! Ctrl-L | Move the cursor to the top left, clear screen and repaint //! Ctrl-R | Incremental history search mode //! Ctrl-W | Delete word leading up to cursor //! Alt-b, Alt-Left | Move the cursor backwards one word //! Alt-f, Alt-Right | Move the cursor forwards one word use crate::caps::{Capabilities, ProbeHints}; use crate::input::{InputEvent, KeyCode, KeyEvent, Modifiers}; use crate::surface::change::ChangeSequence; use crate::surface::{Change, Position}; use crate::terminal::{new_terminal, Terminal}; use crate::{bail, ensure, Result}; use unicode_segmentation::GraphemeCursor; mod actions; mod history; mod host; pub use actions::{Action, Movement, RepeatCount}; pub use history::*; pub use host::*; /// The `LineEditor` struct provides line editing facilities similar /// to those in the unix shell. /// ```no_run /// use termwiz::lineedit::{line_editor_terminal, NopLineEditorHost, LineEditor}; /// /// fn main() -> termwiz::Result<()> { /// let mut terminal = line_editor_terminal()?; /// let mut editor = LineEditor::new(&mut terminal); /// let mut host = NopLineEditorHost::default(); /// /// let line = editor.read_line(&mut host)?; /// println!("read line: {:?}", line); /// /// Ok(()) /// } /// ``` pub struct LineEditor<'term> { terminal: &'term mut dyn Terminal, prompt: String, line: String, /// byte index into the UTF-8 string data of the insertion /// point. This is NOT the number of graphemes! cursor: usize, history_pos: Option, bottom_line: Option, completion: Option, move_to_editor_start: Option, move_to_editor_end: Option, state: EditorState, } #[derive(Clone, Eq, PartialEq, Debug)] enum EditorState { Inactive, Editing, Cancelled, Accepted, Searching { style: SearchStyle, direction: SearchDirection, matching_line: String, cursor: usize, }, } struct CompletionState { candidates: Vec, index: usize, original_line: String, original_cursor: usize, } impl CompletionState { fn next(&mut self) { self.index += 1; if self.index >= self.candidates.len() { self.index = 0; } } fn current(&self) -> (usize, String) { let mut line = self.original_line.clone(); let candidate = &self.candidates[self.index]; line.replace_range(candidate.range.clone(), &candidate.text); // To figure the new cursor position do a little math: // "he" when the completion is "hello" will set the completion // candidate to replace "he" with "hello", so the difference in the // lengths of these two is how far the cursor needs to move. let range_len = candidate.range.end - candidate.range.start; let new_cursor = self.original_cursor + candidate.text.len() - range_len; (new_cursor, line) } } impl<'term> LineEditor<'term> { /// Create a new line editor. /// In most cases, you'll want to use the `line_editor` function, /// because it creates a `Terminal` instance with the recommended /// settings, but if you need to decompose that for some reason, /// this snippet shows the recommended way to create a line /// editor: /// /// ```no_run /// use termwiz::caps::{Capabilities, ProbeHints}; /// use termwiz::terminal::new_terminal; /// use termwiz::Error; /// // Disable mouse input in the line editor /// let hints = ProbeHints::new_from_env() /// .mouse_reporting(Some(false)); /// let caps = Capabilities::new_with_hints(hints)?; /// let terminal = new_terminal(caps)?; /// # Ok::<(), Error>(()) /// ``` pub fn new(terminal: &'term mut dyn Terminal) -> Self { Self { terminal, prompt: "> ".to_owned(), line: String::new(), cursor: 0, history_pos: None, bottom_line: None, completion: None, move_to_editor_start: None, move_to_editor_end: None, state: EditorState::Inactive, } } fn render(&mut self, host: &mut dyn LineEditorHost) -> Result<()> { let screen_size = self.terminal.get_screen_size()?; let mut changes = ChangeSequence::new(screen_size.rows, screen_size.cols); changes.add(Change::ClearToEndOfScreen(Default::default())); changes.add(Change::AllAttributes(Default::default())); for ele in host.render_prompt(&self.prompt) { changes.add(ele); } changes.add(Change::AllAttributes(Default::default())); // If we're searching, the input area shows the match rather than the input, // and the cursor moves to the first matching character let (line_to_display, cursor) = match &self.state { EditorState::Searching { matching_line, cursor, .. } => (matching_line, *cursor), _ => (&self.line, self.cursor), }; let cursor_position_after_printing_prompt = changes.current_cursor_position(); let (elements, cursor_x_pos) = host.highlight_line(line_to_display, cursor); // Calculate what the cursor position would be after printing X columns // of text from the specified location. // Returns (x, y) of the resultant cursor position. fn compute_cursor_after_printing_x_columns( cursor_x: usize, cursor_y: isize, delta: usize, screen_cols: usize, ) -> (usize, isize) { let y = (cursor_x + delta) / screen_cols; let x = (cursor_x + delta) % screen_cols; let row = cursor_y + y as isize; let col = x.max(0) as usize; (col, row) } let cursor_position = compute_cursor_after_printing_x_columns( cursor_position_after_printing_prompt.0, cursor_position_after_printing_prompt.1, cursor_x_pos, screen_size.cols, ); for ele in elements { changes.add(ele); } let cursor_after_line_render = changes.current_cursor_position(); if cursor_after_line_render.0 == screen_size.cols { // If the cursor position remains in the first column // then the renderer may still consider itself to be on // the prior line; force out an additional character to force // it to apply wrapping/flush. changes.add(" "); } if let EditorState::Editing = &self.state { let preview_elements = host.render_preview(line_to_display); if !preview_elements.is_empty() { // Preview starts from a new line. changes.add("\r\n"); // Do not be affected by attributes set by highlight_line. changes.add(Change::AllAttributes(Default::default())); for ele in preview_elements { changes.add(ele); } } } if let EditorState::Searching { style, direction, .. } = &self.state { // We want to draw the search state below the input area let label = match (style, direction) { (SearchStyle::Substring, SearchDirection::Backwards) => "bck-i-search", (SearchStyle::Substring, SearchDirection::Forwards) => "fwd-i-search", }; // Do not be affected by attributes set by previous lines. changes.add(Change::AllAttributes(Default::default())); // We position the actual cursor on the matching portion of // the text in the line editing area, but since the input // is drawn here, we render an `_` to indicate where the input // position really is. changes.add(format!("\r\n{}: {}_", label, self.line)); } // Add some debugging status at the bottom /* changes.add(format!( "\r\n{:?} {:?}", cursor_position, (changes.cursor_x, changes.cursor_y) )); */ let render_height = changes.render_height(); changes.move_to(cursor_position); let mut changes = changes.consume(); if let Some(start) = self.move_to_editor_start.take() { changes.insert(0, start); } self.terminal.render(&changes)?; self.move_to_editor_start.replace(Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(-1 * cursor_position.1), }); self.move_to_editor_end.replace(Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1 + render_height as isize - cursor_position.1), }); Ok(()) } pub fn set_prompt(&mut self, prompt: &str) { self.prompt = prompt.to_owned(); } /// Enter line editing mode. /// Control is not returned to the caller until a line has been /// accepted, or until an error is detected. /// Returns Ok(None) if the editor was cancelled eg: via CTRL-C. pub fn read_line(&mut self, host: &mut dyn LineEditorHost) -> Result> { ensure!( self.state == EditorState::Inactive, "recursive call to read_line!" ); // Clear out the last render info so that we don't over-compensate // on the first call to render(). self.move_to_editor_end.take(); self.move_to_editor_start.take(); self.terminal.set_raw_mode()?; self.state = EditorState::Editing; let res = self.read_line_impl(host); self.state = EditorState::Inactive; if let Some(move_end) = self.move_to_editor_end.take() { self.terminal .render(&[move_end, Change::ClearToEndOfScreen(Default::default())])?; } self.terminal.flush()?; self.terminal.set_cooked_mode()?; res } fn resolve_action( &mut self, event: &InputEvent, host: &mut dyn LineEditorHost, ) -> Option { if let Some(action) = host.resolve_action(event, self) { return Some(action); } match event { InputEvent::Key(KeyEvent { key: KeyCode::Char('C'), modifiers: Modifiers::CTRL, }) => Some(Action::Cancel), InputEvent::Key(KeyEvent { key: KeyCode::Tab, modifiers: Modifiers::NONE, }) => Some(Action::Complete), InputEvent::Key(KeyEvent { key: KeyCode::Char('D'), modifiers: Modifiers::CTRL, }) => Some(Action::EndOfFile), InputEvent::Key(KeyEvent { key: KeyCode::Char('J'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Char('M'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Enter, modifiers: Modifiers::NONE, }) => Some(Action::AcceptLine), InputEvent::Key(KeyEvent { key: KeyCode::Char('H'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Backspace, modifiers: Modifiers::NONE, }) => Some(Action::Kill(Movement::BackwardChar(1))), InputEvent::Key(KeyEvent { key: KeyCode::Delete, modifiers: Modifiers::NONE, }) => Some(Action::KillAndMove( Movement::ForwardChar(1), Movement::None, )), InputEvent::Key(KeyEvent { key: KeyCode::Char('P'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::UpArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationUpArrow, modifiers: Modifiers::NONE, }) => Some(Action::HistoryPrevious), InputEvent::Key(KeyEvent { key: KeyCode::Char('N'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::DownArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationDownArrow, modifiers: Modifiers::NONE, }) => Some(Action::HistoryNext), InputEvent::Key(KeyEvent { key: KeyCode::Char('B'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationLeftArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::LeftArrow, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::BackwardChar(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('W'), modifiers: Modifiers::CTRL, }) => Some(Action::Kill(Movement::BackwardWord(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('b'), modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::LeftArrow, modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationLeftArrow, modifiers: Modifiers::ALT, }) => Some(Action::Move(Movement::BackwardWord(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('f'), modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::RightArrow, modifiers: Modifiers::ALT, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationRightArrow, modifiers: Modifiers::ALT, }) => Some(Action::Move(Movement::ForwardWord(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char('A'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::Home, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::StartOfLine)), InputEvent::Key(KeyEvent { key: KeyCode::Char('E'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::End, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::EndOfLine)), InputEvent::Key(KeyEvent { key: KeyCode::Char('F'), modifiers: Modifiers::CTRL, }) | InputEvent::Key(KeyEvent { key: KeyCode::RightArrow, modifiers: Modifiers::NONE, }) | InputEvent::Key(KeyEvent { key: KeyCode::ApplicationRightArrow, modifiers: Modifiers::NONE, }) => Some(Action::Move(Movement::ForwardChar(1))), InputEvent::Key(KeyEvent { key: KeyCode::Char(c), modifiers: Modifiers::SHIFT, }) | InputEvent::Key(KeyEvent { key: KeyCode::Char(c), modifiers: Modifiers::NONE, }) => Some(Action::InsertChar(1, *c)), InputEvent::Paste(text) => Some(Action::InsertText(1, text.clone())), InputEvent::Key(KeyEvent { key: KeyCode::Char('L'), modifiers: Modifiers::CTRL, }) => Some(Action::Repaint), InputEvent::Key(KeyEvent { key: KeyCode::Char('K'), modifiers: Modifiers::CTRL, }) => Some(Action::Kill(Movement::EndOfLine)), InputEvent::Key(KeyEvent { key: KeyCode::Char('R'), modifiers: Modifiers::CTRL, }) => Some(Action::HistoryIncSearchBackwards), // This is the common binding for forwards, but it is usually // masked by the stty stop setting InputEvent::Key(KeyEvent { key: KeyCode::Char('S'), modifiers: Modifiers::CTRL, }) => Some(Action::HistoryIncSearchForwards), _ => None, } } /// Compute the cursor position after applying movement fn eval_movement(&self, movement: Movement) -> usize { match movement { Movement::BackwardChar(rep) => { let mut position = self.cursor; for _ in 0..rep { let mut cursor = GraphemeCursor::new(position, self.line.len(), false); if let Ok(Some(pos)) = cursor.prev_boundary(&self.line, 0) { position = pos; } else { break; } } position } Movement::BackwardWord(rep) => { let char_indices: Vec<(usize, char)> = self.line.char_indices().collect(); if char_indices.is_empty() { return self.cursor; } let mut char_position = char_indices .iter() .position(|(idx, _)| *idx == self.cursor) .unwrap_or(char_indices.len() - 1); for _ in 0..rep { if char_position == 0 { break; } let mut found = None; for prev in (0..char_position - 1).rev() { if char_indices[prev].1.is_whitespace() { found = Some(prev + 1); break; } } char_position = found.unwrap_or(0); } char_indices[char_position].0 } Movement::ForwardWord(rep) => { let char_indices: Vec<(usize, char)> = self.line.char_indices().collect(); if char_indices.is_empty() { return self.cursor; } let mut char_position = char_indices .iter() .position(|(idx, _)| *idx == self.cursor) .unwrap_or_else(|| char_indices.len()); for _ in 0..rep { // Skip any non-whitespace characters while char_position < char_indices.len() && !char_indices[char_position].1.is_whitespace() { char_position += 1; } // Skip any whitespace characters while char_position < char_indices.len() && char_indices[char_position].1.is_whitespace() { char_position += 1; } // We are now on the start of the next word } char_indices .get(char_position) .map(|(i, _)| *i) .unwrap_or_else(|| self.line.len()) } Movement::ForwardChar(rep) => { let mut position = self.cursor; for _ in 0..rep { let mut cursor = GraphemeCursor::new(position, self.line.len(), false); if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) { position = pos; } else { break; } } position } Movement::StartOfLine => 0, Movement::EndOfLine => { let mut cursor = GraphemeCursor::new(self.line.len().saturating_sub(1), self.line.len(), false); if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) { pos } else { self.cursor } } Movement::None => self.cursor, } } fn kill_text(&mut self, kill_movement: Movement, move_movement: Movement) { self.clear_completion(); let kill_pos = self.eval_movement(kill_movement); let new_cursor = self.eval_movement(move_movement); let (lower, upper) = if kill_pos < self.cursor { (kill_pos, self.cursor) } else { (self.cursor, kill_pos) }; self.line.replace_range(lower..upper, ""); // Clamp to the line length, otherwise a kill to end of line // command will leave the cursor way off beyond the end of // the line. self.cursor = new_cursor.min(self.line.len()); } fn clear_completion(&mut self) { self.completion = None; } fn cancel_search_state(&mut self) { if let EditorState::Searching { matching_line, cursor, .. } = &self.state { self.line = matching_line.to_string(); self.cursor = *cursor; self.state = EditorState::Editing; } } /// Returns the current line and cursor position. /// You don't normally need to call this unless you are defining /// a custom editor operation on the line buffer contents. /// The cursor position is the byte index into the line UTF-8 bytes. pub fn get_line_and_cursor(&mut self) -> (&str, usize) { (&self.line, self.cursor) } /// Sets the current line and cursor position. /// You don't normally need to call this unless you are defining /// a custom editor operation on the line buffer contents. /// The cursor position is the byte index into the line UTF-8 bytes. /// Panics: the cursor must be within the bounds of the provided line. pub fn set_line_and_cursor(&mut self, line: &str, cursor: usize) { assert!( cursor < line.len(), "cursor {} is outside the byte length of the new line of length {}", cursor, line.len() ); self.line = line.to_string(); self.cursor = cursor; } /// Call this after changing modifying the line buffer. /// If the editor is in search mode this will update the search /// results, otherwise it will be a NOP. fn reapply_search_pattern(&mut self, host: &mut dyn LineEditorHost) { if let EditorState::Searching { style, direction, matching_line, cursor, } = &self.state { // We always start again from the bottom self.history_pos.take(); let history_pos = match host.history().last() { Some(p) => p, None => { // TODO: there's no way we can match anything. // Generate a failed match result? return; } }; let last_matching_line; let last_cursor; if let Some(result) = host .history() .search(history_pos, *style, *direction, &self.line) { self.history_pos.replace(result.idx); last_matching_line = result.line.to_string(); last_cursor = result.cursor; } else { last_matching_line = matching_line.clone(); last_cursor = *cursor; } self.state = EditorState::Searching { style: *style, direction: *direction, matching_line: last_matching_line, cursor: last_cursor, }; } } fn trigger_search( &mut self, style: SearchStyle, direction: SearchDirection, host: &mut dyn LineEditorHost, ) { self.clear_completion(); if let EditorState::Searching { .. } = &self.state { // Already searching } else { // Not yet searching, so we start a new search // with an empty pattern self.line.clear(); self.cursor = 0; self.history_pos.take(); } let history_pos = match self.history_pos { Some(p) => match direction.next(p) { Some(p) => p, None => return, }, None => match host.history().last() { Some(p) => p, None => { // TODO: there's no way we can match anything. // Generate a failed match result? return; } }, }; let search_result = host .history() .search(history_pos, style, direction, &self.line); let last_matching_line; let last_cursor; if let Some(result) = search_result { self.history_pos.replace(result.idx); last_matching_line = result.line.to_string(); last_cursor = result.cursor; } else if let EditorState::Searching { matching_line, cursor, .. } = &self.state { last_matching_line = matching_line.clone(); last_cursor = *cursor; } else { last_matching_line = String::new(); last_cursor = 0; } self.state = EditorState::Searching { style, direction, matching_line: last_matching_line, cursor: last_cursor, }; } /// Applies the effect of the specified action to the line editor. /// You don't normally need to call this unless you are defining /// custom key mapping or custom actions in your embedding application. pub fn apply_action(&mut self, host: &mut dyn LineEditorHost, action: Action) -> Result<()> { // When searching, reinterpret history next/prev as repeated // search actions in the appropriate direction let action = match (action, &self.state) { ( Action::HistoryPrevious, EditorState::Searching { style: SearchStyle::Substring, .. }, ) => Action::HistoryIncSearchBackwards, ( Action::HistoryNext, EditorState::Searching { style: SearchStyle::Substring, .. }, ) => Action::HistoryIncSearchForwards, (action, _) => action, }; match action { Action::Cancel => self.state = EditorState::Cancelled, Action::NoAction => {} Action::AcceptLine => { // Make sure that hitting Enter for a line that // shows in the incremental search causes that // line to be accepted, rather than the search pattern! self.cancel_search_state(); self.state = EditorState::Accepted; } Action::EndOfFile => { return Err( std::io::Error::new(std::io::ErrorKind::UnexpectedEof, "End Of File").into(), ) } Action::Kill(movement) => { self.kill_text(movement, movement); self.reapply_search_pattern(host); } Action::KillAndMove(kill_movement, move_movement) => { self.kill_text(kill_movement, move_movement); self.reapply_search_pattern(host); } Action::Move(movement) => { self.clear_completion(); self.cancel_search_state(); self.cursor = self.eval_movement(movement); } Action::InsertChar(rep, c) => { self.clear_completion(); for _ in 0..rep { self.line.insert(self.cursor, c); let mut cursor = GraphemeCursor::new(self.cursor, self.line.len(), false); if let Ok(Some(pos)) = cursor.next_boundary(&self.line, 0) { self.cursor = pos; } } self.reapply_search_pattern(host); } Action::InsertText(rep, text) => { self.clear_completion(); for _ in 0..rep { self.line.insert_str(self.cursor, &text); self.cursor += text.len(); } self.reapply_search_pattern(host); } Action::Repaint => { self.terminal .render(&[Change::ClearScreen(Default::default())])?; } Action::HistoryPrevious => { self.clear_completion(); self.cancel_search_state(); if let Some(cur_pos) = self.history_pos.as_ref() { let prior_idx = cur_pos.saturating_sub(1); if let Some(prior) = host.history().get(prior_idx) { self.history_pos = Some(prior_idx); self.line = prior.to_string(); self.cursor = self.line.len(); } } else if let Some(last) = host.history().last() { self.bottom_line = Some(self.line.clone()); self.history_pos = Some(last); self.line = host .history() .get(last) .expect("History::last and History::get to be consistent") .to_string(); self.cursor = self.line.len(); } } Action::HistoryNext => { self.clear_completion(); self.cancel_search_state(); if let Some(cur_pos) = self.history_pos.as_ref() { let next_idx = cur_pos.saturating_add(1); if let Some(next) = host.history().get(next_idx) { self.history_pos = Some(next_idx); self.line = next.to_string(); self.cursor = self.line.len(); } else if let Some(bottom) = self.bottom_line.take() { self.line = bottom; self.cursor = self.line.len(); } else { self.line.clear(); self.cursor = 0; } } } Action::HistoryIncSearchBackwards => { self.trigger_search(SearchStyle::Substring, SearchDirection::Backwards, host); } Action::HistoryIncSearchForwards => { self.trigger_search(SearchStyle::Substring, SearchDirection::Forwards, host); } Action::Complete => { self.cancel_search_state(); if self.completion.is_none() { let candidates = host.complete(&self.line, self.cursor); if !candidates.is_empty() { let state = CompletionState { candidates, index: 0, original_line: self.line.clone(), original_cursor: self.cursor, }; let (cursor, line) = state.current(); self.cursor = cursor; self.line = line; // If there is only a single completion then don't // leave us in a state where we just cycle on the // same completion over and over. if state.candidates.len() > 1 { self.completion = Some(state); } } } else if let Some(state) = self.completion.as_mut() { state.next(); let (cursor, line) = state.current(); self.cursor = cursor; self.line = line; } } } Ok(()) } fn read_line_impl(&mut self, host: &mut dyn LineEditorHost) -> Result> { self.line.clear(); self.cursor = 0; self.history_pos = None; self.bottom_line = None; self.clear_completion(); self.render(host)?; while let Some(event) = self.terminal.poll_input(None)? { if let Some(action) = self.resolve_action(&event, host) { self.apply_action(host, action)?; // Editor state might have changed. Re-render to clear // preview or highlight lines differently. self.render(host)?; match self.state { EditorState::Searching { .. } | EditorState::Editing => {} EditorState::Cancelled => return Ok(None), EditorState::Accepted => return Ok(Some(self.line.clone())), EditorState::Inactive => bail!("editor is inactive during read line!?"), } } else { self.render(host)?; } } Ok(Some(self.line.clone())) } } /// Create a `Terminal` with the recommended settings for use with /// a `LineEditor`. pub fn line_editor_terminal() -> Result { let hints = ProbeHints::new_from_env().mouse_reporting(Some(false)); let caps = Capabilities::new_with_hints(hints)?; new_terminal(caps) } termwiz-0.22.0/src/macros.rs000064400000000000000000000012061046102023000140260ustar 00000000000000#[doc(hidden)] #[macro_export] macro_rules! builder { ( $( #[ $( $meta:tt )* ] )* $vis:vis struct $name:ident { $( $( #[doc=$doc:expr] )* $field:ident : $type:ty, )* } ) => { $( #[ $( $meta )* ] )* $vis struct $name { $( $( #[doc=$doc] )* $field : $type, )* } impl $name { $( pub fn $field(mut self, value: $type) -> Self { self.$field = value; self } )* } } } termwiz-0.22.0/src/nerdfonts.rs000064400000000000000000000005311046102023000145440ustar 00000000000000use std::collections::HashMap; lazy_static::lazy_static! { pub static ref NERD_FONTS: HashMap<&'static str, char> = build_map(); } pub use crate::nerdfonts_data::NERD_FONT_GLYPHS; fn build_map() -> HashMap<&'static str, char> { crate::nerdfonts_data::NERD_FONT_GLYPHS .iter() .map(|tuple| *tuple) .collect() } termwiz-0.22.0/src/nerdfonts_data.rs000064400000000000000000025230641046102023000155520ustar 00000000000000//! Data mapping nerd font symbol names to their char codepoints //! This file was generated by running: //! cd ../codegen ; cargo run pub const NERD_FONT_GLYPHS: &[(&str, char)] = &[ ("cod_account", '\u{eb99}'), // î®™ ("cod_activate_breakpoints", '\u{ea97}'), //  ("cod_add", '\u{ea60}'), // î©  ("cod_archive", '\u{ea98}'), //  ("cod_arrow_both", '\u{ea99}'), //  ("cod_arrow_down", '\u{ea9a}'), //  ("cod_arrow_left", '\u{ea9b}'), //  ("cod_arrow_right", '\u{ea9c}'), //  ("cod_arrow_small_down", '\u{ea9d}'), // îª ("cod_arrow_small_left", '\u{ea9e}'), //  ("cod_arrow_small_right", '\u{ea9f}'), //  ("cod_arrow_small_up", '\u{eaa0}'), //  ("cod_arrow_swap", '\u{ebcb}'), //  ("cod_arrow_up", '\u{eaa1}'), //  ("cod_azure", '\u{ebd8}'), //  ("cod_azure_devops", '\u{ebe8}'), //  ("cod_beaker", '\u{ea79}'), //  ("cod_beaker_stop", '\u{ebe1}'), //  ("cod_bell", '\u{eaa2}'), //  ("cod_bell_dot", '\u{eb9a}'), //  ("cod_bold", '\u{eaa3}'), //  ("cod_book", '\u{eaa4}'), //  ("cod_bookmark", '\u{eaa5}'), //  ("cod_bracket_dot", '\u{ebe5}'), //  ("cod_bracket_error", '\u{ebe6}'), //  ("cod_briefcase", '\u{eaac}'), //  ("cod_broadcast", '\u{eaad}'), //  ("cod_browser", '\u{eaae}'), //  ("cod_bug", '\u{eaaf}'), //  ("cod_calendar", '\u{eab0}'), //  ("cod_call_incoming", '\u{eb92}'), // î®’ ("cod_call_outgoing", '\u{eb93}'), //  ("cod_case_sensitive", '\u{eab1}'), //  ("cod_check", '\u{eab2}'), //  ("cod_check_all", '\u{ebb1}'), // î®± ("cod_checklist", '\u{eab3}'), //  ("cod_chevron_down", '\u{eab4}'), //  ("cod_chevron_left", '\u{eab5}'), //  ("cod_chevron_right", '\u{eab6}'), //  ("cod_chevron_up", '\u{eab7}'), //  ("cod_chrome_close", '\u{eab8}'), //  ("cod_chrome_maximize", '\u{eab9}'), //  ("cod_chrome_minimize", '\u{eaba}'), //  ("cod_chrome_restore", '\u{eabb}'), //  ("cod_circle", '\u{eabc}'), //  ("cod_circle_filled", '\u{ea71}'), //  ("cod_circle_large", '\u{ebb5}'), //  ("cod_circle_large_filled", '\u{ebb4}'), // î®´ ("cod_circle_slash", '\u{eabd}'), //  ("cod_circle_small_filled", '\u{eb8a}'), //  ("cod_circuit_board", '\u{eabe}'), //  ("cod_clear_all", '\u{eabf}'), //  ("cod_clippy", '\u{eac0}'), // î«€ ("cod_close", '\u{ea76}'), // î©¶ ("cod_close_all", '\u{eac1}'), // î« ("cod_cloud", '\u{ebaa}'), //  ("cod_cloud_download", '\u{eac2}'), // î«‚ ("cod_cloud_upload", '\u{eac3}'), //  ("cod_code", '\u{eac4}'), // î«„ ("cod_collapse_all", '\u{eac5}'), // î«… ("cod_color_mode", '\u{eac6}'), //  ("cod_combine", '\u{ebb6}'), // î®¶ ("cod_comment", '\u{ea6b}'), // î©« ("cod_comment_discussion", '\u{eac7}'), //  ("cod_compass", '\u{ebd5}'), //  ("cod_compass_active", '\u{ebd7}'), //  ("cod_compass_dot", '\u{ebd6}'), //  ("cod_copy", '\u{ebcc}'), //  ("cod_credit_card", '\u{eac9}'), //  ("cod_dash", '\u{eacc}'), //  ("cod_dashboard", '\u{eacd}'), // î« ("cod_database", '\u{eace}'), //  ("cod_debug", '\u{ead8}'), //  ("cod_debug_all", '\u{ebdc}'), //  ("cod_debug_alt", '\u{eb91}'), //  ("cod_debug_alt_small", '\u{eba8}'), //  ("cod_debug_breakpoint_conditional", '\u{eaa7}'), //  ("cod_debug_breakpoint_conditional_unverified", '\u{eaa6}'), //  ("cod_debug_breakpoint_data", '\u{eaa9}'), //  ("cod_debug_breakpoint_data_unverified", '\u{eaa8}'), //  ("cod_debug_breakpoint_function", '\u{eb88}'), //  ("cod_debug_breakpoint_function_unverified", '\u{eb87}'), //  ("cod_debug_breakpoint_log", '\u{eaab}'), //  ("cod_debug_breakpoint_log_unverified", '\u{eaaa}'), //  ("cod_debug_breakpoint_unsupported", '\u{eb8c}'), //  ("cod_debug_console", '\u{eb9b}'), // î®› ("cod_debug_continue", '\u{eacf}'), // î« ("cod_debug_continue_small", '\u{ebe0}'), //  ("cod_debug_coverage", '\u{ebdd}'), // î¯ ("cod_debug_disconnect", '\u{ead0}'), // î« ("cod_debug_line_by_line", '\u{ebd0}'), // î¯ ("cod_debug_pause", '\u{ead1}'), // î«‘ ("cod_debug_rerun", '\u{ebc0}'), //  ("cod_debug_restart", '\u{ead2}'), // î«’ ("cod_debug_restart_frame", '\u{eb90}'), // î® ("cod_debug_reverse_continue", '\u{eb8e}'), //  ("cod_debug_stackframe", '\u{eb8b}'), //  ("cod_debug_stackframe_active", '\u{eb89}'), //  ("cod_debug_start", '\u{ead3}'), // î«“ ("cod_debug_step_back", '\u{eb8f}'), // î® ("cod_debug_step_into", '\u{ead4}'), // î«” ("cod_debug_step_out", '\u{ead5}'), // î«• ("cod_debug_step_over", '\u{ead6}'), // î«– ("cod_debug_stop", '\u{ead7}'), // î«— ("cod_desktop_download", '\u{ea78}'), //  ("cod_device_camera", '\u{eada}'), //  ("cod_device_camera_video", '\u{ead9}'), // î«™ ("cod_device_mobile", '\u{eadb}'), // î«› ("cod_diff", '\u{eae1}'), // î«¡ ("cod_diff_added", '\u{eadc}'), //  ("cod_diff_ignored", '\u{eadd}'), // î« ("cod_diff_modified", '\u{eade}'), //  ("cod_diff_removed", '\u{eadf}'), //  ("cod_diff_renamed", '\u{eae0}'), // î«  ("cod_discard", '\u{eae2}'), // î«¢ ("cod_edit", '\u{ea73}'), //  ("cod_editor_layout", '\u{eae3}'), // î«£ ("cod_ellipsis", '\u{ea7c}'), //  ("cod_empty_window", '\u{eae4}'), //  ("cod_error", '\u{ea87}'), //  ("cod_exclude", '\u{eae5}'), // î«¥ ("cod_expand_all", '\u{eb95}'), //  ("cod_export", '\u{ebac}'), //  ("cod_extensions", '\u{eae6}'), //  ("cod_eye", '\u{ea70}'), // î©° ("cod_eye_closed", '\u{eae7}'), // î«§ ("cod_feedback", '\u{eb96}'), // î®– ("cod_file", '\u{ea7b}'), // î©» ("cod_file_binary", '\u{eae8}'), //  ("cod_file_code", '\u{eae9}'), // î«© ("cod_file_media", '\u{eaea}'), //  ("cod_file_pdf", '\u{eaeb}'), // î«« ("cod_file_submodule", '\u{eaec}'), //  ("cod_file_symlink_directory", '\u{eaed}'), // î«­ ("cod_file_symlink_file", '\u{eaee}'), // î«® ("cod_file_zip", '\u{eaef}'), //  ("cod_files", '\u{eaf0}'), // î«° ("cod_filter", '\u{eaf1}'), //  ("cod_filter_filled", '\u{ebce}'), //  ("cod_flame", '\u{eaf2}'), //  ("cod_fold", '\u{eaf5}'), //  ("cod_fold_down", '\u{eaf3}'), //  ("cod_fold_up", '\u{eaf4}'), // î«´ ("cod_folder", '\u{ea83}'), //  ("cod_folder_active", '\u{eaf6}'), // î«¶ ("cod_folder_library", '\u{ebdf}'), //  ("cod_folder_opened", '\u{eaf7}'), // î«· ("cod_gear", '\u{eaf8}'), //  ("cod_gift", '\u{eaf9}'), //  ("cod_gist_secret", '\u{eafa}'), //  ("cod_git_commit", '\u{eafc}'), //  ("cod_git_compare", '\u{eafd}'), //  ("cod_git_merge", '\u{eafe}'), //  ("cod_git_pull_request", '\u{ea64}'), //  ("cod_git_pull_request_closed", '\u{ebda}'), //  ("cod_git_pull_request_create", '\u{ebbc}'), //  ("cod_git_pull_request_draft", '\u{ebdb}'), //  ("cod_github", '\u{ea84}'), //  ("cod_github_action", '\u{eaff}'), // î«¿ ("cod_github_alt", '\u{eb00}'), //  ("cod_github_inverted", '\u{eba1}'), //  ("cod_globe", '\u{eb01}'), // î¬ ("cod_go_to_file", '\u{ea94}'), //  ("cod_grabber", '\u{eb02}'), //  ("cod_graph", '\u{eb03}'), //  ("cod_graph_left", '\u{ebad}'), // î®­ ("cod_graph_line", '\u{ebe2}'), //  ("cod_graph_scatter", '\u{ebe3}'), //  ("cod_gripper", '\u{eb04}'), //  ("cod_group_by_ref_type", '\u{eb97}'), // î®— ("cod_heart", '\u{eb05}'), //  ("cod_history", '\u{ea82}'), //  ("cod_home", '\u{eb06}'), //  ("cod_horizontal_rule", '\u{eb07}'), //  ("cod_hubot", '\u{eb08}'), //  ("cod_inbox", '\u{eb09}'), //  ("cod_info", '\u{ea74}'), // î©´ ("cod_inspect", '\u{ebd1}'), //  ("cod_issue_draft", '\u{ebd9}'), //  ("cod_issue_reopened", '\u{eb0b}'), //  ("cod_issues", '\u{eb0c}'), //  ("cod_italic", '\u{eb0d}'), // î¬ ("cod_jersey", '\u{eb0e}'), //  ("cod_json", '\u{eb0f}'), // î¬ ("cod_kebab_vertical", '\u{eb10}'), // î¬ ("cod_key", '\u{eb11}'), //  ("cod_law", '\u{eb12}'), //  ("cod_layers", '\u{ebd2}'), //  ("cod_layers_active", '\u{ebd4}'), //  ("cod_layers_dot", '\u{ebd3}'), //  ("cod_layout", '\u{ebeb}'), //  ("cod_library", '\u{eb9c}'), //  ("cod_lightbulb", '\u{ea61}'), // î©¡ ("cod_lightbulb_autofix", '\u{eb13}'), //  ("cod_link", '\u{eb15}'), //  ("cod_link_external", '\u{eb14}'), //  ("cod_list_filter", '\u{eb83}'), //  ("cod_list_flat", '\u{eb84}'), //  ("cod_list_ordered", '\u{eb16}'), //  ("cod_list_selection", '\u{eb85}'), // î®… ("cod_list_tree", '\u{eb86}'), //  ("cod_list_unordered", '\u{eb17}'), //  ("cod_live_share", '\u{eb18}'), //  ("cod_loading", '\u{eb19}'), //  ("cod_location", '\u{eb1a}'), //  ("cod_lock", '\u{ea75}'), //  ("cod_lock_small", '\u{ebe7}'), //  ("cod_magnet", '\u{ebae}'), // î®® ("cod_mail", '\u{eb1c}'), //  ("cod_mail_read", '\u{eb1b}'), //  ("cod_markdown", '\u{eb1d}'), // î¬ ("cod_megaphone", '\u{eb1e}'), //  ("cod_mention", '\u{eb1f}'), //  ("cod_menu", '\u{eb94}'), // î®” ("cod_merge", '\u{ebab}'), //  ("cod_milestone", '\u{eb20}'), //  ("cod_mirror", '\u{ea69}'), // î©© ("cod_mortar_board", '\u{eb21}'), //  ("cod_move", '\u{eb22}'), //  ("cod_multiple_windows", '\u{eb23}'), //  ("cod_mute", '\u{eb24}'), //  ("cod_new_file", '\u{ea7f}'), // î©¿ ("cod_new_folder", '\u{ea80}'), //  ("cod_newline", '\u{ebea}'), //  ("cod_no_newline", '\u{eb25}'), //  ("cod_note", '\u{eb26}'), //  ("cod_notebook", '\u{ebaf}'), //  ("cod_notebook_template", '\u{ebbf}'), //  ("cod_octoface", '\u{eb27}'), //  ("cod_open_preview", '\u{eb28}'), //  ("cod_organization", '\u{ea7e}'), //  ("cod_output", '\u{eb9d}'), // î® ("cod_package", '\u{eb29}'), //  ("cod_paintcan", '\u{eb2a}'), //  ("cod_pass", '\u{eba4}'), //  ("cod_pass_filled", '\u{ebb3}'), //  ("cod_person", '\u{ea67}'), // î©§ ("cod_person_add", '\u{ebcd}'), // î¯ ("cod_pie_chart", '\u{ebe4}'), //  ("cod_pin", '\u{eb2b}'), //  ("cod_pinned", '\u{eba0}'), // î®  ("cod_pinned_dirty", '\u{ebb2}'), //  ("cod_play", '\u{eb2c}'), //  ("cod_play_circle", '\u{eba6}'), //  ("cod_plug", '\u{eb2d}'), //  ("cod_preserve_case", '\u{eb2e}'), //  ("cod_preview", '\u{eb2f}'), //  ("cod_primitive_square", '\u{ea72}'), //  ("cod_project", '\u{eb30}'), //  ("cod_pulse", '\u{eb31}'), //  ("cod_question", '\u{eb32}'), //  ("cod_quote", '\u{eb33}'), //  ("cod_radio_tower", '\u{eb34}'), //  ("cod_reactions", '\u{eb35}'), //  ("cod_record", '\u{eba7}'), // î®§ ("cod_record_keys", '\u{ea65}'), // î©¥ ("cod_redo", '\u{ebb0}'), // î®° ("cod_references", '\u{eb36}'), //  ("cod_refresh", '\u{eb37}'), //  ("cod_regex", '\u{eb38}'), //  ("cod_remote", '\u{eb3a}'), //  ("cod_remote_explorer", '\u{eb39}'), //  ("cod_remove", '\u{eb3b}'), //  ("cod_replace", '\u{eb3d}'), //  ("cod_replace_all", '\u{eb3c}'), //  ("cod_reply", '\u{ea7d}'), //  ("cod_repo", '\u{ea62}'), // î©¢ ("cod_repo_clone", '\u{eb3e}'), //  ("cod_repo_force_push", '\u{eb3f}'), //  ("cod_repo_forked", '\u{ea63}'), // î©£ ("cod_repo_pull", '\u{eb40}'), // î­€ ("cod_repo_push", '\u{eb41}'), // î­ ("cod_report", '\u{eb42}'), // î­‚ ("cod_request_changes", '\u{eb43}'), // î­ƒ ("cod_rocket", '\u{eb44}'), // î­„ ("cod_root_folder", '\u{eb46}'), // î­† ("cod_root_folder_opened", '\u{eb45}'), // î­… ("cod_rss", '\u{eb47}'), // î­‡ ("cod_ruby", '\u{eb48}'), // î­ˆ ("cod_run_above", '\u{ebbd}'), //  ("cod_run_all", '\u{eb9e}'), //  ("cod_run_below", '\u{ebbe}'), //  ("cod_run_errors", '\u{ebde}'), //  ("cod_save", '\u{eb4b}'), // î­‹ ("cod_save_all", '\u{eb49}'), // î­‰ ("cod_save_as", '\u{eb4a}'), // î­Š ("cod_screen_full", '\u{eb4c}'), // î­Œ ("cod_screen_normal", '\u{eb4d}'), // î­ ("cod_search", '\u{ea6d}'), // î©­ ("cod_search_stop", '\u{eb4e}'), // î­Ž ("cod_server", '\u{eb50}'), // î­ ("cod_server_environment", '\u{eba3}'), //  ("cod_server_process", '\u{eba2}'), //  ("cod_settings", '\u{eb52}'), // î­’ ("cod_settings_gear", '\u{eb51}'), // î­‘ ("cod_shield", '\u{eb53}'), // î­“ ("cod_sign_in", '\u{ea6f}'), //  ("cod_sign_out", '\u{ea6e}'), // î©® ("cod_smiley", '\u{eb54}'), // î­” ("cod_sort_precedence", '\u{eb55}'), // î­• ("cod_source_control", '\u{ea68}'), //  ("cod_split_horizontal", '\u{eb56}'), // î­– ("cod_split_vertical", '\u{eb57}'), // î­— ("cod_squirrel", '\u{eb58}'), // î­˜ ("cod_star_empty", '\u{ea6a}'), //  ("cod_star_full", '\u{eb59}'), // î­™ ("cod_star_half", '\u{eb5a}'), // î­š ("cod_stop_circle", '\u{eba5}'), //  ("cod_symbol_array", '\u{ea8a}'), //  ("cod_symbol_boolean", '\u{ea8f}'), // îª ("cod_symbol_class", '\u{eb5b}'), // î­› ("cod_symbol_color", '\u{eb5c}'), // î­œ ("cod_symbol_constant", '\u{eb5d}'), // î­ ("cod_symbol_enum", '\u{ea95}'), //  ("cod_symbol_enum_member", '\u{eb5e}'), // î­ž ("cod_symbol_event", '\u{ea86}'), //  ("cod_symbol_field", '\u{eb5f}'), // î­Ÿ ("cod_symbol_file", '\u{eb60}'), // î­  ("cod_symbol_interface", '\u{eb61}'), // î­¡ ("cod_symbol_key", '\u{ea93}'), //  ("cod_symbol_keyword", '\u{eb62}'), // î­¢ ("cod_symbol_method", '\u{ea8c}'), //  ("cod_symbol_misc", '\u{eb63}'), // î­£ ("cod_symbol_namespace", '\u{ea8b}'), //  ("cod_symbol_numeric", '\u{ea90}'), // îª ("cod_symbol_operator", '\u{eb64}'), // î­¤ ("cod_symbol_parameter", '\u{ea92}'), //  ("cod_symbol_property", '\u{eb65}'), // î­¥ ("cod_symbol_ruler", '\u{ea96}'), //  ("cod_symbol_snippet", '\u{eb66}'), // î­¦ ("cod_symbol_string", '\u{eb8d}'), // î® ("cod_symbol_structure", '\u{ea91}'), //  ("cod_symbol_variable", '\u{ea88}'), //  ("cod_sync", '\u{ea77}'), // î©· ("cod_sync_ignored", '\u{eb9f}'), //  ("cod_table", '\u{ebb7}'), // î®· ("cod_tag", '\u{ea66}'), //  ("cod_tasklist", '\u{eb67}'), // î­§ ("cod_telescope", '\u{eb68}'), // î­¨ ("cod_terminal", '\u{ea85}'), //  ("cod_terminal_bash", '\u{ebca}'), //  ("cod_terminal_cmd", '\u{ebc4}'), //  ("cod_terminal_debian", '\u{ebc5}'), //  ("cod_terminal_linux", '\u{ebc6}'), //  ("cod_terminal_powershell", '\u{ebc7}'), //  ("cod_terminal_tmux", '\u{ebc8}'), //  ("cod_terminal_ubuntu", '\u{ebc9}'), //  ("cod_text_size", '\u{eb69}'), // î­© ("cod_three_bars", '\u{eb6a}'), // î­ª ("cod_thumbsdown", '\u{eb6b}'), // î­« ("cod_thumbsup", '\u{eb6c}'), // î­¬ ("cod_tools", '\u{eb6d}'), // î­­ ("cod_trash", '\u{ea81}'), // îª ("cod_triangle_down", '\u{eb6e}'), // î­® ("cod_triangle_left", '\u{eb6f}'), // î­¯ ("cod_triangle_right", '\u{eb70}'), // î­° ("cod_triangle_up", '\u{eb71}'), // î­± ("cod_twitter", '\u{eb72}'), // î­² ("cod_type_hierarchy", '\u{ebb9}'), //  ("cod_type_hierarchy_sub", '\u{ebba}'), //  ("cod_type_hierarchy_super", '\u{ebbb}'), // î®» ("cod_unfold", '\u{eb73}'), // î­³ ("cod_ungroup_by_ref_type", '\u{eb98}'), //  ("cod_unlock", '\u{eb74}'), // î­´ ("cod_unmute", '\u{eb75}'), // î­µ ("cod_unverified", '\u{eb76}'), // î­¶ ("cod_variable_group", '\u{ebb8}'), //  ("cod_verified", '\u{eb77}'), // î­· ("cod_verified_filled", '\u{ebe9}'), //  ("cod_versions", '\u{eb78}'), // î­¸ ("cod_vm", '\u{ea7a}'), //  ("cod_vm_active", '\u{eb79}'), // î­¹ ("cod_vm_connect", '\u{eba9}'), //  ("cod_vm_outline", '\u{eb7a}'), // î­º ("cod_vm_running", '\u{eb7b}'), // î­» ("cod_wand", '\u{ebcf}'), // î¯ ("cod_warning", '\u{ea6c}'), //  ("cod_watch", '\u{eb7c}'), // î­¼ ("cod_whitespace", '\u{eb7d}'), // î­½ ("cod_whole_word", '\u{eb7e}'), // î­¾ ("cod_window", '\u{eb7f}'), // î­¿ ("cod_word_wrap", '\u{eb80}'), //  ("cod_workspace_trusted", '\u{ebc1}'), // î¯ ("cod_workspace_unknown", '\u{ebc3}'), //  ("cod_workspace_untrusted", '\u{ebc2}'), //  ("cod_zoom_in", '\u{eb81}'), // î® ("cod_zoom_out", '\u{eb82}'), //  ("custom_asm", '\u{e6ab}'), // îš« ("custom_c", '\u{e61e}'), //  ("custom_common_lisp", '\u{e6b0}'), // îš° ("custom_cpp", '\u{e61d}'), // î˜ ("custom_crystal", '\u{e62f}'), //  ("custom_default", '\u{e612}'), //  ("custom_electron", '\u{e62e}'), //  ("custom_elixir", '\u{e62d}'), //  ("custom_elm", '\u{e62c}'), //  ("custom_emacs", '\u{e632}'), //  ("custom_fennel", '\u{e6af}'), //  ("custom_folder", '\u{e5ff}'), // î—¿ ("custom_folder_config", '\u{e5fc}'), // î—¼ ("custom_folder_git", '\u{e5fb}'), // î—» ("custom_folder_github", '\u{e5fd}'), // î—½ ("custom_folder_npm", '\u{e5fa}'), // î—º ("custom_folder_oct", '\u{e6ad}'), // îš­ ("custom_folder_open", '\u{e5fe}'), // î—¾ ("custom_go", '\u{e626}'), //  ("custom_home", '\u{e617}'), //  ("custom_kotlin", '\u{e634}'), //  ("custom_msdos", '\u{e629}'), //  ("custom_neovim", '\u{e6ae}'), // îš® ("custom_orgmode", '\u{e633}'), //  ("custom_play_arrow", '\u{e602}'), //  ("custom_purescript", '\u{e630}'), //  ("custom_scheme", '\u{e6b1}'), // îš± ("custom_toml", '\u{e6b2}'), // îš² ("custom_v_lang", '\u{e6ac}'), //  ("custom_vim", '\u{e62b}'), //  ("custom_windows", '\u{e62a}'), //  ("dev_android", '\u{e70e}'), //  ("dev_angular", '\u{e753}'), // î“ ("dev_appcelerator", '\u{e7ab}'), // îž« ("dev_apple", '\u{e711}'), //  ("dev_appstore", '\u{e713}'), //  ("dev_aptana", '\u{e799}'), // îž™ ("dev_asterisk", '\u{e7ac}'), //  ("dev_atlassian", '\u{e75b}'), // î› ("dev_atom", '\u{e764}'), // î¤ ("dev_aws", '\u{e7ad}'), // îž­ ("dev_backbone", '\u{e752}'), // î’ ("dev_bing_small", '\u{e700}'), //  ("dev_bintray", '\u{e794}'), // îž” ("dev_bitbucket", '\u{e703}'), //  ("dev_blackberry", '\u{e723}'), //  ("dev_bootstrap", '\u{e747}'), // î‡ ("dev_bower", '\u{e74d}'), // î ("dev_brackets", '\u{e79d}'), // îž ("dev_bugsense", '\u{e78d}'), // îž ("dev_celluloid", '\u{e76b}'), // î« ("dev_chart", '\u{e760}'), // î  ("dev_chrome", '\u{e743}'), // îƒ ("dev_cisco", '\u{e765}'), // î¥ ("dev_clojure", '\u{e768}'), // î¨ ("dev_clojure_alt", '\u{e76a}'), // îª ("dev_cloud9", '\u{e79f}'), //  ("dev_coda", '\u{e793}'), // îž“ ("dev_code", '\u{e796}'), // îž– ("dev_code_badge", '\u{e7a3}'), //  ("dev_codeigniter", '\u{e780}'), //  ("dev_codepen", '\u{e716}'), //  ("dev_codrops", '\u{e72f}'), //  ("dev_coffeescript", '\u{e751}'), // î‘ ("dev_compass", '\u{e761}'), // î¡ ("dev_composer", '\u{e783}'), //  ("dev_creativecommons", '\u{e789}'), //  ("dev_creativecommons_badge", '\u{e78a}'), //  ("dev_css3", '\u{e749}'), // î‰ ("dev_css3_full", '\u{e74a}'), // îŠ ("dev_css_tricks", '\u{e701}'), // îœ ("dev_cssdeck", '\u{e72a}'), //  ("dev_dart", '\u{e798}'), //  ("dev_database", '\u{e706}'), //  ("dev_debian", '\u{e77d}'), // î½ ("dev_digital_ocean", '\u{e7ae}'), // îž® ("dev_django", '\u{e71d}'), // îœ ("dev_dlang", '\u{e7af}'), //  ("dev_docker", '\u{e7b0}'), // îž° ("dev_doctrine", '\u{e774}'), // î´ ("dev_dojo", '\u{e71c}'), //  ("dev_dotnet", '\u{e77f}'), // î¿ ("dev_dreamweaver", '\u{e79c}'), // îžœ ("dev_dropbox", '\u{e707}'), //  ("dev_drupal", '\u{e742}'), // î‚ ("dev_eclipse", '\u{e79e}'), // îžž ("dev_ember", '\u{e71b}'), //  ("dev_envato", '\u{e75d}'), // î ("dev_erlang", '\u{e7b1}'), // îž± ("dev_extjs", '\u{e78e}'), //  ("dev_firebase", '\u{e787}'), //  ("dev_firefox", '\u{e745}'), // î… ("dev_fsharp", '\u{e7a7}'), // îž§ ("dev_ghost", '\u{e71f}'), //  ("dev_ghost_small", '\u{e714}'), //  ("dev_git", '\u{e702}'), //  ("dev_git_branch", '\u{e725}'), //  ("dev_git_commit", '\u{e729}'), //  ("dev_git_compare", '\u{e728}'), //  ("dev_git_merge", '\u{e727}'), //  ("dev_git_pull_request", '\u{e726}'), //  ("dev_github", '\u{e70a}'), //  ("dev_github_alt", '\u{e708}'), //  ("dev_github_badge", '\u{e709}'), //  ("dev_github_full", '\u{e717}'), //  ("dev_gnu", '\u{e779}'), // î¹ ("dev_go", '\u{e724}'), //  ("dev_google_cloud_platform", '\u{e7b2}'), // îž² ("dev_google_drive", '\u{e731}'), //  ("dev_grails", '\u{e7b3}'), // îž³ ("dev_groovy", '\u{e775}'), // îµ ("dev_grunt", '\u{e74c}'), // îŒ ("dev_gulp", '\u{e763}'), // î£ ("dev_hackernews", '\u{e71a}'), //  ("dev_haskell", '\u{e777}'), // î· ("dev_heroku", '\u{e77b}'), // î» ("dev_html5", '\u{e736}'), //  ("dev_html5_3d_effects", '\u{e735}'), //  ("dev_html5_connectivity", '\u{e734}'), //  ("dev_html5_device_access", '\u{e733}'), //  ("dev_html5_multimedia", '\u{e732}'), //  ("dev_ie", '\u{e744}'), // î„ ("dev_illustrator", '\u{e7b4}'), // îž´ ("dev_intellij", '\u{e7b5}'), // îžµ ("dev_ionic", '\u{e7a9}'), // îž© ("dev_java", '\u{e738}'), //  ("dev_javascript", '\u{e74e}'), // îŽ ("dev_javascript_badge", '\u{e781}'), // îž ("dev_javascript_shield", '\u{e74f}'), // î ("dev_jekyll_small", '\u{e70d}'), // îœ ("dev_jenkins", '\u{e767}'), // î§ ("dev_jira", '\u{e75c}'), // îœ ("dev_joomla", '\u{e741}'), // î ("dev_jquery", '\u{e750}'), // î ("dev_jquery_ui", '\u{e754}'), // î” ("dev_komodo", '\u{e792}'), // îž’ ("dev_krakenjs", '\u{e785}'), // îž… ("dev_krakenjs_badge", '\u{e784}'), // îž„ ("dev_laravel", '\u{e73f}'), //  ("dev_less", '\u{e758}'), // î˜ ("dev_linux", '\u{e712}'), //  ("dev_magento", '\u{e740}'), // î€ ("dev_mailchimp", '\u{e79a}'), // îžš ("dev_markdown", '\u{e73e}'), //  ("dev_materializecss", '\u{e7b6}'), // îž¶ ("dev_meteor", '\u{e7a5}'), //  ("dev_meteorfull", '\u{e7a6}'), //  ("dev_mitlicence", '\u{e78b}'), // îž‹ ("dev_modernizr", '\u{e720}'), //  ("dev_mongodb", '\u{e7a4}'), //  ("dev_mootools", '\u{e790}'), // îž ("dev_mootools_badge", '\u{e78f}'), // îž ("dev_mozilla", '\u{e786}'), //  ("dev_msql_server", '\u{e77c}'), // î¼ ("dev_mysql", '\u{e704}'), //  ("dev_nancy", '\u{e766}'), // î¦ ("dev_netbeans", '\u{e79b}'), // îž› ("dev_netmagazine", '\u{e72e}'), //  ("dev_nginx", '\u{e776}'), // î¶ ("dev_nodejs", '\u{e719}'), //  ("dev_nodejs_small", '\u{e718}'), //  ("dev_npm", '\u{e71e}'), //  ("dev_onedrive", '\u{e762}'), // î¢ ("dev_openshift", '\u{e7b7}'), // îž· ("dev_opensource", '\u{e771}'), // î± ("dev_opera", '\u{e746}'), // î† ("dev_perl", '\u{e769}'), // î© ("dev_phonegap", '\u{e730}'), //  ("dev_photoshop", '\u{e7b8}'), //  ("dev_php", '\u{e73d}'), //  ("dev_postgresql", '\u{e76e}'), // î® ("dev_prolog", '\u{e7a1}'), // îž¡ ("dev_python", '\u{e73c}'), //  ("dev_rackspace", '\u{e7b9}'), // îž¹ ("dev_raphael", '\u{e75f}'), // îŸ ("dev_rasberry_pi", '\u{e722}'), //  ("dev_react", '\u{e7ba}'), //  ("dev_redhat", '\u{e7bb}'), // îž» ("dev_redis", '\u{e76d}'), // î­ ("dev_requirejs", '\u{e770}'), // î° ("dev_responsive", '\u{e797}'), // îž— ("dev_ruby", '\u{e739}'), //  ("dev_ruby_on_rails", '\u{e73b}'), //  ("dev_ruby_rough", '\u{e791}'), // îž‘ ("dev_rust", '\u{e7a8}'), //  ("dev_safari", '\u{e748}'), // îˆ ("dev_sass", '\u{e74b}'), // î‹ ("dev_scala", '\u{e737}'), //  ("dev_scriptcs", '\u{e7bc}'), // îž¼ ("dev_scrum", '\u{e7a0}'), // îž  ("dev_senchatouch", '\u{e78c}'), //  ("dev_sizzlejs", '\u{e788}'), //  ("dev_smashing_magazine", '\u{e72d}'), //  ("dev_snap_svg", '\u{e75e}'), // îž ("dev_sqllite", '\u{e7c4}'), //  ("dev_stackoverflow", '\u{e710}'), // îœ ("dev_streamline", '\u{e705}'), //  ("dev_stylus", '\u{e759}'), // î™ ("dev_sublime", '\u{e7aa}'), //  ("dev_swift", '\u{e755}'), // î• ("dev_symfony", '\u{e756}'), // î– ("dev_symfony_badge", '\u{e757}'), // î— ("dev_techcrunch", '\u{e72c}'), //  ("dev_terminal", '\u{e795}'), // îž• ("dev_terminal_badge", '\u{e7a2}'), //  ("dev_travis", '\u{e77e}'), // î¾ ("dev_trello", '\u{e75a}'), // îš ("dev_typo3", '\u{e772}'), // î² ("dev_ubuntu", '\u{e73a}'), //  ("dev_uikit", '\u{e773}'), // î³ ("dev_unity_small", '\u{e721}'), //  ("dev_vim", '\u{e7c5}'), //  ("dev_visualstudio", '\u{e70c}'), //  ("dev_w3c", '\u{e76c}'), // î¬ ("dev_webplatform", '\u{e76f}'), // î¯ ("dev_windows", '\u{e70f}'), // îœ ("dev_wordpress", '\u{e70b}'), //  ("dev_yahoo", '\u{e715}'), //  ("dev_yahoo_small", '\u{e72b}'), //  ("dev_yeoman", '\u{e77a}'), // îº ("dev_yii", '\u{e782}'), // îž‚ ("dev_zend", '\u{e778}'), // î¸ ("fa_500px", '\u{f26e}'), //  ("fa_address_book", '\u{f2b9}'), //  ("fa_address_book_o", '\u{f2ba}'), //  ("fa_address_card", '\u{f2bb}'), //  ("fa_address_card_o", '\u{f2bc}'), //  ("fa_adjust", '\u{f042}'), // ï‚ ("fa_adn", '\u{f170}'), // ï…° ("fa_align_center", '\u{f037}'), //  ("fa_align_justify", '\u{f039}'), //  ("fa_align_left", '\u{f036}'), //  ("fa_align_right", '\u{f038}'), //  ("fa_amazon", '\u{f270}'), //  ("fa_ambulance", '\u{f0f9}'), //  ("fa_american_sign_language_interpreting", '\u{f2a3}'), //  ("fa_anchor", '\u{f13d}'), //  ("fa_android", '\u{f17b}'), // ï…» ("fa_angellist", '\u{f209}'), //  ("fa_angle_double_down", '\u{f103}'), //  ("fa_angle_double_left", '\u{f100}'), // ï„€ ("fa_angle_double_right", '\u{f101}'), // ï„ ("fa_angle_double_up", '\u{f102}'), // ï„‚ ("fa_angle_down", '\u{f107}'), //  ("fa_angle_left", '\u{f104}'), // ï„„ ("fa_angle_right", '\u{f105}'), // ï„… ("fa_angle_up", '\u{f106}'), //  ("fa_apple", '\u{f179}'), // ï…¹ ("fa_archive", '\u{f187}'), //  ("fa_area_chart", '\u{f1fe}'), //  ("fa_arrow_circle_down", '\u{f0ab}'), // ï‚« ("fa_arrow_circle_left", '\u{f0a8}'), //  ("fa_arrow_circle_o_down", '\u{f01a}'), //  ("fa_arrow_circle_o_left", '\u{f190}'), // ï† ("fa_arrow_circle_o_right", '\u{f18e}'), //  ("fa_arrow_circle_o_up", '\u{f01b}'), //  ("fa_arrow_circle_right", '\u{f0a9}'), // ï‚© ("fa_arrow_circle_up", '\u{f0aa}'), //  ("fa_arrow_down", '\u{f063}'), // ï£ ("fa_arrow_left", '\u{f060}'), // ï  ("fa_arrow_right", '\u{f061}'), // ï¡ ("fa_arrow_up", '\u{f062}'), // ï¢ ("fa_arrows", '\u{f047}'), // ï‡ ("fa_arrows_alt", '\u{f0b2}'), //  ("fa_arrows_h", '\u{f07e}'), // ï¾ ("fa_arrows_v", '\u{f07d}'), // ï½ ("fa_assistive_listening_systems", '\u{f2a2}'), //  ("fa_asterisk", '\u{f069}'), // ï© ("fa_at", '\u{f1fa}'), //  ("fa_audio_description", '\u{f29e}'), //  ("fa_backward", '\u{f04a}'), // ïŠ ("fa_balance_scale", '\u{f24e}'), //  ("fa_ban", '\u{f05e}'), // ïž ("fa_bandcamp", '\u{f2d5}'), // ï‹• ("fa_bar_chart", '\u{f080}'), // ï‚€ ("fa_barcode", '\u{f02a}'), //  ("fa_bars", '\u{f0c9}'), //  ("fa_bath", '\u{f2cd}'), // ï‹ ("fa_battery_empty", '\u{f244}'), //  ("fa_battery_full", '\u{f240}'), //  ("fa_battery_half", '\u{f242}'), //  ("fa_battery_quarter", '\u{f243}'), //  ("fa_battery_three_quarters", '\u{f241}'), // ï‰ ("fa_bed", '\u{f236}'), //  ("fa_beer", '\u{f0fc}'), //  ("fa_behance", '\u{f1b4}'), //  ("fa_behance_square", '\u{f1b5}'), //  ("fa_bell", '\u{f0f3}'), //  ("fa_bell_o", '\u{f0a2}'), // ï‚¢ ("fa_bell_slash", '\u{f1f6}'), //  ("fa_bell_slash_o", '\u{f1f7}'), //  ("fa_bicycle", '\u{f206}'), //  ("fa_binoculars", '\u{f1e5}'), //  ("fa_birthday_cake", '\u{f1fd}'), //  ("fa_bitbucket", '\u{f171}'), // ï…± ("fa_bitbucket_square", '\u{f172}'), // ï…² ("fa_black_tie", '\u{f27e}'), //  ("fa_blind", '\u{f29d}'), // ïŠ ("fa_bluetooth", '\u{f293}'), //  ("fa_bluetooth_b", '\u{f294}'), //  ("fa_bold", '\u{f032}'), //  ("fa_bolt", '\u{f0e7}'), //  ("fa_bomb", '\u{f1e2}'), //  ("fa_book", '\u{f02d}'), //  ("fa_bookmark", '\u{f02e}'), //  ("fa_bookmark_o", '\u{f097}'), // ï‚— ("fa_braille", '\u{f2a1}'), //  ("fa_briefcase", '\u{f0b1}'), //  ("fa_btc", '\u{f15a}'), // ï…š ("fa_bug", '\u{f188}'), //  ("fa_building", '\u{f1ad}'), //  ("fa_building_o", '\u{f0f7}'), //  ("fa_bullhorn", '\u{f0a1}'), // ï‚¡ ("fa_bullseye", '\u{f140}'), // ï…€ ("fa_bus", '\u{f207}'), //  ("fa_buysellads", '\u{f20d}'), // ïˆ ("fa_calculator", '\u{f1ec}'), //  ("fa_calendar", '\u{f073}'), // ï³ ("fa_calendar_check_o", '\u{f274}'), //  ("fa_calendar_minus_o", '\u{f272}'), //  ("fa_calendar_o", '\u{f133}'), //  ("fa_calendar_plus_o", '\u{f271}'), //  ("fa_calendar_times_o", '\u{f273}'), //  ("fa_camera", '\u{f030}'), //  ("fa_camera_retro", '\u{f083}'), //  ("fa_car", '\u{f1b9}'), //  ("fa_caret_down", '\u{f0d7}'), //  ("fa_caret_left", '\u{f0d9}'), //  ("fa_caret_right", '\u{f0da}'), //  ("fa_caret_square_o_down", '\u{f150}'), // ï… ("fa_caret_square_o_left", '\u{f191}'), //  ("fa_caret_square_o_right", '\u{f152}'), // ï…’ ("fa_caret_square_o_up", '\u{f151}'), // ï…‘ ("fa_caret_up", '\u{f0d8}'), //  ("fa_cart_arrow_down", '\u{f218}'), //  ("fa_cart_plus", '\u{f217}'), //  ("fa_cc", '\u{f20a}'), //  ("fa_cc_amex", '\u{f1f3}'), //  ("fa_cc_diners_club", '\u{f24c}'), //  ("fa_cc_discover", '\u{f1f2}'), //  ("fa_cc_jcb", '\u{f24b}'), //  ("fa_cc_mastercard", '\u{f1f1}'), //  ("fa_cc_paypal", '\u{f1f4}'), //  ("fa_cc_stripe", '\u{f1f5}'), //  ("fa_cc_visa", '\u{f1f0}'), //  ("fa_certificate", '\u{f0a3}'), // ï‚£ ("fa_chain_broken", '\u{f127}'), // ï„§ ("fa_check", '\u{f00c}'), //  ("fa_check_circle", '\u{f058}'), // ï˜ ("fa_check_circle_o", '\u{f05d}'), // ï ("fa_check_square", '\u{f14a}'), // ï…Š ("fa_check_square_o", '\u{f046}'), // ï† ("fa_chevron_circle_down", '\u{f13a}'), //  ("fa_chevron_circle_left", '\u{f137}'), // ï„· ("fa_chevron_circle_right", '\u{f138}'), //  ("fa_chevron_circle_up", '\u{f139}'), //  ("fa_chevron_down", '\u{f078}'), // ï¸ ("fa_chevron_left", '\u{f053}'), // ï“ ("fa_chevron_right", '\u{f054}'), // ï” ("fa_chevron_up", '\u{f077}'), // ï· ("fa_child", '\u{f1ae}'), //  ("fa_chrome", '\u{f268}'), //  ("fa_circle", '\u{f111}'), // ï„‘ ("fa_circle_o", '\u{f10c}'), //  ("fa_circle_o_notch", '\u{f1ce}'), //  ("fa_circle_thin", '\u{f1db}'), //  ("fa_clipboard", '\u{f0ea}'), //  ("fa_clock_o", '\u{f017}'), //  ("fa_clone", '\u{f24d}'), // ï‰ ("fa_cloud", '\u{f0c2}'), //  ("fa_cloud_download", '\u{f0ed}'), //  ("fa_cloud_upload", '\u{f0ee}'), //  ("fa_code", '\u{f121}'), // ï„¡ ("fa_code_fork", '\u{f126}'), //  ("fa_codepen", '\u{f1cb}'), //  ("fa_codiepie", '\u{f284}'), //  ("fa_coffee", '\u{f0f4}'), //  ("fa_cog", '\u{f013}'), //  ("fa_cogs", '\u{f085}'), // ï‚… ("fa_columns", '\u{f0db}'), //  ("fa_comment", '\u{f075}'), // ïµ ("fa_comment_o", '\u{f0e5}'), //  ("fa_commenting", '\u{f27a}'), //  ("fa_commenting_o", '\u{f27b}'), //  ("fa_comments", '\u{f086}'), //  ("fa_comments_o", '\u{f0e6}'), //  ("fa_compass", '\u{f14e}'), // ï…Ž ("fa_compress", '\u{f066}'), // ï¦ ("fa_connectdevelop", '\u{f20e}'), //  ("fa_contao", '\u{f26d}'), //  ("fa_copyright", '\u{f1f9}'), //  ("fa_creative_commons", '\u{f25e}'), //  ("fa_credit_card", '\u{f09d}'), // ï‚ ("fa_credit_card_alt", '\u{f283}'), //  ("fa_crop", '\u{f125}'), // ï„¥ ("fa_crosshairs", '\u{f05b}'), // ï› ("fa_css3", '\u{f13c}'), //  ("fa_cube", '\u{f1b2}'), //  ("fa_cubes", '\u{f1b3}'), //  ("fa_cutlery", '\u{f0f5}'), //  ("fa_dashcube", '\u{f210}'), // ïˆ ("fa_database", '\u{f1c0}'), //  ("fa_deaf", '\u{f2a4}'), //  ("fa_delicious", '\u{f1a5}'), //  ("fa_desktop", '\u{f108}'), //  ("fa_deviantart", '\u{f1bd}'), //  ("fa_diamond", '\u{f219}'), //  ("fa_digg", '\u{f1a6}'), //  ("fa_dot_circle_o", '\u{f192}'), //  ("fa_download", '\u{f019}'), //  ("fa_dribbble", '\u{f17d}'), // ï…½ ("fa_dropbox", '\u{f16b}'), // ï…« ("fa_drupal", '\u{f1a9}'), //  ("fa_edge", '\u{f282}'), //  ("fa_eercast", '\u{f2da}'), //  ("fa_eject", '\u{f052}'), // ï’ ("fa_ellipsis_h", '\u{f141}'), // ï… ("fa_ellipsis_v", '\u{f142}'), // ï…‚ ("fa_empire", '\u{f1d1}'), //  ("fa_envelope", '\u{f0e0}'), //  ("fa_envelope_o", '\u{f003}'), //  ("fa_envelope_open", '\u{f2b6}'), //  ("fa_envelope_open_o", '\u{f2b7}'), //  ("fa_envelope_square", '\u{f199}'), //  ("fa_envira", '\u{f299}'), //  ("fa_eraser", '\u{f12d}'), // ï„­ ("fa_etsy", '\u{f2d7}'), // ï‹— ("fa_eur", '\u{f153}'), // ï…“ ("fa_exchange", '\u{f0ec}'), //  ("fa_exclamation", '\u{f12a}'), //  ("fa_exclamation_circle", '\u{f06a}'), // ïª ("fa_exclamation_triangle", '\u{f071}'), // ï± ("fa_expand", '\u{f065}'), // ï¥ ("fa_expeditedssl", '\u{f23e}'), //  ("fa_external_link", '\u{f08e}'), //  ("fa_external_link_square", '\u{f14c}'), // ï…Œ ("fa_eye", '\u{f06e}'), // ï® ("fa_eye_slash", '\u{f070}'), // ï° ("fa_eyedropper", '\u{f1fb}'), //  ("fa_facebook", '\u{f09a}'), //  ("fa_facebook_official", '\u{f230}'), //  ("fa_facebook_square", '\u{f082}'), // ï‚‚ ("fa_fast_backward", '\u{f049}'), // ï‰ ("fa_fast_forward", '\u{f050}'), // ï ("fa_fax", '\u{f1ac}'), //  ("fa_female", '\u{f182}'), //  ("fa_fighter_jet", '\u{f0fb}'), //  ("fa_file", '\u{f15b}'), // ï…› ("fa_file_archive_o", '\u{f1c6}'), //  ("fa_file_audio_o", '\u{f1c7}'), //  ("fa_file_code_o", '\u{f1c9}'), //  ("fa_file_excel_o", '\u{f1c3}'), //  ("fa_file_image_o", '\u{f1c5}'), //  ("fa_file_o", '\u{f016}'), //  ("fa_file_pdf_o", '\u{f1c1}'), // ï‡ ("fa_file_powerpoint_o", '\u{f1c4}'), //  ("fa_file_text", '\u{f15c}'), // ï…œ ("fa_file_text_o", '\u{f0f6}'), //  ("fa_file_video_o", '\u{f1c8}'), //  ("fa_file_word_o", '\u{f1c2}'), //  ("fa_files_o", '\u{f0c5}'), //  ("fa_film", '\u{f008}'), //  ("fa_filter", '\u{f0b0}'), // ï‚° ("fa_fire", '\u{f06d}'), // ï­ ("fa_fire_extinguisher", '\u{f134}'), // ï„´ ("fa_firefox", '\u{f269}'), //  ("fa_first_order", '\u{f2b0}'), //  ("fa_flag", '\u{f024}'), //  ("fa_flag_checkered", '\u{f11e}'), //  ("fa_flag_o", '\u{f11d}'), // ï„ ("fa_flask", '\u{f0c3}'), //  ("fa_flickr", '\u{f16e}'), // ï…® ("fa_floppy_o", '\u{f0c7}'), //  ("fa_folder", '\u{f07b}'), // ï» ("fa_folder_o", '\u{f114}'), // ï„” ("fa_folder_open", '\u{f07c}'), // ï¼ ("fa_folder_open_o", '\u{f115}'), // ï„• ("fa_font", '\u{f031}'), //  ("fa_font_awesome", '\u{f2b4}'), //  ("fa_fonticons", '\u{f280}'), //  ("fa_fort_awesome", '\u{f286}'), //  ("fa_forumbee", '\u{f211}'), //  ("fa_forward", '\u{f04e}'), // ïŽ ("fa_foursquare", '\u{f180}'), //  ("fa_free_code_camp", '\u{f2c5}'), // ï‹… ("fa_frown_o", '\u{f119}'), // ï„™ ("fa_futbol_o", '\u{f1e3}'), //  ("fa_gamepad", '\u{f11b}'), // ï„› ("fa_gavel", '\u{f0e3}'), //  ("fa_gbp", '\u{f154}'), // ï…” ("fa_genderless", '\u{f22d}'), //  ("fa_get_pocket", '\u{f265}'), //  ("fa_gg", '\u{f260}'), //  ("fa_gg_circle", '\u{f261}'), //  ("fa_gift", '\u{f06b}'), // ï« ("fa_git", '\u{f1d3}'), //  ("fa_git_square", '\u{f1d2}'), //  ("fa_github", '\u{f09b}'), // ï‚› ("fa_github_alt", '\u{f113}'), // ï„“ ("fa_github_square", '\u{f092}'), // ï‚’ ("fa_gitlab", '\u{f296}'), //  ("fa_glass", '\u{f000}'), //  ("fa_glide", '\u{f2a5}'), //  ("fa_glide_g", '\u{f2a6}'), //  ("fa_globe", '\u{f0ac}'), //  ("fa_google", '\u{f1a0}'), //  ("fa_google_plus", '\u{f0d5}'), //  ("fa_google_plus_official", '\u{f2b3}'), //  ("fa_google_plus_square", '\u{f0d4}'), //  ("fa_google_wallet", '\u{f1ee}'), //  ("fa_graduation_cap", '\u{f19d}'), // ï† ("fa_gratipay", '\u{f184}'), //  ("fa_grav", '\u{f2d6}'), // ï‹– ("fa_h_square", '\u{f0fd}'), //  ("fa_hacker_news", '\u{f1d4}'), //  ("fa_hand_lizard_o", '\u{f258}'), //  ("fa_hand_o_down", '\u{f0a7}'), // ï‚§ ("fa_hand_o_left", '\u{f0a5}'), // ï‚¥ ("fa_hand_o_right", '\u{f0a4}'), //  ("fa_hand_o_up", '\u{f0a6}'), //  ("fa_hand_paper_o", '\u{f256}'), //  ("fa_hand_peace_o", '\u{f25b}'), //  ("fa_hand_pointer_o", '\u{f25a}'), //  ("fa_hand_rock_o", '\u{f255}'), //  ("fa_hand_scissors_o", '\u{f257}'), //  ("fa_hand_spock_o", '\u{f259}'), //  ("fa_handshake_o", '\u{f2b5}'), //  ("fa_hashtag", '\u{f292}'), //  ("fa_hdd_o", '\u{f0a0}'), // ï‚  ("fa_header", '\u{f1dc}'), //  ("fa_headphones", '\u{f025}'), //  ("fa_heart", '\u{f004}'), //  ("fa_heart_o", '\u{f08a}'), //  ("fa_heartbeat", '\u{f21e}'), //  ("fa_history", '\u{f1da}'), //  ("fa_home", '\u{f015}'), //  ("fa_hospital_o", '\u{f0f8}'), //  ("fa_hourglass", '\u{f254}'), //  ("fa_hourglass_end", '\u{f253}'), //  ("fa_hourglass_half", '\u{f252}'), //  ("fa_hourglass_o", '\u{f250}'), // ï‰ ("fa_hourglass_start", '\u{f251}'), //  ("fa_houzz", '\u{f27c}'), //  ("fa_html5", '\u{f13b}'), // ï„» ("fa_i_cursor", '\u{f246}'), //  ("fa_id_badge", '\u{f2c1}'), // ï‹ ("fa_id_card", '\u{f2c2}'), // ï‹‚ ("fa_id_card_o", '\u{f2c3}'), //  ("fa_ils", '\u{f20b}'), //  ("fa_imdb", '\u{f2d8}'), //  ("fa_inbox", '\u{f01c}'), //  ("fa_indent", '\u{f03c}'), //  ("fa_industry", '\u{f275}'), //  ("fa_info", '\u{f129}'), // ï„© ("fa_info_circle", '\u{f05a}'), // ïš ("fa_inr", '\u{f156}'), // ï…– ("fa_instagram", '\u{f16d}'), // ï…­ ("fa_internet_explorer", '\u{f26b}'), //  ("fa_ioxhost", '\u{f208}'), //  ("fa_italic", '\u{f033}'), //  ("fa_joomla", '\u{f1aa}'), //  ("fa_jpy", '\u{f157}'), // ï…— ("fa_jsfiddle", '\u{f1cc}'), //  ("fa_key", '\u{f084}'), // ï‚„ ("fa_keyboard_o", '\u{f11c}'), //  ("fa_krw", '\u{f159}'), // ï…™ ("fa_language", '\u{f1ab}'), //  ("fa_laptop", '\u{f109}'), //  ("fa_lastfm", '\u{f202}'), //  ("fa_lastfm_square", '\u{f203}'), //  ("fa_leaf", '\u{f06c}'), // ï¬ ("fa_leanpub", '\u{f212}'), //  ("fa_lemon_o", '\u{f094}'), // ï‚” ("fa_level_down", '\u{f149}'), // ï…‰ ("fa_level_up", '\u{f148}'), // ï…ˆ ("fa_life_ring", '\u{f1cd}'), // ï‡ ("fa_lightbulb_o", '\u{f0eb}'), //  ("fa_line_chart", '\u{f201}'), // ïˆ ("fa_link", '\u{f0c1}'), // ïƒ ("fa_linkedin", '\u{f0e1}'), //  ("fa_linkedin_square", '\u{f08c}'), //  ("fa_linode", '\u{f2b8}'), //  ("fa_linux", '\u{f17c}'), // ï…¼ ("fa_list", '\u{f03a}'), //  ("fa_list_alt", '\u{f022}'), //  ("fa_list_ol", '\u{f0cb}'), //  ("fa_list_ul", '\u{f0ca}'), //  ("fa_location_arrow", '\u{f124}'), //  ("fa_lock", '\u{f023}'), //  ("fa_long_arrow_down", '\u{f175}'), // ï…µ ("fa_long_arrow_left", '\u{f177}'), // ï…· ("fa_long_arrow_right", '\u{f178}'), // ï…¸ ("fa_long_arrow_up", '\u{f176}'), // ï…¶ ("fa_low_vision", '\u{f2a8}'), //  ("fa_magic", '\u{f0d0}'), // ïƒ ("fa_magnet", '\u{f076}'), // ï¶ ("fa_male", '\u{f183}'), //  ("fa_map", '\u{f279}'), //  ("fa_map_marker", '\u{f041}'), // ï ("fa_map_o", '\u{f278}'), //  ("fa_map_pin", '\u{f276}'), //  ("fa_map_signs", '\u{f277}'), //  ("fa_mars", '\u{f222}'), //  ("fa_mars_double", '\u{f227}'), //  ("fa_mars_stroke", '\u{f229}'), //  ("fa_mars_stroke_h", '\u{f22b}'), //  ("fa_mars_stroke_v", '\u{f22a}'), //  ("fa_maxcdn", '\u{f136}'), // ï„¶ ("fa_meanpath", '\u{f20c}'), //  ("fa_medium", '\u{f23a}'), //  ("fa_medkit", '\u{f0fa}'), //  ("fa_meetup", '\u{f2e0}'), // ï‹  ("fa_meh_o", '\u{f11a}'), //  ("fa_mercury", '\u{f223}'), //  ("fa_microchip", '\u{f2db}'), // ï‹› ("fa_microphone", '\u{f130}'), // ï„° ("fa_microphone_slash", '\u{f131}'), //  ("fa_minus", '\u{f068}'), // ï¨ ("fa_minus_circle", '\u{f056}'), // ï– ("fa_minus_square", '\u{f146}'), // ï…† ("fa_minus_square_o", '\u{f147}'), // ï…‡ ("fa_mixcloud", '\u{f289}'), //  ("fa_mobile", '\u{f10b}'), // ï„‹ ("fa_modx", '\u{f285}'), //  ("fa_money", '\u{f0d6}'), //  ("fa_moon_o", '\u{f186}'), //  ("fa_motorcycle", '\u{f21c}'), //  ("fa_mouse_pointer", '\u{f245}'), //  ("fa_music", '\u{f001}'), // ï€ ("fa_neuter", '\u{f22c}'), //  ("fa_newspaper_o", '\u{f1ea}'), //  ("fa_object_group", '\u{f247}'), //  ("fa_object_ungroup", '\u{f248}'), //  ("fa_odnoklassniki", '\u{f263}'), //  ("fa_odnoklassniki_square", '\u{f264}'), //  ("fa_opencart", '\u{f23d}'), //  ("fa_openid", '\u{f19b}'), //  ("fa_opera", '\u{f26a}'), //  ("fa_optin_monster", '\u{f23c}'), //  ("fa_outdent", '\u{f03b}'), //  ("fa_pagelines", '\u{f18c}'), //  ("fa_paint_brush", '\u{f1fc}'), //  ("fa_paper_plane", '\u{f1d8}'), //  ("fa_paper_plane_o", '\u{f1d9}'), //  ("fa_paperclip", '\u{f0c6}'), //  ("fa_paragraph", '\u{f1dd}'), // ï‡ ("fa_pause", '\u{f04c}'), // ïŒ ("fa_pause_circle", '\u{f28b}'), //  ("fa_pause_circle_o", '\u{f28c}'), //  ("fa_paw", '\u{f1b0}'), //  ("fa_paypal", '\u{f1ed}'), //  ("fa_pencil", '\u{f040}'), // ï€ ("fa_pencil_square", '\u{f14b}'), // ï…‹ ("fa_pencil_square_o", '\u{f044}'), // ï„ ("fa_percent", '\u{f295}'), //  ("fa_phone", '\u{f095}'), // ï‚• ("fa_phone_square", '\u{f098}'), //  ("fa_picture_o", '\u{f03e}'), //  ("fa_pie_chart", '\u{f200}'), //  ("fa_pied_piper", '\u{f2ae}'), //  ("fa_pied_piper_alt", '\u{f1a8}'), //  ("fa_pied_piper_pp", '\u{f1a7}'), //  ("fa_pinterest", '\u{f0d2}'), //  ("fa_pinterest_p", '\u{f231}'), //  ("fa_pinterest_square", '\u{f0d3}'), //  ("fa_plane", '\u{f072}'), // ï² ("fa_play", '\u{f04b}'), // ï‹ ("fa_play_circle", '\u{f144}'), // ï…„ ("fa_play_circle_o", '\u{f01d}'), // ï€ ("fa_plug", '\u{f1e6}'), //  ("fa_plus", '\u{f067}'), // ï§ ("fa_plus_circle", '\u{f055}'), // ï• ("fa_plus_square", '\u{f0fe}'), //  ("fa_plus_square_o", '\u{f196}'), //  ("fa_podcast", '\u{f2ce}'), //  ("fa_power_off", '\u{f011}'), //  ("fa_print", '\u{f02f}'), //  ("fa_product_hunt", '\u{f288}'), //  ("fa_puzzle_piece", '\u{f12e}'), // ï„® ("fa_qq", '\u{f1d6}'), //  ("fa_qrcode", '\u{f029}'), //  ("fa_question", '\u{f128}'), //  ("fa_question_circle", '\u{f059}'), // ï™ ("fa_question_circle_o", '\u{f29c}'), //  ("fa_quora", '\u{f2c4}'), // ï‹„ ("fa_quote_left", '\u{f10d}'), // ï„ ("fa_quote_right", '\u{f10e}'), //  ("fa_random", '\u{f074}'), // ï´ ("fa_ravelry", '\u{f2d9}'), // ï‹™ ("fa_rebel", '\u{f1d0}'), // ï‡ ("fa_recycle", '\u{f1b8}'), //  ("fa_reddit", '\u{f1a1}'), //  ("fa_reddit_alien", '\u{f281}'), // ïŠ ("fa_reddit_square", '\u{f1a2}'), //  ("fa_refresh", '\u{f021}'), //  ("fa_registered", '\u{f25d}'), // ï‰ ("fa_renren", '\u{f18b}'), //  ("fa_repeat", '\u{f01e}'), //  ("fa_reply", '\u{f112}'), // ï„’ ("fa_reply_all", '\u{f122}'), // ï„¢ ("fa_retweet", '\u{f079}'), // ï¹ ("fa_road", '\u{f018}'), //  ("fa_rocket", '\u{f135}'), //  ("fa_rss", '\u{f09e}'), //  ("fa_rss_square", '\u{f143}'), // ï…ƒ ("fa_rub", '\u{f158}'), // ï…˜ ("fa_safari", '\u{f267}'), //  ("fa_scissors", '\u{f0c4}'), //  ("fa_scribd", '\u{f28a}'), //  ("fa_search", '\u{f002}'), //  ("fa_search_minus", '\u{f010}'), // ï€ ("fa_search_plus", '\u{f00e}'), //  ("fa_sellsy", '\u{f213}'), //  ("fa_server", '\u{f233}'), //  ("fa_share", '\u{f064}'), // ï¤ ("fa_share_alt", '\u{f1e0}'), //  ("fa_share_alt_square", '\u{f1e1}'), //  ("fa_share_square", '\u{f14d}'), // ï… ("fa_share_square_o", '\u{f045}'), // ï… ("fa_shield", '\u{f132}'), //  ("fa_ship", '\u{f21a}'), //  ("fa_shirtsinbulk", '\u{f214}'), //  ("fa_shopping_bag", '\u{f290}'), // ïŠ ("fa_shopping_basket", '\u{f291}'), //  ("fa_shopping_cart", '\u{f07a}'), // ïº ("fa_shower", '\u{f2cc}'), //  ("fa_sign_in", '\u{f090}'), // ï‚ ("fa_sign_language", '\u{f2a7}'), //  ("fa_sign_out", '\u{f08b}'), // ï‚‹ ("fa_signal", '\u{f012}'), //  ("fa_simplybuilt", '\u{f215}'), //  ("fa_sitemap", '\u{f0e8}'), //  ("fa_skyatlas", '\u{f216}'), //  ("fa_skype", '\u{f17e}'), // ï…¾ ("fa_slack", '\u{f198}'), //  ("fa_sliders", '\u{f1de}'), //  ("fa_slideshare", '\u{f1e7}'), //  ("fa_smile_o", '\u{f118}'), //  ("fa_snapchat", '\u{f2ab}'), //  ("fa_snapchat_ghost", '\u{f2ac}'), //  ("fa_snapchat_square", '\u{f2ad}'), //  ("fa_snowflake_o", '\u{f2dc}'), //  ("fa_sort", '\u{f0dc}'), //  ("fa_sort_alpha_asc", '\u{f15d}'), // ï… ("fa_sort_alpha_desc", '\u{f15e}'), // ï…ž ("fa_sort_amount_asc", '\u{f160}'), // ï…  ("fa_sort_amount_desc", '\u{f161}'), // ï…¡ ("fa_sort_asc", '\u{f0de}'), //  ("fa_sort_desc", '\u{f0dd}'), // ïƒ ("fa_sort_numeric_asc", '\u{f162}'), // ï…¢ ("fa_sort_numeric_desc", '\u{f163}'), // ï…£ ("fa_soundcloud", '\u{f1be}'), //  ("fa_space_shuttle", '\u{f197}'), //  ("fa_spinner", '\u{f110}'), // ï„ ("fa_spoon", '\u{f1b1}'), //  ("fa_spotify", '\u{f1bc}'), //  ("fa_square", '\u{f0c8}'), //  ("fa_square_o", '\u{f096}'), // ï‚– ("fa_stack_exchange", '\u{f18d}'), // ï† ("fa_stack_overflow", '\u{f16c}'), // ï…¬ ("fa_star", '\u{f005}'), //  ("fa_star_half", '\u{f089}'), //  ("fa_star_half_o", '\u{f123}'), // ï„£ ("fa_star_o", '\u{f006}'), //  ("fa_steam", '\u{f1b6}'), //  ("fa_steam_square", '\u{f1b7}'), //  ("fa_step_backward", '\u{f048}'), // ïˆ ("fa_step_forward", '\u{f051}'), // ï‘ ("fa_stethoscope", '\u{f0f1}'), //  ("fa_sticky_note", '\u{f249}'), //  ("fa_sticky_note_o", '\u{f24a}'), //  ("fa_stop", '\u{f04d}'), // ï ("fa_stop_circle", '\u{f28d}'), // ïŠ ("fa_stop_circle_o", '\u{f28e}'), //  ("fa_street_view", '\u{f21d}'), // ïˆ ("fa_strikethrough", '\u{f0cc}'), //  ("fa_stumbleupon", '\u{f1a4}'), //  ("fa_stumbleupon_circle", '\u{f1a3}'), //  ("fa_subscript", '\u{f12c}'), //  ("fa_subway", '\u{f239}'), //  ("fa_suitcase", '\u{f0f2}'), //  ("fa_sun_o", '\u{f185}'), //  ("fa_superpowers", '\u{f2dd}'), // ï‹ ("fa_superscript", '\u{f12b}'), // ï„« ("fa_table", '\u{f0ce}'), //  ("fa_tablet", '\u{f10a}'), //  ("fa_tachometer", '\u{f0e4}'), //  ("fa_tag", '\u{f02b}'), //  ("fa_tags", '\u{f02c}'), //  ("fa_tasks", '\u{f0ae}'), // ï‚® ("fa_taxi", '\u{f1ba}'), //  ("fa_telegram", '\u{f2c6}'), //  ("fa_television", '\u{f26c}'), //  ("fa_tencent_weibo", '\u{f1d5}'), //  ("fa_terminal", '\u{f120}'), // ï„  ("fa_text_height", '\u{f034}'), //  ("fa_text_width", '\u{f035}'), //  ("fa_th", '\u{f00a}'), //  ("fa_th_large", '\u{f009}'), //  ("fa_th_list", '\u{f00b}'), //  ("fa_themeisle", '\u{f2b2}'), //  ("fa_thermometer_empty", '\u{f2cb}'), // ï‹‹ ("fa_thermometer_full", '\u{f2c7}'), //  ("fa_thermometer_half", '\u{f2c9}'), //  ("fa_thermometer_quarter", '\u{f2ca}'), //  ("fa_thermometer_three_quarters", '\u{f2c8}'), //  ("fa_thumb_tack", '\u{f08d}'), // ï‚ ("fa_thumbs_down", '\u{f165}'), // ï…¥ ("fa_thumbs_o_down", '\u{f088}'), //  ("fa_thumbs_o_up", '\u{f087}'), //  ("fa_thumbs_up", '\u{f164}'), // ï…¤ ("fa_ticket", '\u{f145}'), // ï…… ("fa_times", '\u{f00d}'), // ï€ ("fa_times_circle", '\u{f057}'), // ï— ("fa_times_circle_o", '\u{f05c}'), // ïœ ("fa_tint", '\u{f043}'), // ïƒ ("fa_toggle_off", '\u{f204}'), //  ("fa_toggle_on", '\u{f205}'), //  ("fa_trademark", '\u{f25c}'), //  ("fa_train", '\u{f238}'), //  ("fa_transgender", '\u{f224}'), //  ("fa_transgender_alt", '\u{f225}'), //  ("fa_trash", '\u{f1f8}'), //  ("fa_trash_o", '\u{f014}'), //  ("fa_tree", '\u{f1bb}'), //  ("fa_trello", '\u{f181}'), // ï† ("fa_tripadvisor", '\u{f262}'), //  ("fa_trophy", '\u{f091}'), // ï‚‘ ("fa_truck", '\u{f0d1}'), //  ("fa_try", '\u{f195}'), //  ("fa_tty", '\u{f1e4}'), //  ("fa_tumblr", '\u{f173}'), // ï…³ ("fa_tumblr_square", '\u{f174}'), // ï…´ ("fa_twitch", '\u{f1e8}'), //  ("fa_twitter", '\u{f099}'), // ï‚™ ("fa_twitter_square", '\u{f081}'), // ï‚ ("fa_umbrella", '\u{f0e9}'), //  ("fa_underline", '\u{f0cd}'), // ïƒ ("fa_undo", '\u{f0e2}'), //  ("fa_universal_access", '\u{f29a}'), //  ("fa_university", '\u{f19c}'), //  ("fa_unlock", '\u{f09c}'), //  ("fa_unlock_alt", '\u{f13e}'), //  ("fa_upload", '\u{f093}'), // ï‚“ ("fa_usb", '\u{f287}'), //  ("fa_usd", '\u{f155}'), // ï…• ("fa_user", '\u{f007}'), //  ("fa_user_circle", '\u{f2bd}'), //  ("fa_user_circle_o", '\u{f2be}'), //  ("fa_user_md", '\u{f0f0}'), //  ("fa_user_o", '\u{f2c0}'), // ï‹€ ("fa_user_plus", '\u{f234}'), //  ("fa_user_secret", '\u{f21b}'), //  ("fa_user_times", '\u{f235}'), //  ("fa_users", '\u{f0c0}'), //  ("fa_venus", '\u{f221}'), //  ("fa_venus_double", '\u{f226}'), //  ("fa_venus_mars", '\u{f228}'), //  ("fa_viacoin", '\u{f237}'), //  ("fa_viadeo", '\u{f2a9}'), //  ("fa_viadeo_square", '\u{f2aa}'), //  ("fa_video_camera", '\u{f03d}'), //  ("fa_vimeo", '\u{f27d}'), //  ("fa_vimeo_square", '\u{f194}'), //  ("fa_vine", '\u{f1ca}'), //  ("fa_vk", '\u{f189}'), //  ("fa_volume_control_phone", '\u{f2a0}'), //  ("fa_volume_down", '\u{f027}'), //  ("fa_volume_off", '\u{f026}'), //  ("fa_volume_up", '\u{f028}'), //  ("fa_weibo", '\u{f18a}'), //  ("fa_weixin", '\u{f1d7}'), //  ("fa_whatsapp", '\u{f232}'), //  ("fa_wheelchair", '\u{f193}'), //  ("fa_wheelchair_alt", '\u{f29b}'), //  ("fa_wifi", '\u{f1eb}'), //  ("fa_wikipedia_w", '\u{f266}'), //  ("fa_window_close", '\u{f2d3}'), // ï‹“ ("fa_window_close_o", '\u{f2d4}'), // ï‹” ("fa_window_maximize", '\u{f2d0}'), // ï‹ ("fa_window_minimize", '\u{f2d1}'), // ï‹‘ ("fa_window_restore", '\u{f2d2}'), // ï‹’ ("fa_windows", '\u{f17a}'), // ï…º ("fa_wordpress", '\u{f19a}'), //  ("fa_wpbeginner", '\u{f297}'), //  ("fa_wpexplorer", '\u{f2de}'), //  ("fa_wpforms", '\u{f298}'), //  ("fa_wrench", '\u{f0ad}'), // ï‚­ ("fa_xing", '\u{f168}'), // ï…¨ ("fa_xing_square", '\u{f169}'), // ï…© ("fa_y_combinator", '\u{f23b}'), //  ("fa_yahoo", '\u{f19e}'), //  ("fa_yelp", '\u{f1e9}'), //  ("fa_yoast", '\u{f2b1}'), //  ("fa_youtube", '\u{f167}'), // ï…§ ("fa_youtube_play", '\u{f16a}'), // ï…ª ("fa_youtube_square", '\u{f166}'), // ï…¦ ("fae_apple_fruit", '\u{e29e}'), //  ("fae_atom", '\u{e27f}'), //  ("fae_bacteria", '\u{e280}'), //  ("fae_banana", '\u{e281}'), // îŠ ("fae_bath", '\u{e282}'), //  ("fae_bed", '\u{e283}'), //  ("fae_benzene", '\u{e284}'), //  ("fae_bigger", '\u{e285}'), //  ("fae_biohazard", '\u{e286}'), //  ("fae_blogger_circle", '\u{e287}'), //  ("fae_blogger_square", '\u{e288}'), //  ("fae_bones", '\u{e289}'), //  ("fae_book_open", '\u{e28a}'), //  ("fae_book_open_o", '\u{e28b}'), //  ("fae_brain", '\u{e28c}'), //  ("fae_bread", '\u{e28d}'), // îŠ ("fae_butterfly", '\u{e28e}'), //  ("fae_carot", '\u{e28f}'), // îŠ ("fae_cc_by", '\u{e290}'), // îŠ ("fae_cc_cc", '\u{e291}'), //  ("fae_cc_nc", '\u{e292}'), //  ("fae_cc_nc_eu", '\u{e293}'), //  ("fae_cc_nc_jp", '\u{e294}'), //  ("fae_cc_nd", '\u{e295}'), //  ("fae_cc_remix", '\u{e296}'), //  ("fae_cc_sa", '\u{e297}'), //  ("fae_cc_share", '\u{e298}'), //  ("fae_cc_zero", '\u{e299}'), //  ("fae_checklist_o", '\u{e29a}'), //  ("fae_cheese", '\u{e264}'), //  ("fae_cherry", '\u{e29b}'), //  ("fae_chess_bishop", '\u{e29c}'), //  ("fae_chess_horse", '\u{e25f}'), //  ("fae_chess_king", '\u{e260}'), //  ("fae_chess_pawn", '\u{e261}'), //  ("fae_chess_queen", '\u{e262}'), //  ("fae_chess_tower", '\u{e263}'), //  ("fae_chicken_thigh", '\u{e29f}'), //  ("fae_chilli", '\u{e265}'), //  ("fae_chip", '\u{e266}'), //  ("fae_cicling", '\u{e267}'), //  ("fae_cloud", '\u{e268}'), //  ("fae_cockroach", '\u{e269}'), //  ("fae_coffe_beans", '\u{e26a}'), //  ("fae_coins", '\u{e26b}'), //  ("fae_comb", '\u{e26c}'), //  ("fae_comet", '\u{e26d}'), //  ("fae_crown", '\u{e26e}'), //  ("fae_cup_coffe", '\u{e26f}'), //  ("fae_dice", '\u{e270}'), //  ("fae_disco", '\u{e271}'), //  ("fae_dna", '\u{e272}'), //  ("fae_donut", '\u{e273}'), //  ("fae_dress", '\u{e274}'), //  ("fae_drop", '\u{e275}'), //  ("fae_ello", '\u{e276}'), //  ("fae_envelope_open", '\u{e277}'), //  ("fae_envelope_open_o", '\u{e278}'), //  ("fae_equal", '\u{e279}'), //  ("fae_equal_bigger", '\u{e27a}'), //  ("fae_feedly", '\u{e27b}'), //  ("fae_file_export", '\u{e27c}'), //  ("fae_file_import", '\u{e27d}'), //  ("fae_fingerprint", '\u{e23f}'), //  ("fae_floppy", '\u{e240}'), //  ("fae_footprint", '\u{e241}'), // î‰ ("fae_freecodecamp", '\u{e242}'), //  ("fae_galaxy", '\u{e243}'), //  ("fae_galery", '\u{e244}'), //  ("fae_gift_card", '\u{e2a0}'), //  ("fae_glass", '\u{e245}'), //  ("fae_google_drive", '\u{e246}'), //  ("fae_google_play", '\u{e247}'), //  ("fae_gps", '\u{e248}'), //  ("fae_grav", '\u{e249}'), //  ("fae_guitar", '\u{e24a}'), //  ("fae_gut", '\u{e24b}'), //  ("fae_halter", '\u{e24c}'), //  ("fae_hamburger", '\u{e24d}'), // î‰ ("fae_hat", '\u{e24e}'), //  ("fae_hexagon", '\u{e24f}'), // î‰ ("fae_high_heel", '\u{e250}'), // î‰ ("fae_hotdog", '\u{e251}'), //  ("fae_ice_cream", '\u{e252}'), //  ("fae_id_card", '\u{e253}'), //  ("fae_imdb", '\u{e254}'), //  ("fae_infinity", '\u{e255}'), //  ("fae_injection", '\u{e2a1}'), //  ("fae_isle", '\u{e2a2}'), //  ("fae_java", '\u{e256}'), //  ("fae_layers", '\u{e257}'), //  ("fae_lips", '\u{e258}'), //  ("fae_lipstick", '\u{e259}'), //  ("fae_liver", '\u{e25a}'), //  ("fae_lollipop", '\u{e2a3}'), //  ("fae_loyalty_card", '\u{e2a4}'), //  ("fae_lung", '\u{e25b}'), //  ("fae_makeup_brushes", '\u{e25c}'), //  ("fae_maximize", '\u{e25d}'), // î‰ ("fae_meat", '\u{e2a5}'), //  ("fae_medicine", '\u{e221}'), //  ("fae_microscope", '\u{e222}'), //  ("fae_milk_bottle", '\u{e223}'), //  ("fae_minimize", '\u{e224}'), //  ("fae_molecule", '\u{e225}'), //  ("fae_moon_cloud", '\u{e226}'), //  ("fae_mountains", '\u{e2a6}'), //  ("fae_mushroom", '\u{e227}'), //  ("fae_mustache", '\u{e228}'), //  ("fae_mysql", '\u{e229}'), //  ("fae_nintendo", '\u{e22a}'), //  ("fae_orange", '\u{e2a7}'), //  ("fae_palette_color", '\u{e22b}'), //  ("fae_peach", '\u{e2a8}'), //  ("fae_pear", '\u{e2a9}'), //  ("fae_pi", '\u{e22c}'), //  ("fae_pizza", '\u{e22d}'), //  ("fae_planet", '\u{e22e}'), //  ("fae_plant", '\u{e22f}'), //  ("fae_playstation", '\u{e230}'), //  ("fae_poison", '\u{e231}'), //  ("fae_popcorn", '\u{e232}'), //  ("fae_popsicle", '\u{e233}'), //  ("fae_pulse", '\u{e234}'), //  ("fae_python", '\u{e235}'), //  ("fae_quora_circle", '\u{e236}'), //  ("fae_quora_square", '\u{e237}'), //  ("fae_radioactive", '\u{e238}'), //  ("fae_raining", '\u{e239}'), //  ("fae_real_heart", '\u{e23a}'), //  ("fae_refrigerator", '\u{e23b}'), //  ("fae_restore", '\u{e23c}'), //  ("fae_ring", '\u{e23d}'), //  ("fae_ruby", '\u{e23e}'), //  ("fae_ruby_o", '\u{e21e}'), //  ("fae_ruler", '\u{e21f}'), //  ("fae_shirt", '\u{e218}'), //  ("fae_slash", '\u{e216}'), //  ("fae_smaller", '\u{e200}'), //  ("fae_snowing", '\u{e201}'), // îˆ ("fae_soda", '\u{e202}'), //  ("fae_sofa", '\u{e203}'), //  ("fae_soup", '\u{e204}'), //  ("fae_spermatozoon", '\u{e205}'), //  ("fae_spin_double", '\u{e206}'), //  ("fae_stomach", '\u{e207}'), //  ("fae_storm", '\u{e208}'), //  ("fae_sun_cloud", '\u{e21d}'), // îˆ ("fae_sushi", '\u{e21a}'), //  ("fae_tacos", '\u{e219}'), //  ("fae_telegram", '\u{e217}'), //  ("fae_telegram_circle", '\u{e215}'), //  ("fae_telescope", '\u{e209}'), //  ("fae_thermometer", '\u{e20a}'), //  ("fae_thermometer_high", '\u{e20b}'), //  ("fae_thermometer_low", '\u{e20c}'), //  ("fae_thin_close", '\u{e20d}'), // îˆ ("fae_toilet", '\u{e20e}'), //  ("fae_tools", '\u{e20f}'), // îˆ ("fae_tooth", '\u{e210}'), // îˆ ("fae_tree", '\u{e21c}'), //  ("fae_triangle_ruler", '\u{e21b}'), //  ("fae_umbrella", '\u{e220}'), //  ("fae_uterus", '\u{e211}'), //  ("fae_virus", '\u{e214}'), //  ("fae_w3c", '\u{e212}'), //  ("fae_walking", '\u{e213}'), //  ("fae_wallet", '\u{e25e}'), //  ("fae_wind", '\u{e27e}'), //  ("fae_xbox", '\u{e29d}'), // îŠ ("iec_power", '\u{23fb}'), // â» ("iec_power_off", '\u{2b58}'), // â­˜ ("iec_power_on", '\u{23fd}'), // â½ ("iec_sleep_mode", '\u{23fe}'), // â¾ ("iec_toggle_power", '\u{23fc}'), // â¼ ("indent_line", '\u{e621}'), //  ("linux_almalinux", '\u{f31d}'), // ïŒ ("linux_alpine", '\u{f300}'), //  ("linux_aosc", '\u{f301}'), // ïŒ ("linux_apple", '\u{f302}'), //  ("linux_archcraft", '\u{f345}'), // ï… ("linux_archlabs", '\u{f31e}'), //  ("linux_archlinux", '\u{f303}'), //  ("linux_arcolinux", '\u{f346}'), // ï† ("linux_arduino", '\u{f34b}'), // ï‹ ("linux_artix", '\u{f31f}'), //  ("linux_awesome", '\u{f354}'), // ï” ("linux_biglinux", '\u{f347}'), // ï‡ ("linux_bspwm", '\u{f355}'), // ï• ("linux_budgie", '\u{f320}'), //  ("linux_centos", '\u{f304}'), //  ("linux_cinnamon", '\u{f35f}'), // ïŸ ("linux_codeberg", '\u{f330}'), //  ("linux_coreos", '\u{f305}'), //  ("linux_crystal", '\u{f348}'), // ïˆ ("linux_debian", '\u{f306}'), //  ("linux_deepin", '\u{f321}'), //  ("linux_devuan", '\u{f307}'), //  ("linux_docker", '\u{f308}'), //  ("linux_dwm", '\u{f356}'), // ï– ("linux_elementary", '\u{f309}'), //  ("linux_endeavour", '\u{f322}'), //  ("linux_enlightenment", '\u{f357}'), // ï— ("linux_fdroid", '\u{f36a}'), // ïª ("linux_fedora", '\u{f30a}'), //  ("linux_fedora_inverse", '\u{f30b}'), //  ("linux_ferris", '\u{f323}'), //  ("linux_flathub", '\u{f324}'), //  ("linux_fluxbox", '\u{f358}'), // ï˜ ("linux_forgejo", '\u{f335}'), //  ("linux_fosdem", '\u{f36b}'), // ï« ("linux_freebsd", '\u{f30c}'), //  ("linux_freecad", '\u{f336}'), //  ("linux_freedesktop", '\u{f360}'), // ï  ("linux_garuda", '\u{f337}'), //  ("linux_gentoo", '\u{f30d}'), // ïŒ ("linux_gimp", '\u{f338}'), //  ("linux_gitea", '\u{f339}'), //  ("linux_gnome", '\u{f361}'), // ï¡ ("linux_gnu_guix", '\u{f325}'), //  ("linux_gtk", '\u{f362}'), // ï¢ ("linux_hyperbola", '\u{f33a}'), //  ("linux_hyprland", '\u{f359}'), // ï™ ("linux_i3", '\u{f35a}'), // ïš ("linux_illumos", '\u{f326}'), //  ("linux_inkscape", '\u{f33b}'), //  ("linux_jwm", '\u{f35b}'), // ï› ("linux_kali_linux", '\u{f327}'), //  ("linux_kde_neon", '\u{f331}'), //  ("linux_kde_plasma", '\u{f332}'), //  ("linux_kdenlive", '\u{f33c}'), //  ("linux_kicad", '\u{f34c}'), // ïŒ ("linux_krita", '\u{f33d}'), //  ("linux_kubuntu", '\u{f333}'), //  ("linux_kubuntu_inverse", '\u{f334}'), //  ("linux_linuxmint", '\u{f30e}'), //  ("linux_linuxmint_inverse", '\u{f30f}'), // ïŒ ("linux_locos", '\u{f349}'), // ï‰ ("linux_lxde", '\u{f363}'), // ï£ ("linux_lxle", '\u{f33e}'), //  ("linux_lxqt", '\u{f364}'), // ï¤ ("linux_mageia", '\u{f310}'), // ïŒ ("linux_mandriva", '\u{f311}'), //  ("linux_manjaro", '\u{f312}'), //  ("linux_mate", '\u{f365}'), // ï¥ ("linux_mpv", '\u{f36e}'), // ï® ("linux_mxlinux", '\u{f33f}'), //  ("linux_neovim", '\u{f36f}'), // ï¯ ("linux_nixos", '\u{f313}'), //  ("linux_octoprint", '\u{f34d}'), // ï ("linux_openbsd", '\u{f328}'), //  ("linux_openscad", '\u{f34e}'), // ïŽ ("linux_opensuse", '\u{f314}'), //  ("linux_osh", '\u{f34f}'), // ï ("linux_oshwa", '\u{f350}'), // ï ("linux_osi", '\u{f36c}'), // ï¬ ("linux_parabola", '\u{f340}'), // ï€ ("linux_parrot", '\u{f329}'), //  ("linux_pop_os", '\u{f32a}'), //  ("linux_prusaslicer", '\u{f351}'), // ï‘ ("linux_puppy", '\u{f341}'), // ï ("linux_qtile", '\u{f35c}'), // ïœ ("linux_qubesos", '\u{f342}'), // ï‚ ("linux_raspberry_pi", '\u{f315}'), //  ("linux_redhat", '\u{f316}'), //  ("linux_reprap", '\u{f352}'), // ï’ ("linux_riscv", '\u{f353}'), // ï“ ("linux_rocky_linux", '\u{f32b}'), //  ("linux_sabayon", '\u{f317}'), //  ("linux_slackware", '\u{f318}'), //  ("linux_slackware_inverse", '\u{f319}'), //  ("linux_snappy", '\u{f32c}'), //  ("linux_solus", '\u{f32d}'), //  ("linux_sway", '\u{f35d}'), // ï ("linux_tails", '\u{f343}'), // ïƒ ("linux_thunderbird", '\u{f370}'), // ï° ("linux_tor", '\u{f371}'), // ï± ("linux_trisquel", '\u{f344}'), // ï„ ("linux_tux", '\u{f31a}'), //  ("linux_ubuntu", '\u{f31b}'), //  ("linux_ubuntu_inverse", '\u{f31c}'), //  ("linux_vanilla", '\u{f366}'), // ï¦ ("linux_void", '\u{f32e}'), //  ("linux_vscodium", '\u{f372}'), // ï² ("linux_wayland", '\u{f367}'), // ï§ ("linux_wikimedia", '\u{f36d}'), // ï­ ("linux_xerolinux", '\u{f34a}'), // ïŠ ("linux_xfce", '\u{f368}'), // ï¨ ("linux_xmonad", '\u{f35e}'), // ïž ("linux_xorg", '\u{f369}'), // ï© ("linux_zorin", '\u{f32f}'), //  ("md_ab_testing", '\u{f01c9}'), // 󰇉 ("md_abacus", '\u{f16e0}'), // ó±›  ("md_abjad_arabic", '\u{f1328}'), // 󱌨 ("md_abjad_hebrew", '\u{f1329}'), // 󱌩 ("md_abugida_devanagari", '\u{f132a}'), // 󱌪 ("md_abugida_thai", '\u{f132b}'), // 󱌫 ("md_access_point", '\u{f0003}'), // 󰀃 ("md_access_point_check", '\u{f1538}'), // 󱔸 ("md_access_point_minus", '\u{f1539}'), // ó±”¹ ("md_access_point_network", '\u{f0002}'), // 󰀂 ("md_access_point_network_off", '\u{f0be1}'), // 󰯡 ("md_access_point_off", '\u{f1511}'), // 󱔑 ("md_access_point_plus", '\u{f153a}'), // 󱔺 ("md_access_point_remove", '\u{f153b}'), // ó±”» ("md_account", '\u{f0004}'), // 󰀄 ("md_account_alert", '\u{f0005}'), // ó°€… ("md_account_alert_outline", '\u{f0b50}'), // ó°­ ("md_account_arrow_down", '\u{f1868}'), // 󱡨 ("md_account_arrow_down_outline", '\u{f1869}'), // 󱡩 ("md_account_arrow_left", '\u{f0b51}'), // ó°­‘ ("md_account_arrow_left_outline", '\u{f0b52}'), // ó°­’ ("md_account_arrow_right", '\u{f0b53}'), // ó°­“ ("md_account_arrow_right_outline", '\u{f0b54}'), // ó°­” ("md_account_arrow_up", '\u{f1867}'), // 󱡧 ("md_account_arrow_up_outline", '\u{f186a}'), // 󱡪 ("md_account_box", '\u{f0006}'), // 󰀆 ("md_account_box_multiple", '\u{f0934}'), // ó°¤´ ("md_account_box_multiple_outline", '\u{f100a}'), // 󱀊 ("md_account_box_outline", '\u{f0007}'), // 󰀇 ("md_account_cancel", '\u{f12df}'), // 󱋟 ("md_account_cancel_outline", '\u{f12e0}'), // 󱋠 ("md_account_cash", '\u{f1097}'), // 󱂗 ("md_account_cash_outline", '\u{f1098}'), // 󱂘 ("md_account_check", '\u{f0008}'), // 󰀈 ("md_account_check_outline", '\u{f0be2}'), // 󰯢 ("md_account_child", '\u{f0a89}'), // 󰪉 ("md_account_child_circle", '\u{f0a8a}'), // 󰪊 ("md_account_child_outline", '\u{f10c8}'), // 󱃈 ("md_account_circle", '\u{f0009}'), // 󰀉 ("md_account_circle_outline", '\u{f0b55}'), // ó°­• ("md_account_clock", '\u{f0b56}'), // ó°­– ("md_account_clock_outline", '\u{f0b57}'), // ó°­— ("md_account_cog", '\u{f1370}'), // ó±° ("md_account_cog_outline", '\u{f1371}'), // ó±± ("md_account_convert", '\u{f000a}'), // 󰀊 ("md_account_convert_outline", '\u{f1301}'), // ó±Œ ("md_account_cowboy_hat", '\u{f0e9b}'), // 󰺛 ("md_account_cowboy_hat_outline", '\u{f17f3}'), // 󱟳 ("md_account_details", '\u{f0631}'), // 󰘱 ("md_account_details_outline", '\u{f1372}'), // ó±² ("md_account_edit", '\u{f06bc}'), // ó°š¼ ("md_account_edit_outline", '\u{f0ffb}'), // ó°¿» ("md_account_eye", '\u{f0420}'), // ó°  ("md_account_eye_outline", '\u{f127b}'), // 󱉻 ("md_account_filter", '\u{f0936}'), // 󰤶 ("md_account_filter_outline", '\u{f0f9d}'), // ó°¾ ("md_account_group", '\u{f0849}'), // 󰡉 ("md_account_group_outline", '\u{f0b58}'), // ó°­˜ ("md_account_hard_hat", '\u{f05b5}'), // ó°–µ ("md_account_hard_hat_outline", '\u{f1a1f}'), // 󱨟 ("md_account_heart", '\u{f0899}'), // ó°¢™ ("md_account_heart_outline", '\u{f0be3}'), // 󰯣 ("md_account_injury", '\u{f1815}'), // ó± • ("md_account_injury_outline", '\u{f1816}'), // ó± – ("md_account_key", '\u{f000b}'), // 󰀋 ("md_account_key_outline", '\u{f0be4}'), // 󰯤 ("md_account_lock", '\u{f115e}'), // ó±…ž ("md_account_lock_open", '\u{f1960}'), // ó±¥  ("md_account_lock_open_outline", '\u{f1961}'), // 󱥡 ("md_account_lock_outline", '\u{f115f}'), // ó±…Ÿ ("md_account_minus", '\u{f000d}'), // ó°€ ("md_account_minus_outline", '\u{f0aec}'), // 󰫬 ("md_account_multiple", '\u{f000e}'), // 󰀎 ("md_account_multiple_check", '\u{f08c5}'), // ó°£… ("md_account_multiple_check_outline", '\u{f11fe}'), // 󱇾 ("md_account_multiple_minus", '\u{f05d3}'), // ó°—“ ("md_account_multiple_minus_outline", '\u{f0be5}'), // 󰯥 ("md_account_multiple_outline", '\u{f000f}'), // ó°€ ("md_account_multiple_plus", '\u{f0010}'), // ó°€ ("md_account_multiple_plus_outline", '\u{f0800}'), // ó° € ("md_account_multiple_remove", '\u{f120a}'), // 󱈊 ("md_account_multiple_remove_outline", '\u{f120b}'), // 󱈋 ("md_account_music", '\u{f0803}'), // ó° ƒ ("md_account_music_outline", '\u{f0ce9}'), // 󰳩 ("md_account_network", '\u{f0011}'), // 󰀑 ("md_account_network_outline", '\u{f0be6}'), // 󰯦 ("md_account_off", '\u{f0012}'), // ó°€’ ("md_account_off_outline", '\u{f0be7}'), // 󰯧 ("md_account_outline", '\u{f0013}'), // 󰀓 ("md_account_plus", '\u{f0014}'), // ó°€” ("md_account_plus_outline", '\u{f0801}'), // ó°  ("md_account_question", '\u{f0b59}'), // ó°­™ ("md_account_question_outline", '\u{f0b5a}'), // ó°­š ("md_account_reactivate", '\u{f152b}'), // 󱔫 ("md_account_reactivate_outline", '\u{f152c}'), // 󱔬 ("md_account_remove", '\u{f0015}'), // 󰀕 ("md_account_remove_outline", '\u{f0aed}'), // ó°«­ ("md_account_school", '\u{f1a20}'), // 󱨠 ("md_account_school_outline", '\u{f1a21}'), // 󱨡 ("md_account_search", '\u{f0016}'), // ó°€– ("md_account_search_outline", '\u{f0935}'), // 󰤵 ("md_account_settings", '\u{f0630}'), // ó°˜° ("md_account_settings_outline", '\u{f10c9}'), // 󱃉 ("md_account_star", '\u{f0017}'), // ó°€— ("md_account_star_outline", '\u{f0be8}'), // 󰯨 ("md_account_supervisor", '\u{f0a8b}'), // 󰪋 ("md_account_supervisor_circle", '\u{f0a8c}'), // 󰪌 ("md_account_supervisor_circle_outline", '\u{f14ec}'), // 󱓬 ("md_account_supervisor_outline", '\u{f112d}'), // 󱄭 ("md_account_switch", '\u{f0019}'), // ó°€™ ("md_account_switch_outline", '\u{f04cb}'), // ó°“‹ ("md_account_sync", '\u{f191b}'), // 󱤛 ("md_account_sync_outline", '\u{f191c}'), // 󱤜 ("md_account_tie", '\u{f0ce3}'), // ó°³£ ("md_account_tie_hat", '\u{f1898}'), // 󱢘 ("md_account_tie_hat_outline", '\u{f1899}'), // ó±¢™ ("md_account_tie_outline", '\u{f10ca}'), // 󱃊 ("md_account_tie_voice", '\u{f1308}'), // 󱌈 ("md_account_tie_voice_off", '\u{f130a}'), // 󱌊 ("md_account_tie_voice_off_outline", '\u{f130b}'), // 󱌋 ("md_account_tie_voice_outline", '\u{f1309}'), // 󱌉 ("md_account_tie_woman", '\u{f1a8c}'), // 󱪌 ("md_account_voice", '\u{f05cb}'), // ó°—‹ ("md_account_voice_off", '\u{f0ed4}'), // ó°»” ("md_account_wrench", '\u{f189a}'), // 󱢚 ("md_account_wrench_outline", '\u{f189b}'), // ó±¢› ("md_adjust", '\u{f001a}'), // 󰀚 ("md_advertisements", '\u{f192a}'), // 󱤪 ("md_advertisements_off", '\u{f192b}'), // 󱤫 ("md_air_conditioner", '\u{f001b}'), // ó°€› ("md_air_filter", '\u{f0d43}'), // 󰵃 ("md_air_horn", '\u{f0dac}'), // 󰶬 ("md_air_humidifier", '\u{f1099}'), // 󱂙 ("md_air_humidifier_off", '\u{f1466}'), // 󱑦 ("md_air_purifier", '\u{f0d44}'), // 󰵄 ("md_airbag", '\u{f0be9}'), // 󰯩 ("md_airballoon", '\u{f001c}'), // 󰀜 ("md_airballoon_outline", '\u{f100b}'), // 󱀋 ("md_airplane", '\u{f001d}'), // ó°€ ("md_airplane_alert", '\u{f187a}'), // 󱡺 ("md_airplane_check", '\u{f187b}'), // 󱡻 ("md_airplane_clock", '\u{f187c}'), // 󱡼 ("md_airplane_cog", '\u{f187d}'), // 󱡽 ("md_airplane_edit", '\u{f187e}'), // 󱡾 ("md_airplane_landing", '\u{f05d4}'), // ó°—” ("md_airplane_marker", '\u{f187f}'), // 󱡿 ("md_airplane_minus", '\u{f1880}'), // ó±¢€ ("md_airplane_off", '\u{f001e}'), // 󰀞 ("md_airplane_plus", '\u{f1881}'), // ó±¢ ("md_airplane_remove", '\u{f1882}'), // 󱢂 ("md_airplane_search", '\u{f1883}'), // 󱢃 ("md_airplane_settings", '\u{f1884}'), // 󱢄 ("md_airplane_takeoff", '\u{f05d5}'), // ó°—• ("md_airport", '\u{f084b}'), // ó°¡‹ ("md_alarm", '\u{f0020}'), // ó°€  ("md_alarm_bell", '\u{f078e}'), // 󰞎 ("md_alarm_check", '\u{f0021}'), // 󰀡 ("md_alarm_light", '\u{f078f}'), // ó°ž ("md_alarm_light_off", '\u{f171e}'), // 󱜞 ("md_alarm_light_off_outline", '\u{f171f}'), // 󱜟 ("md_alarm_light_outline", '\u{f0bea}'), // 󰯪 ("md_alarm_multiple", '\u{f0022}'), // ó°€¢ ("md_alarm_note", '\u{f0e71}'), // ó°¹± ("md_alarm_note_off", '\u{f0e72}'), // ó°¹² ("md_alarm_off", '\u{f0023}'), // ó°€£ ("md_alarm_panel", '\u{f15c4}'), // ó±—„ ("md_alarm_panel_outline", '\u{f15c5}'), // ó±—… ("md_alarm_plus", '\u{f0024}'), // 󰀤 ("md_alarm_snooze", '\u{f068e}'), // 󰚎 ("md_album", '\u{f0025}'), // ó°€¥ ("md_alert", '\u{f0026}'), // 󰀦 ("md_alert_box", '\u{f0027}'), // ó°€§ ("md_alert_box_outline", '\u{f0ce4}'), // 󰳤 ("md_alert_circle", '\u{f0028}'), // 󰀨 ("md_alert_circle_check", '\u{f11ed}'), // 󱇭 ("md_alert_circle_check_outline", '\u{f11ee}'), // 󱇮 ("md_alert_circle_outline", '\u{f05d6}'), // ó°—– ("md_alert_decagram", '\u{f06bd}'), // ó°š½ ("md_alert_decagram_outline", '\u{f0ce5}'), // ó°³¥ ("md_alert_minus", '\u{f14bb}'), // ó±’» ("md_alert_minus_outline", '\u{f14be}'), // ó±’¾ ("md_alert_octagon", '\u{f0029}'), // 󰀩 ("md_alert_octagon_outline", '\u{f0ce6}'), // 󰳦 ("md_alert_octagram", '\u{f0767}'), // ó°§ ("md_alert_octagram_outline", '\u{f0ce7}'), // ó°³§ ("md_alert_outline", '\u{f002a}'), // 󰀪 ("md_alert_plus", '\u{f14ba}'), // ó±’º ("md_alert_plus_outline", '\u{f14bd}'), // ó±’½ ("md_alert_remove", '\u{f14bc}'), // ó±’¼ ("md_alert_remove_outline", '\u{f14bf}'), // ó±’¿ ("md_alert_rhombus", '\u{f11ce}'), // 󱇎 ("md_alert_rhombus_outline", '\u{f11cf}'), // ó±‡ ("md_alien", '\u{f089a}'), // 󰢚 ("md_alien_outline", '\u{f10cb}'), // 󱃋 ("md_align_horizontal_center", '\u{f11c3}'), // 󱇃 ("md_align_horizontal_distribute", '\u{f1962}'), // ó±¥¢ ("md_align_horizontal_left", '\u{f11c2}'), // 󱇂 ("md_align_horizontal_right", '\u{f11c4}'), // 󱇄 ("md_align_vertical_bottom", '\u{f11c5}'), // 󱇅 ("md_align_vertical_center", '\u{f11c6}'), // 󱇆 ("md_align_vertical_distribute", '\u{f1963}'), // ó±¥£ ("md_align_vertical_top", '\u{f11c7}'), // 󱇇 ("md_all_inclusive", '\u{f06be}'), // ó°š¾ ("md_all_inclusive_box", '\u{f188d}'), // ó±¢ ("md_all_inclusive_box_outline", '\u{f188e}'), // 󱢎 ("md_allergy", '\u{f1258}'), // 󱉘 ("md_alpha", '\u{f002b}'), // 󰀫 ("md_alpha_a", '\u{f0aee}'), // ó°«® ("md_alpha_a_box", '\u{f0b08}'), // 󰬈 ("md_alpha_a_box_outline", '\u{f0beb}'), // 󰯫 ("md_alpha_a_circle", '\u{f0bec}'), // 󰯬 ("md_alpha_a_circle_outline", '\u{f0bed}'), // ó°¯­ ("md_alpha_b", '\u{f0aef}'), // 󰫯 ("md_alpha_b_box", '\u{f0b09}'), // 󰬉 ("md_alpha_b_box_outline", '\u{f0bee}'), // 󰯮 ("md_alpha_b_circle", '\u{f0bef}'), // 󰯯 ("md_alpha_b_circle_outline", '\u{f0bf0}'), // ó°¯° ("md_alpha_c", '\u{f0af0}'), // ó°«° ("md_alpha_c_box", '\u{f0b0a}'), // 󰬊 ("md_alpha_c_box_outline", '\u{f0bf1}'), // 󰯱 ("md_alpha_c_circle", '\u{f0bf2}'), // 󰯲 ("md_alpha_c_circle_outline", '\u{f0bf3}'), // 󰯳 ("md_alpha_d", '\u{f0af1}'), // ó°«± ("md_alpha_d_box", '\u{f0b0b}'), // 󰬋 ("md_alpha_d_box_outline", '\u{f0bf4}'), // ó°¯´ ("md_alpha_d_circle", '\u{f0bf5}'), // 󰯵 ("md_alpha_d_circle_outline", '\u{f0bf6}'), // 󰯶 ("md_alpha_e", '\u{f0af2}'), // ó°«² ("md_alpha_e_box", '\u{f0b0c}'), // 󰬌 ("md_alpha_e_box_outline", '\u{f0bf7}'), // ó°¯· ("md_alpha_e_circle", '\u{f0bf8}'), // 󰯸 ("md_alpha_e_circle_outline", '\u{f0bf9}'), // 󰯹 ("md_alpha_f", '\u{f0af3}'), // ó°«³ ("md_alpha_f_box", '\u{f0b0d}'), // ó°¬ ("md_alpha_f_box_outline", '\u{f0bfa}'), // 󰯺 ("md_alpha_f_circle", '\u{f0bfb}'), // 󰯻 ("md_alpha_f_circle_outline", '\u{f0bfc}'), // 󰯼 ("md_alpha_g", '\u{f0af4}'), // ó°«´ ("md_alpha_g_box", '\u{f0b0e}'), // 󰬎 ("md_alpha_g_box_outline", '\u{f0bfd}'), // 󰯽 ("md_alpha_g_circle", '\u{f0bfe}'), // 󰯾 ("md_alpha_g_circle_outline", '\u{f0bff}'), // 󰯿 ("md_alpha_h", '\u{f0af5}'), // ó°«µ ("md_alpha_h_box", '\u{f0b0f}'), // ó°¬ ("md_alpha_h_box_outline", '\u{f0c00}'), // ó°°€ ("md_alpha_h_circle", '\u{f0c01}'), // ó°° ("md_alpha_h_circle_outline", '\u{f0c02}'), // ó°°‚ ("md_alpha_i", '\u{f1088}'), // 󱂈 ("md_alpha_i", '\u{f1088}'), // 󱂈 ("md_alpha_i_box", '\u{f0b10}'), // ó°¬ ("md_alpha_i_box_outline", '\u{f0c03}'), // ó°°ƒ ("md_alpha_i_circle", '\u{f0c04}'), // ó°°„ ("md_alpha_i_circle_outline", '\u{f0c05}'), // ó°°… ("md_alpha_j", '\u{f0af7}'), // ó°«· ("md_alpha_j_box", '\u{f0b11}'), // 󰬑 ("md_alpha_j_box_outline", '\u{f0c06}'), // ó°°† ("md_alpha_j_circle", '\u{f0c07}'), // ó°°‡ ("md_alpha_j_circle_outline", '\u{f0c08}'), // ó°°ˆ ("md_alpha_k", '\u{f0af8}'), // 󰫸 ("md_alpha_k_box", '\u{f0b12}'), // ó°¬’ ("md_alpha_k_box_outline", '\u{f0c09}'), // ó°°‰ ("md_alpha_k_circle", '\u{f0c0a}'), // ó°°Š ("md_alpha_k_circle_outline", '\u{f0c0b}'), // ó°°‹ ("md_alpha_l", '\u{f13a6}'), // 󱎦 ("md_alpha_l", '\u{f13a6}'), // 󱎦 ("md_alpha_l_box", '\u{f0b13}'), // 󰬓 ("md_alpha_l_box_outline", '\u{f0c0c}'), // ó°°Œ ("md_alpha_l_circle", '\u{f0c0d}'), // ó°° ("md_alpha_l_circle_outline", '\u{f0c0e}'), // ó°°Ž ("md_alpha_m", '\u{f0afa}'), // 󰫺 ("md_alpha_m_box", '\u{f0b14}'), // 󰬔 ("md_alpha_m_box_outline", '\u{f0c0f}'), // ó°° ("md_alpha_m_circle", '\u{f0c10}'), // ó°° ("md_alpha_m_circle_outline", '\u{f0c11}'), // ó°°‘ ("md_alpha_n", '\u{f0afb}'), // ó°«» ("md_alpha_n_box", '\u{f0b15}'), // 󰬕 ("md_alpha_n_box_outline", '\u{f0c12}'), // ó°°’ ("md_alpha_n_circle", '\u{f0c13}'), // ó°°“ ("md_alpha_n_circle_outline", '\u{f0c14}'), // ó°°” ("md_alpha_o", '\u{f0b39}'), // 󰬹 ("md_alpha_o", '\u{f0b39}'), // 󰬹 ("md_alpha_o_box", '\u{f0b16}'), // ó°¬– ("md_alpha_o_box_outline", '\u{f0c15}'), // ó°°• ("md_alpha_o_circle", '\u{f0c9e}'), // 󰲞 ("md_alpha_o_circle", '\u{f0c9e}'), // 󰲞 ("md_alpha_o_circle_outline", '\u{f0c9f}'), // 󰲟 ("md_alpha_o_circle_outline", '\u{f0c9f}'), // 󰲟 ("md_alpha_p", '\u{f0afd}'), // ó°«½ ("md_alpha_p_box", '\u{f0b17}'), // ó°¬— ("md_alpha_p_box_outline", '\u{f0c18}'), // ó°°˜ ("md_alpha_p_circle", '\u{f0c19}'), // ó°°™ ("md_alpha_p_circle_outline", '\u{f0c1a}'), // ó°°š ("md_alpha_q", '\u{f0afe}'), // ó°«¾ ("md_alpha_q_box", '\u{f0b18}'), // 󰬘 ("md_alpha_q_box_outline", '\u{f0c1b}'), // ó°°› ("md_alpha_q_circle", '\u{f0c1c}'), // ó°°œ ("md_alpha_q_circle_outline", '\u{f0c1d}'), // ó°° ("md_alpha_r", '\u{f0aff}'), // ó°«¿ ("md_alpha_r_box", '\u{f0b19}'), // 󰬙 ("md_alpha_r_box_outline", '\u{f0c1e}'), // ó°°ž ("md_alpha_r_circle", '\u{f0c1f}'), // ó°°Ÿ ("md_alpha_r_circle_outline", '\u{f0c20}'), // ó°°  ("md_alpha_s", '\u{f0b00}'), // 󰬀 ("md_alpha_s_box", '\u{f0b1a}'), // 󰬚 ("md_alpha_s_box_outline", '\u{f0c21}'), // ó°°¡ ("md_alpha_s_circle", '\u{f0c22}'), // ó°°¢ ("md_alpha_s_circle_outline", '\u{f0c23}'), // ó°°£ ("md_alpha_t", '\u{f0b01}'), // ó°¬ ("md_alpha_t_box", '\u{f0b1b}'), // 󰬛 ("md_alpha_t_box_outline", '\u{f0c24}'), // ó°°¤ ("md_alpha_t_circle", '\u{f0c25}'), // ó°°¥ ("md_alpha_t_circle_outline", '\u{f0c26}'), // ó°°¦ ("md_alpha_u", '\u{f0b02}'), // 󰬂 ("md_alpha_u_box", '\u{f0b1c}'), // 󰬜 ("md_alpha_u_box_outline", '\u{f0c27}'), // ó°°§ ("md_alpha_u_circle", '\u{f0c28}'), // ó°°¨ ("md_alpha_u_circle_outline", '\u{f0c29}'), // ó°°© ("md_alpha_v", '\u{f108c}'), // 󱂌 ("md_alpha_v", '\u{f108c}'), // 󱂌 ("md_alpha_v_box", '\u{f0b1d}'), // ó°¬ ("md_alpha_v_box_outline", '\u{f0c2a}'), // ó°°ª ("md_alpha_v_circle", '\u{f0c2b}'), // ó°°« ("md_alpha_v_circle_outline", '\u{f0c2c}'), // ó°°¬ ("md_alpha_w", '\u{f0b04}'), // 󰬄 ("md_alpha_w_box", '\u{f0b1e}'), // 󰬞 ("md_alpha_w_box_outline", '\u{f0c2d}'), // ó°°­ ("md_alpha_w_circle", '\u{f0c2e}'), // ó°°® ("md_alpha_w_circle_outline", '\u{f0c2f}'), // ó°°¯ ("md_alpha_x", '\u{f1091}'), // 󱂑 ("md_alpha_x", '\u{f1091}'), // 󱂑 ("md_alpha_x_box", '\u{f0b1f}'), // 󰬟 ("md_alpha_x_box_outline", '\u{f0c30}'), // ó°°° ("md_alpha_x_circle", '\u{f0c31}'), // ó°°± ("md_alpha_x_circle_outline", '\u{f0c32}'), // ó°°² ("md_alpha_y", '\u{f0b06}'), // 󰬆 ("md_alpha_y_box", '\u{f0b20}'), // ó°¬  ("md_alpha_y_box_outline", '\u{f0c33}'), // ó°°³ ("md_alpha_y_circle", '\u{f0c34}'), // ó°°´ ("md_alpha_y_circle_outline", '\u{f0c35}'), // ó°°µ ("md_alpha_z", '\u{f0b07}'), // 󰬇 ("md_alpha_z_box", '\u{f0b21}'), // 󰬡 ("md_alpha_z_box_outline", '\u{f0c36}'), // ó°°¶ ("md_alpha_z_circle", '\u{f0c37}'), // ó°°· ("md_alpha_z_circle_outline", '\u{f0c38}'), // ó°°¸ ("md_alphabet_aurebesh", '\u{f132c}'), // 󱌬 ("md_alphabet_cyrillic", '\u{f132d}'), // 󱌭 ("md_alphabet_greek", '\u{f132e}'), // 󱌮 ("md_alphabet_latin", '\u{f132f}'), // 󱌯 ("md_alphabet_piqad", '\u{f1330}'), // 󱌰 ("md_alphabet_tengwar", '\u{f1337}'), // 󱌷 ("md_alphabetical", '\u{f002c}'), // 󰀬 ("md_alphabetical_off", '\u{f100c}'), // 󱀌 ("md_alphabetical_variant", '\u{f100d}'), // ó±€ ("md_alphabetical_variant_off", '\u{f100e}'), // 󱀎 ("md_altimeter", '\u{f05d7}'), // ó°—— ("md_ambulance", '\u{f002f}'), // 󰀯 ("md_ammunition", '\u{f0ce8}'), // 󰳨 ("md_ampersand", '\u{f0a8d}'), // ó°ª ("md_amplifier", '\u{f0030}'), // ó°€° ("md_amplifier_off", '\u{f11b5}'), // 󱆵 ("md_anchor", '\u{f0031}'), // ó°€± ("md_android", '\u{f0032}'), // ó°€² ("md_android_messages", '\u{f0d45}'), // ó°µ… ("md_android_studio", '\u{f0034}'), // ó°€´ ("md_angle_acute", '\u{f0937}'), // ó°¤· ("md_angle_obtuse", '\u{f0938}'), // 󰤸 ("md_angle_right", '\u{f0939}'), // 󰤹 ("md_angular", '\u{f06b2}'), // ó°š² ("md_angularjs", '\u{f06bf}'), // ó°š¿ ("md_animation", '\u{f05d8}'), // ó°—˜ ("md_animation_outline", '\u{f0a8f}'), // ó°ª ("md_animation_play", '\u{f093a}'), // 󰤺 ("md_animation_play_outline", '\u{f0a90}'), // ó°ª ("md_ansible", '\u{f109a}'), // 󱂚 ("md_antenna", '\u{f1119}'), // 󱄙 ("md_anvil", '\u{f089b}'), // ó°¢› ("md_apache_kafka", '\u{f100f}'), // ó±€ ("md_api", '\u{f109b}'), // 󱂛 ("md_api_off", '\u{f1257}'), // 󱉗 ("md_apple", '\u{f0035}'), // ó°€µ ("md_apple_finder", '\u{f0036}'), // ó°€¶ ("md_apple_icloud", '\u{f0038}'), // 󰀸 ("md_apple_ios", '\u{f0037}'), // ó°€· ("md_apple_keyboard_caps", '\u{f0632}'), // 󰘲 ("md_apple_keyboard_command", '\u{f0633}'), // 󰘳 ("md_apple_keyboard_control", '\u{f0634}'), // ó°˜´ ("md_apple_keyboard_option", '\u{f0635}'), // 󰘵 ("md_apple_keyboard_shift", '\u{f0636}'), // 󰘶 ("md_apple_safari", '\u{f0039}'), // ó°€¹ ("md_application", '\u{f08c6}'), // 󰣆 ("md_application_array", '\u{f10f5}'), // 󱃵 ("md_application_array_outline", '\u{f10f6}'), // 󱃶 ("md_application_braces", '\u{f10f7}'), // 󱃷 ("md_application_braces_outline", '\u{f10f8}'), // 󱃸 ("md_application_brackets", '\u{f0c8b}'), // 󰲋 ("md_application_brackets_outline", '\u{f0c8c}'), // 󰲌 ("md_application_cog", '\u{f0675}'), // ó°™µ ("md_application_cog_outline", '\u{f1577}'), // 󱕷 ("md_application_edit", '\u{f00ae}'), // ó°‚® ("md_application_edit_outline", '\u{f0619}'), // 󰘙 ("md_application_export", '\u{f0dad}'), // ó°¶­ ("md_application_import", '\u{f0dae}'), // ó°¶® ("md_application_outline", '\u{f0614}'), // 󰘔 ("md_application_parentheses", '\u{f10f9}'), // 󱃹 ("md_application_parentheses_outline", '\u{f10fa}'), // 󱃺 ("md_application_settings", '\u{f0b60}'), // ó°­  ("md_application_settings_outline", '\u{f1555}'), // 󱕕 ("md_application_variable", '\u{f10fb}'), // 󱃻 ("md_application_variable_outline", '\u{f10fc}'), // 󱃼 ("md_approximately_equal", '\u{f0f9e}'), // 󰾞 ("md_approximately_equal_box", '\u{f0f9f}'), // 󰾟 ("md_apps", '\u{f003b}'), // ó°€» ("md_apps_box", '\u{f0d46}'), // 󰵆 ("md_arch", '\u{f08c7}'), // 󰣇 ("md_archive", '\u{f003c}'), // ó°€¼ ("md_archive_alert", '\u{f14fd}'), // 󱓽 ("md_archive_alert_outline", '\u{f14fe}'), // 󱓾 ("md_archive_arrow_down", '\u{f1259}'), // 󱉙 ("md_archive_arrow_down_outline", '\u{f125a}'), // 󱉚 ("md_archive_arrow_up", '\u{f125b}'), // 󱉛 ("md_archive_arrow_up_outline", '\u{f125c}'), // 󱉜 ("md_archive_cancel", '\u{f174b}'), // ó±‹ ("md_archive_cancel_outline", '\u{f174c}'), // ó±Œ ("md_archive_check", '\u{f174d}'), // ó± ("md_archive_check_outline", '\u{f174e}'), // ó±Ž ("md_archive_clock", '\u{f174f}'), // ó± ("md_archive_clock_outline", '\u{f1750}'), // ó± ("md_archive_cog", '\u{f1751}'), // ó±‘ ("md_archive_cog_outline", '\u{f1752}'), // ó±’ ("md_archive_edit", '\u{f1753}'), // ó±“ ("md_archive_edit_outline", '\u{f1754}'), // ó±” ("md_archive_eye", '\u{f1755}'), // ó±• ("md_archive_eye_outline", '\u{f1756}'), // ó±– ("md_archive_lock", '\u{f1757}'), // ó±— ("md_archive_lock_open", '\u{f1758}'), // ó±˜ ("md_archive_lock_open_outline", '\u{f1759}'), // ó±™ ("md_archive_lock_outline", '\u{f175a}'), // ó±š ("md_archive_marker", '\u{f175b}'), // ó±› ("md_archive_marker_outline", '\u{f175c}'), // ó±œ ("md_archive_minus", '\u{f175d}'), // ó± ("md_archive_minus_outline", '\u{f175e}'), // ó±ž ("md_archive_music", '\u{f175f}'), // ó±Ÿ ("md_archive_music_outline", '\u{f1760}'), // ó±  ("md_archive_off", '\u{f1761}'), // ó±¡ ("md_archive_off_outline", '\u{f1762}'), // ó±¢ ("md_archive_outline", '\u{f120e}'), // 󱈎 ("md_archive_plus", '\u{f1763}'), // ó±£ ("md_archive_plus_outline", '\u{f1764}'), // ó±¤ ("md_archive_refresh", '\u{f1765}'), // ó±¥ ("md_archive_refresh_outline", '\u{f1766}'), // ó±¦ ("md_archive_remove", '\u{f1767}'), // ó±§ ("md_archive_remove_outline", '\u{f1768}'), // ó±¨ ("md_archive_search", '\u{f1769}'), // ó±© ("md_archive_search_outline", '\u{f176a}'), // ó±ª ("md_archive_settings", '\u{f176b}'), // ó±« ("md_archive_settings_outline", '\u{f176c}'), // ó±¬ ("md_archive_star", '\u{f176d}'), // ó±­ ("md_archive_star_outline", '\u{f176e}'), // ó±® ("md_archive_sync", '\u{f176f}'), // ó±¯ ("md_archive_sync_outline", '\u{f1770}'), // ó±° ("md_arm_flex", '\u{f0fd7}'), // ó°¿— ("md_arm_flex_outline", '\u{f0fd6}'), // ó°¿– ("md_arrange_bring_forward", '\u{f003d}'), // ó°€½ ("md_arrange_bring_to_front", '\u{f003e}'), // ó°€¾ ("md_arrange_send_backward", '\u{f003f}'), // 󰀿 ("md_arrange_send_to_back", '\u{f0040}'), // ó°€ ("md_arrow_all", '\u{f0041}'), // ó° ("md_arrow_bottom_left", '\u{f0042}'), // ó°‚ ("md_arrow_bottom_left_bold_box", '\u{f1964}'), // 󱥤 ("md_arrow_bottom_left_bold_box_outline", '\u{f1965}'), // ó±¥¥ ("md_arrow_bottom_left_bold_outline", '\u{f09b7}'), // ó°¦· ("md_arrow_bottom_left_thick", '\u{f09b8}'), // 󰦸 ("md_arrow_bottom_left_thin", '\u{f19b6}'), // 󱦶 ("md_arrow_bottom_left_thin_circle_outline", '\u{f1596}'), // ó±–– ("md_arrow_bottom_right", '\u{f0043}'), // ó°ƒ ("md_arrow_bottom_right_bold_box", '\u{f1966}'), // 󱥦 ("md_arrow_bottom_right_bold_box_outline", '\u{f1967}'), // ó±¥§ ("md_arrow_bottom_right_bold_outline", '\u{f09b9}'), // 󰦹 ("md_arrow_bottom_right_thick", '\u{f09ba}'), // 󰦺 ("md_arrow_bottom_right_thin", '\u{f19b7}'), // 󱦷 ("md_arrow_bottom_right_thin_circle_outline", '\u{f1595}'), // ó±–• ("md_arrow_collapse", '\u{f0615}'), // 󰘕 ("md_arrow_collapse_all", '\u{f0044}'), // ó°„ ("md_arrow_collapse_down", '\u{f0792}'), // ó°ž’ ("md_arrow_collapse_horizontal", '\u{f084c}'), // ó°¡Œ ("md_arrow_collapse_left", '\u{f0793}'), // ó°ž“ ("md_arrow_collapse_right", '\u{f0794}'), // ó°ž” ("md_arrow_collapse_up", '\u{f0795}'), // ó°ž• ("md_arrow_collapse_vertical", '\u{f084d}'), // ó°¡ ("md_arrow_decision", '\u{f09bb}'), // 󰦻 ("md_arrow_decision_auto", '\u{f09bc}'), // 󰦼 ("md_arrow_decision_auto_outline", '\u{f09bd}'), // 󰦽 ("md_arrow_decision_outline", '\u{f09be}'), // 󰦾 ("md_arrow_down", '\u{f0045}'), // ó°… ("md_arrow_down_bold", '\u{f072e}'), // 󰜮 ("md_arrow_down_bold_box", '\u{f072f}'), // 󰜯 ("md_arrow_down_bold_box_outline", '\u{f0730}'), // 󰜰 ("md_arrow_down_bold_circle", '\u{f0047}'), // ó°‡ ("md_arrow_down_bold_circle_outline", '\u{f0048}'), // ó°ˆ ("md_arrow_down_bold_hexagon_outline", '\u{f0049}'), // ó°‰ ("md_arrow_down_bold_outline", '\u{f09bf}'), // 󰦿 ("md_arrow_down_box", '\u{f06c0}'), // 󰛀 ("md_arrow_down_circle", '\u{f0cdb}'), // ó°³› ("md_arrow_down_circle_outline", '\u{f0cdc}'), // 󰳜 ("md_arrow_down_drop_circle", '\u{f004a}'), // ó°Š ("md_arrow_down_drop_circle_outline", '\u{f004b}'), // ó°‹ ("md_arrow_down_left", '\u{f17a1}'), // 󱞡 ("md_arrow_down_left_bold", '\u{f17a2}'), // 󱞢 ("md_arrow_down_right", '\u{f17a3}'), // 󱞣 ("md_arrow_down_right_bold", '\u{f17a4}'), // 󱞤 ("md_arrow_down_thick", '\u{f0046}'), // ó°† ("md_arrow_down_thin", '\u{f19b3}'), // 󱦳 ("md_arrow_down_thin_circle_outline", '\u{f1599}'), // ó±–™ ("md_arrow_expand", '\u{f0616}'), // ó°˜– ("md_arrow_expand_all", '\u{f004c}'), // ó°Œ ("md_arrow_expand_down", '\u{f0796}'), // ó°ž– ("md_arrow_expand_horizontal", '\u{f084e}'), // ó°¡Ž ("md_arrow_expand_left", '\u{f0797}'), // ó°ž— ("md_arrow_expand_right", '\u{f0798}'), // 󰞘 ("md_arrow_expand_up", '\u{f0799}'), // ó°ž™ ("md_arrow_expand_vertical", '\u{f084f}'), // ó°¡ ("md_arrow_horizontal_lock", '\u{f115b}'), // ó±…› ("md_arrow_left", '\u{f004d}'), // ó° ("md_arrow_left_bold", '\u{f0731}'), // 󰜱 ("md_arrow_left_bold_box", '\u{f0732}'), // 󰜲 ("md_arrow_left_bold_box_outline", '\u{f0733}'), // 󰜳 ("md_arrow_left_bold_circle", '\u{f004f}'), // ó° ("md_arrow_left_bold_circle_outline", '\u{f0050}'), // ó° ("md_arrow_left_bold_hexagon_outline", '\u{f0051}'), // ó°‘ ("md_arrow_left_bold_outline", '\u{f09c0}'), // ó°§€ ("md_arrow_left_bottom", '\u{f17a5}'), // 󱞥 ("md_arrow_left_bottom_bold", '\u{f17a6}'), // 󱞦 ("md_arrow_left_box", '\u{f06c1}'), // ó°› ("md_arrow_left_circle", '\u{f0cdd}'), // ó°³ ("md_arrow_left_circle_outline", '\u{f0cde}'), // 󰳞 ("md_arrow_left_drop_circle", '\u{f0052}'), // ó°’ ("md_arrow_left_drop_circle_outline", '\u{f0053}'), // ó°“ ("md_arrow_left_right", '\u{f0e73}'), // ó°¹³ ("md_arrow_left_right_bold", '\u{f0e74}'), // ó°¹´ ("md_arrow_left_right_bold_outline", '\u{f09c1}'), // ó°§ ("md_arrow_left_thick", '\u{f004e}'), // ó°Ž ("md_arrow_left_thin", '\u{f19b1}'), // 󱦱 ("md_arrow_left_thin_circle_outline", '\u{f159a}'), // ó±–š ("md_arrow_left_top", '\u{f17a7}'), // 󱞧 ("md_arrow_left_top_bold", '\u{f17a8}'), // 󱞨 ("md_arrow_projectile", '\u{f1840}'), // 󱡀 ("md_arrow_projectile_multiple", '\u{f183f}'), // ó± ¿ ("md_arrow_right", '\u{f0054}'), // ó°” ("md_arrow_right_bold", '\u{f0734}'), // 󰜴 ("md_arrow_right_bold_box", '\u{f0735}'), // 󰜵 ("md_arrow_right_bold_box_outline", '\u{f0736}'), // 󰜶 ("md_arrow_right_bold_circle", '\u{f0056}'), // ó°– ("md_arrow_right_bold_circle_outline", '\u{f0057}'), // ó°— ("md_arrow_right_bold_hexagon_outline", '\u{f0058}'), // ó°˜ ("md_arrow_right_bold_outline", '\u{f09c2}'), // ó°§‚ ("md_arrow_right_bottom", '\u{f17a9}'), // 󱞩 ("md_arrow_right_bottom_bold", '\u{f17aa}'), // 󱞪 ("md_arrow_right_box", '\u{f06c2}'), // ó°›‚ ("md_arrow_right_circle", '\u{f0cdf}'), // 󰳟 ("md_arrow_right_circle_outline", '\u{f0ce0}'), // ó°³  ("md_arrow_right_drop_circle", '\u{f0059}'), // ó°™ ("md_arrow_right_drop_circle_outline", '\u{f005a}'), // ó°š ("md_arrow_right_thick", '\u{f0055}'), // ó°• ("md_arrow_right_thin", '\u{f19b0}'), // 󱦰 ("md_arrow_right_thin_circle_outline", '\u{f1598}'), // ó±–˜ ("md_arrow_right_top", '\u{f17ab}'), // 󱞫 ("md_arrow_right_top_bold", '\u{f17ac}'), // 󱞬 ("md_arrow_split_horizontal", '\u{f093b}'), // 󰤻 ("md_arrow_split_vertical", '\u{f093c}'), // 󰤼 ("md_arrow_top_left", '\u{f005b}'), // ó°› ("md_arrow_top_left_bold_box", '\u{f1968}'), // 󱥨 ("md_arrow_top_left_bold_box_outline", '\u{f1969}'), // 󱥩 ("md_arrow_top_left_bold_outline", '\u{f09c3}'), // 󰧃 ("md_arrow_top_left_bottom_right", '\u{f0e75}'), // ó°¹µ ("md_arrow_top_left_bottom_right_bold", '\u{f0e76}'), // ó°¹¶ ("md_arrow_top_left_thick", '\u{f09c4}'), // ó°§„ ("md_arrow_top_left_thin", '\u{f19b5}'), // 󱦵 ("md_arrow_top_left_thin_circle_outline", '\u{f1593}'), // ó±–“ ("md_arrow_top_right", '\u{f005c}'), // ó°œ ("md_arrow_top_right_bold_box", '\u{f196a}'), // 󱥪 ("md_arrow_top_right_bold_box_outline", '\u{f196b}'), // 󱥫 ("md_arrow_top_right_bold_outline", '\u{f09c5}'), // ó°§… ("md_arrow_top_right_bottom_left", '\u{f0e77}'), // ó°¹· ("md_arrow_top_right_bottom_left_bold", '\u{f0e78}'), // 󰹸 ("md_arrow_top_right_thick", '\u{f09c6}'), // 󰧆 ("md_arrow_top_right_thin", '\u{f19b4}'), // 󱦴 ("md_arrow_top_right_thin_circle_outline", '\u{f1594}'), // ó±–” ("md_arrow_u_down_left", '\u{f17ad}'), // 󱞭 ("md_arrow_u_down_left_bold", '\u{f17ae}'), // 󱞮 ("md_arrow_u_down_right", '\u{f17af}'), // 󱞯 ("md_arrow_u_down_right_bold", '\u{f17b0}'), // 󱞰 ("md_arrow_u_left_bottom", '\u{f17b1}'), // 󱞱 ("md_arrow_u_left_bottom_bold", '\u{f17b2}'), // 󱞲 ("md_arrow_u_left_top", '\u{f17b3}'), // 󱞳 ("md_arrow_u_left_top_bold", '\u{f17b4}'), // 󱞴 ("md_arrow_u_right_bottom", '\u{f17b5}'), // 󱞵 ("md_arrow_u_right_bottom_bold", '\u{f17b6}'), // 󱞶 ("md_arrow_u_right_top", '\u{f17b7}'), // 󱞷 ("md_arrow_u_right_top_bold", '\u{f17b8}'), // 󱞸 ("md_arrow_u_up_left", '\u{f17b9}'), // 󱞹 ("md_arrow_u_up_left_bold", '\u{f17ba}'), // 󱞺 ("md_arrow_u_up_right", '\u{f17bb}'), // 󱞻 ("md_arrow_u_up_right_bold", '\u{f17bc}'), // 󱞼 ("md_arrow_up", '\u{f005d}'), // ó° ("md_arrow_up_bold", '\u{f0737}'), // 󰜷 ("md_arrow_up_bold_box", '\u{f0738}'), // 󰜸 ("md_arrow_up_bold_box_outline", '\u{f0739}'), // 󰜹 ("md_arrow_up_bold_circle", '\u{f005f}'), // ó°Ÿ ("md_arrow_up_bold_circle_outline", '\u{f0060}'), // ó°  ("md_arrow_up_bold_hexagon_outline", '\u{f0061}'), // ó°¡ ("md_arrow_up_bold_outline", '\u{f09c7}'), // 󰧇 ("md_arrow_up_box", '\u{f06c3}'), // 󰛃 ("md_arrow_up_circle", '\u{f0ce1}'), // 󰳡 ("md_arrow_up_circle_outline", '\u{f0ce2}'), // ó°³¢ ("md_arrow_up_down", '\u{f0e79}'), // ó°¹¹ ("md_arrow_up_down_bold", '\u{f0e7a}'), // 󰹺 ("md_arrow_up_down_bold_outline", '\u{f09c8}'), // 󰧈 ("md_arrow_up_drop_circle", '\u{f0062}'), // ó°¢ ("md_arrow_up_drop_circle_outline", '\u{f0063}'), // ó°£ ("md_arrow_up_left", '\u{f17bd}'), // 󱞽 ("md_arrow_up_left_bold", '\u{f17be}'), // 󱞾 ("md_arrow_up_right", '\u{f17bf}'), // 󱞿 ("md_arrow_up_right_bold", '\u{f17c0}'), // 󱟀 ("md_arrow_up_thick", '\u{f005e}'), // ó°ž ("md_arrow_up_thin", '\u{f19b2}'), // 󱦲 ("md_arrow_up_thin_circle_outline", '\u{f1597}'), // ó±–— ("md_arrow_vertical_lock", '\u{f115c}'), // ó±…œ ("md_artstation", '\u{f0b5b}'), // ó°­› ("md_aspect_ratio", '\u{f0a24}'), // 󰨤 ("md_assistant", '\u{f0064}'), // ó°¤ ("md_asterisk", '\u{f06c4}'), // ó°›„ ("md_asterisk_circle_outline", '\u{f1a27}'), // 󱨧 ("md_at", '\u{f0065}'), // ó°¥ ("md_atlassian", '\u{f0804}'), // ó° „ ("md_atm", '\u{f0d47}'), // 󰵇 ("md_atom", '\u{f0768}'), // ó°¨ ("md_atom_variant", '\u{f0e7b}'), // ó°¹» ("md_attachment", '\u{f0066}'), // ó°¦ ("md_attachment_check", '\u{f1ac1}'), // ó±« ("md_attachment_lock", '\u{f19c4}'), // ó±§„ ("md_attachment_minus", '\u{f1ac2}'), // 󱫂 ("md_attachment_off", '\u{f1ac3}'), // 󱫃 ("md_attachment_plus", '\u{f1ac4}'), // 󱫄 ("md_attachment_remove", '\u{f1ac5}'), // 󱫅 ("md_audio_input_rca", '\u{f186b}'), // 󱡫 ("md_audio_input_stereo_minijack", '\u{f186c}'), // 󱡬 ("md_audio_input_xlr", '\u{f186d}'), // 󱡭 ("md_audio_video", '\u{f093d}'), // 󰤽 ("md_audio_video_off", '\u{f11b6}'), // 󱆶 ("md_augmented_reality", '\u{f0850}'), // ó°¡ ("md_auto_download", '\u{f137e}'), // ó±¾ ("md_auto_fix", '\u{f0068}'), // ó°¨ ("md_auto_upload", '\u{f0069}'), // ó°© ("md_autorenew", '\u{f006a}'), // ó°ª ("md_autorenew_off", '\u{f19e7}'), // ó±§§ ("md_av_timer", '\u{f006b}'), // ó°« ("md_aws", '\u{f0e0f}'), // ó°¸ ("md_axe", '\u{f08c8}'), // 󰣈 ("md_axe_battle", '\u{f1842}'), // 󱡂 ("md_axis", '\u{f0d48}'), // 󰵈 ("md_axis_arrow", '\u{f0d49}'), // 󰵉 ("md_axis_arrow_info", '\u{f140e}'), // ó±Ž ("md_axis_arrow_lock", '\u{f0d4a}'), // 󰵊 ("md_axis_lock", '\u{f0d4b}'), // 󰵋 ("md_axis_x_arrow", '\u{f0d4c}'), // 󰵌 ("md_axis_x_arrow_lock", '\u{f0d4d}'), // ó°µ ("md_axis_x_rotate_clockwise", '\u{f0d4e}'), // 󰵎 ("md_axis_x_rotate_counterclockwise", '\u{f0d4f}'), // ó°µ ("md_axis_x_y_arrow_lock", '\u{f0d50}'), // ó°µ ("md_axis_y_arrow", '\u{f0d51}'), // 󰵑 ("md_axis_y_arrow_lock", '\u{f0d52}'), // ó°µ’ ("md_axis_y_rotate_clockwise", '\u{f0d53}'), // 󰵓 ("md_axis_y_rotate_counterclockwise", '\u{f0d54}'), // ó°µ” ("md_axis_z_arrow", '\u{f0d55}'), // 󰵕 ("md_axis_z_arrow_lock", '\u{f0d56}'), // ó°µ– ("md_axis_z_rotate_clockwise", '\u{f0d57}'), // ó°µ— ("md_axis_z_rotate_counterclockwise", '\u{f0d58}'), // 󰵘 ("md_babel", '\u{f0a25}'), // 󰨥 ("md_baby", '\u{f006c}'), // ó°¬ ("md_baby_bottle", '\u{f0f39}'), // ó°¼¹ ("md_baby_bottle_outline", '\u{f0f3a}'), // 󰼺 ("md_baby_buggy", '\u{f13e0}'), // ó±  ("md_baby_carriage", '\u{f068f}'), // ó°š ("md_baby_carriage_off", '\u{f0fa0}'), // ó°¾  ("md_baby_face", '\u{f0e7c}'), // ó°¹¼ ("md_baby_face_outline", '\u{f0e7d}'), // ó°¹½ ("md_backburger", '\u{f006d}'), // ó°­ ("md_backspace", '\u{f006e}'), // ó°® ("md_backspace_outline", '\u{f0b5c}'), // ó°­œ ("md_backspace_reverse", '\u{f0e7e}'), // ó°¹¾ ("md_backspace_reverse_outline", '\u{f0e7f}'), // 󰹿 ("md_backup_restore", '\u{f006f}'), // ó°¯ ("md_bacteria", '\u{f0ed5}'), // ó°»• ("md_bacteria_outline", '\u{f0ed6}'), // ó°»– ("md_badge_account", '\u{f0da7}'), // ó°¶§ ("md_badge_account_alert", '\u{f0da8}'), // 󰶨 ("md_badge_account_alert_outline", '\u{f0da9}'), // ó°¶© ("md_badge_account_horizontal", '\u{f0e0d}'), // ó°¸ ("md_badge_account_horizontal_outline", '\u{f0e0e}'), // 󰸎 ("md_badge_account_outline", '\u{f0daa}'), // 󰶪 ("md_badminton", '\u{f0851}'), // ó°¡‘ ("md_bag_carry_on", '\u{f0f3b}'), // ó°¼» ("md_bag_carry_on_check", '\u{f0d65}'), // ó°µ¥ ("md_bag_carry_on_off", '\u{f0f3c}'), // ó°¼¼ ("md_bag_checked", '\u{f0f3d}'), // ó°¼½ ("md_bag_personal", '\u{f0e10}'), // ó°¸ ("md_bag_personal_off", '\u{f0e11}'), // 󰸑 ("md_bag_personal_off_outline", '\u{f0e12}'), // ó°¸’ ("md_bag_personal_outline", '\u{f0e13}'), // 󰸓 ("md_bag_suitcase", '\u{f158b}'), // ó±–‹ ("md_bag_suitcase_off", '\u{f158d}'), // ó±– ("md_bag_suitcase_off_outline", '\u{f158e}'), // ó±–Ž ("md_bag_suitcase_outline", '\u{f158c}'), // ó±–Œ ("md_baguette", '\u{f0f3e}'), // ó°¼¾ ("md_balcony", '\u{f1817}'), // ó± — ("md_balloon", '\u{f0a26}'), // 󰨦 ("md_ballot", '\u{f09c9}'), // 󰧉 ("md_ballot_outline", '\u{f09ca}'), // ó°§Š ("md_ballot_recount", '\u{f0c39}'), // ó°°¹ ("md_ballot_recount_outline", '\u{f0c3a}'), // ó°°º ("md_bandage", '\u{f0daf}'), // 󰶯 ("md_bank", '\u{f0070}'), // ó°° ("md_bank_check", '\u{f1655}'), // 󱙕 ("md_bank_minus", '\u{f0db0}'), // ó°¶° ("md_bank_off", '\u{f1656}'), // ó±™– ("md_bank_off_outline", '\u{f1657}'), // ó±™— ("md_bank_outline", '\u{f0e80}'), // 󰺀 ("md_bank_plus", '\u{f0db1}'), // ó°¶± ("md_bank_remove", '\u{f0db2}'), // ó°¶² ("md_bank_transfer", '\u{f0a27}'), // 󰨧 ("md_bank_transfer_in", '\u{f0a28}'), // 󰨨 ("md_bank_transfer_out", '\u{f0a29}'), // 󰨩 ("md_barcode", '\u{f0071}'), // ó°± ("md_barcode_off", '\u{f1236}'), // 󱈶 ("md_barcode_scan", '\u{f0072}'), // ó°² ("md_barley", '\u{f0073}'), // ó°³ ("md_barley_off", '\u{f0b5d}'), // ó°­ ("md_barn", '\u{f0b5e}'), // ó°­ž ("md_barrel", '\u{f0074}'), // ó°´ ("md_barrel_outline", '\u{f1a28}'), // 󱨨 ("md_baseball", '\u{f0852}'), // ó°¡’ ("md_baseball_bat", '\u{f0853}'), // ó°¡“ ("md_baseball_diamond", '\u{f15ec}'), // ó±—¬ ("md_baseball_diamond_outline", '\u{f15ed}'), // ó±—­ ("md_bash", '\u{f1183}'), // 󱆃 ("md_basket", '\u{f0076}'), // ó°¶ ("md_basket_check", '\u{f18e5}'), // ó±£¥ ("md_basket_check_outline", '\u{f18e6}'), // 󱣦 ("md_basket_fill", '\u{f0077}'), // ó°· ("md_basket_minus", '\u{f1523}'), // 󱔣 ("md_basket_minus_outline", '\u{f1524}'), // 󱔤 ("md_basket_off", '\u{f1525}'), // 󱔥 ("md_basket_off_outline", '\u{f1526}'), // 󱔦 ("md_basket_outline", '\u{f1181}'), // ó±† ("md_basket_plus", '\u{f1527}'), // ó±”§ ("md_basket_plus_outline", '\u{f1528}'), // 󱔨 ("md_basket_remove", '\u{f1529}'), // 󱔩 ("md_basket_remove_outline", '\u{f152a}'), // 󱔪 ("md_basket_unfill", '\u{f0078}'), // ó°¸ ("md_basketball", '\u{f0806}'), // ó° † ("md_basketball_hoop", '\u{f0c3b}'), // ó°°» ("md_basketball_hoop_outline", '\u{f0c3c}'), // ó°°¼ ("md_bat", '\u{f0b5f}'), // ó°­Ÿ ("md_bathtub", '\u{f1818}'), // ó± ˜ ("md_bathtub_outline", '\u{f1819}'), // ó± ™ ("md_battery", '\u{f0079}'), // ó°¹ ("md_battery_10", '\u{f007a}'), // ó°º ("md_battery_10_bluetooth", '\u{f093e}'), // 󰤾 ("md_battery_20", '\u{f007b}'), // ó°» ("md_battery_20_bluetooth", '\u{f093f}'), // 󰤿 ("md_battery_30", '\u{f007c}'), // ó°¼ ("md_battery_30_bluetooth", '\u{f0940}'), // ó°¥€ ("md_battery_40", '\u{f007d}'), // ó°½ ("md_battery_40_bluetooth", '\u{f0941}'), // ó°¥ ("md_battery_50", '\u{f007e}'), // ó°¾ ("md_battery_50_bluetooth", '\u{f0942}'), // 󰥂 ("md_battery_60", '\u{f007f}'), // ó°¿ ("md_battery_60_bluetooth", '\u{f0943}'), // 󰥃 ("md_battery_70", '\u{f0080}'), // ó°‚€ ("md_battery_70_bluetooth", '\u{f0944}'), // 󰥄 ("md_battery_80", '\u{f0081}'), // ó°‚ ("md_battery_80_bluetooth", '\u{f0945}'), // ó°¥… ("md_battery_90", '\u{f0082}'), // ó°‚‚ ("md_battery_90_bluetooth", '\u{f0946}'), // 󰥆 ("md_battery_alert", '\u{f0083}'), // 󰂃 ("md_battery_alert_bluetooth", '\u{f0947}'), // 󰥇 ("md_battery_alert_variant", '\u{f10cc}'), // 󱃌 ("md_battery_alert_variant_outline", '\u{f10cd}'), // ó±ƒ ("md_battery_arrow_down", '\u{f17de}'), // 󱟞 ("md_battery_arrow_down_outline", '\u{f17df}'), // 󱟟 ("md_battery_arrow_up", '\u{f17e0}'), // 󱟠 ("md_battery_arrow_up_outline", '\u{f17e1}'), // 󱟡 ("md_battery_bluetooth", '\u{f0948}'), // 󰥈 ("md_battery_bluetooth_variant", '\u{f0949}'), // 󰥉 ("md_battery_charging", '\u{f0084}'), // ó°‚„ ("md_battery_charging_10", '\u{f089c}'), // 󰢜 ("md_battery_charging_20", '\u{f0086}'), // 󰂆 ("md_battery_charging_30", '\u{f0087}'), // 󰂇 ("md_battery_charging_40", '\u{f0088}'), // 󰂈 ("md_battery_charging_50", '\u{f089d}'), // ó°¢ ("md_battery_charging_60", '\u{f0089}'), // 󰂉 ("md_battery_charging_70", '\u{f089e}'), // 󰢞 ("md_battery_charging_80", '\u{f008a}'), // ó°‚Š ("md_battery_charging_90", '\u{f008b}'), // ó°‚‹ ("md_battery_charging_100", '\u{f0085}'), // ó°‚… ("md_battery_charging_high", '\u{f12a6}'), // 󱊦 ("md_battery_charging_low", '\u{f12a4}'), // 󱊤 ("md_battery_charging_medium", '\u{f12a5}'), // 󱊥 ("md_battery_charging_outline", '\u{f089f}'), // 󰢟 ("md_battery_charging_wireless", '\u{f0807}'), // ó° ‡ ("md_battery_charging_wireless_10", '\u{f0808}'), // ó° ˆ ("md_battery_charging_wireless_20", '\u{f0809}'), // ó° ‰ ("md_battery_charging_wireless_30", '\u{f080a}'), // ó° Š ("md_battery_charging_wireless_40", '\u{f080b}'), // ó° ‹ ("md_battery_charging_wireless_50", '\u{f080c}'), // ó° Œ ("md_battery_charging_wireless_60", '\u{f080d}'), // ó°  ("md_battery_charging_wireless_70", '\u{f080e}'), // ó° Ž ("md_battery_charging_wireless_80", '\u{f080f}'), // ó°  ("md_battery_charging_wireless_90", '\u{f0810}'), // ó°  ("md_battery_charging_wireless_alert", '\u{f0811}'), // ó° ‘ ("md_battery_charging_wireless_outline", '\u{f0812}'), // ó° ’ ("md_battery_check", '\u{f17e2}'), // 󱟢 ("md_battery_check_outline", '\u{f17e3}'), // 󱟣 ("md_battery_clock", '\u{f19e5}'), // ó±§¥ ("md_battery_clock_outline", '\u{f19e6}'), // 󱧦 ("md_battery_heart", '\u{f120f}'), // ó±ˆ ("md_battery_heart_outline", '\u{f1210}'), // ó±ˆ ("md_battery_heart_variant", '\u{f1211}'), // 󱈑 ("md_battery_high", '\u{f12a3}'), // 󱊣 ("md_battery_lock", '\u{f179c}'), // 󱞜 ("md_battery_lock_open", '\u{f179d}'), // ó±ž ("md_battery_low", '\u{f12a1}'), // 󱊡 ("md_battery_medium", '\u{f12a2}'), // 󱊢 ("md_battery_minus", '\u{f17e4}'), // 󱟤 ("md_battery_minus_outline", '\u{f17e5}'), // 󱟥 ("md_battery_minus_variant", '\u{f008c}'), // ó°‚Œ ("md_battery_negative", '\u{f008d}'), // ó°‚ ("md_battery_off", '\u{f125d}'), // ó±‰ ("md_battery_off_outline", '\u{f125e}'), // 󱉞 ("md_battery_outline", '\u{f008e}'), // ó°‚Ž ("md_battery_plus", '\u{f17e6}'), // 󱟦 ("md_battery_plus_outline", '\u{f17e7}'), // 󱟧 ("md_battery_plus_variant", '\u{f008f}'), // ó°‚ ("md_battery_positive", '\u{f0090}'), // ó°‚ ("md_battery_remove", '\u{f17e8}'), // 󱟨 ("md_battery_remove_outline", '\u{f17e9}'), // 󱟩 ("md_battery_sync", '\u{f1834}'), // ó± ´ ("md_battery_sync_outline", '\u{f1835}'), // ó± µ ("md_battery_unknown", '\u{f0091}'), // ó°‚‘ ("md_battery_unknown_bluetooth", '\u{f094a}'), // 󰥊 ("md_beach", '\u{f0092}'), // ó°‚’ ("md_beaker", '\u{f0cea}'), // 󰳪 ("md_beaker_alert", '\u{f1229}'), // 󱈩 ("md_beaker_alert_outline", '\u{f122a}'), // 󱈪 ("md_beaker_check", '\u{f122b}'), // 󱈫 ("md_beaker_check_outline", '\u{f122c}'), // 󱈬 ("md_beaker_minus", '\u{f122d}'), // 󱈭 ("md_beaker_minus_outline", '\u{f122e}'), // 󱈮 ("md_beaker_outline", '\u{f0690}'), // ó°š ("md_beaker_plus", '\u{f122f}'), // 󱈯 ("md_beaker_plus_outline", '\u{f1230}'), // 󱈰 ("md_beaker_question", '\u{f1231}'), // 󱈱 ("md_beaker_question_outline", '\u{f1232}'), // 󱈲 ("md_beaker_remove", '\u{f1233}'), // 󱈳 ("md_beaker_remove_outline", '\u{f1234}'), // 󱈴 ("md_bed", '\u{f02e3}'), // ó°‹£ ("md_bed_double", '\u{f0fd4}'), // ó°¿” ("md_bed_double_outline", '\u{f0fd3}'), // ó°¿“ ("md_bed_empty", '\u{f08a0}'), // ó°¢  ("md_bed_king", '\u{f0fd2}'), // ó°¿’ ("md_bed_king_outline", '\u{f0fd1}'), // ó°¿‘ ("md_bed_outline", '\u{f0099}'), // ó°‚™ ("md_bed_queen", '\u{f0fd0}'), // ó°¿ ("md_bed_queen_outline", '\u{f0fdb}'), // ó°¿› ("md_bed_single", '\u{f106d}'), // ó±­ ("md_bed_single_outline", '\u{f106e}'), // ó±® ("md_bee", '\u{f0fa1}'), // 󰾡 ("md_bee_flower", '\u{f0fa2}'), // ó°¾¢ ("md_beehive_off_outline", '\u{f13ed}'), // ó±­ ("md_beehive_outline", '\u{f10ce}'), // 󱃎 ("md_beekeeper", '\u{f14e2}'), // 󱓢 ("md_beer", '\u{f0098}'), // 󰂘 ("md_beer_outline", '\u{f130c}'), // 󱌌 ("md_bell", '\u{f009a}'), // ó°‚š ("md_bell_alert", '\u{f0d59}'), // ó°µ™ ("md_bell_alert_outline", '\u{f0e81}'), // ó°º ("md_bell_badge", '\u{f116b}'), // ó±…« ("md_bell_badge_outline", '\u{f0178}'), // ó°…¸ ("md_bell_cancel", '\u{f13e7}'), // ó±§ ("md_bell_cancel_outline", '\u{f13e8}'), // ó±¨ ("md_bell_check", '\u{f11e5}'), // 󱇥 ("md_bell_check_outline", '\u{f11e6}'), // 󱇦 ("md_bell_circle", '\u{f0d5a}'), // 󰵚 ("md_bell_circle_outline", '\u{f0d5b}'), // ó°µ› ("md_bell_cog", '\u{f1a29}'), // 󱨩 ("md_bell_cog_outline", '\u{f1a2a}'), // 󱨪 ("md_bell_minus", '\u{f13e9}'), // ó±© ("md_bell_minus_outline", '\u{f13ea}'), // ó±ª ("md_bell_off", '\u{f009b}'), // ó°‚› ("md_bell_off_outline", '\u{f0a91}'), // 󰪑 ("md_bell_outline", '\u{f009c}'), // ó°‚œ ("md_bell_plus", '\u{f009d}'), // ó°‚ ("md_bell_plus_outline", '\u{f0a92}'), // ó°ª’ ("md_bell_remove", '\u{f13eb}'), // ó±« ("md_bell_remove_outline", '\u{f13ec}'), // ó±¬ ("md_bell_ring", '\u{f009e}'), // ó°‚ž ("md_bell_ring_outline", '\u{f009f}'), // ó°‚Ÿ ("md_bell_sleep", '\u{f00a0}'), // ó°‚  ("md_bell_sleep_outline", '\u{f0a93}'), // 󰪓 ("md_beta", '\u{f00a1}'), // ó°‚¡ ("md_betamax", '\u{f09cb}'), // ó°§‹ ("md_biathlon", '\u{f0e14}'), // 󰸔 ("md_bicycle", '\u{f109c}'), // 󱂜 ("md_bicycle_basket", '\u{f1235}'), // 󱈵 ("md_bicycle_cargo", '\u{f189c}'), // 󱢜 ("md_bicycle_electric", '\u{f15b4}'), // ó±–´ ("md_bicycle_penny_farthing", '\u{f15e9}'), // ó±—© ("md_bike", '\u{f00a3}'), // ó°‚£ ("md_bike_fast", '\u{f111f}'), // 󱄟 ("md_billboard", '\u{f1010}'), // ó±€ ("md_billiards", '\u{f0b61}'), // ó°­¡ ("md_billiards_rack", '\u{f0b62}'), // ó°­¢ ("md_binoculars", '\u{f00a5}'), // ó°‚¥ ("md_bio", '\u{f00a6}'), // 󰂦 ("md_biohazard", '\u{f00a7}'), // ó°‚§ ("md_bird", '\u{f15c6}'), // ó±—† ("md_bitbucket", '\u{f00a8}'), // 󰂨 ("md_bitcoin", '\u{f0813}'), // ó° “ ("md_black_mesa", '\u{f00a9}'), // ó°‚© ("md_blender", '\u{f0ceb}'), // 󰳫 ("md_blender_outline", '\u{f181a}'), // ó± š ("md_blender_software", '\u{f00ab}'), // ó°‚« ("md_blinds", '\u{f00ac}'), // 󰂬 ("md_blinds_horizontal", '\u{f1a2b}'), // 󱨫 ("md_blinds_horizontal_closed", '\u{f1a2c}'), // 󱨬 ("md_blinds_open", '\u{f1011}'), // 󱀑 ("md_blinds_vertical", '\u{f1a2d}'), // 󱨭 ("md_blinds_vertical_closed", '\u{f1a2e}'), // 󱨮 ("md_block_helper", '\u{f00ad}'), // ó°‚­ ("md_blood_bag", '\u{f0cec}'), // 󰳬 ("md_bluetooth", '\u{f00af}'), // 󰂯 ("md_bluetooth_audio", '\u{f00b0}'), // ó°‚° ("md_bluetooth_connect", '\u{f00b1}'), // ó°‚± ("md_bluetooth_off", '\u{f00b2}'), // ó°‚² ("md_bluetooth_settings", '\u{f00b3}'), // ó°‚³ ("md_bluetooth_transfer", '\u{f00b4}'), // ó°‚´ ("md_blur", '\u{f00b5}'), // ó°‚µ ("md_blur_linear", '\u{f00b6}'), // ó°‚¶ ("md_blur_off", '\u{f00b7}'), // ó°‚· ("md_blur_radial", '\u{f00b8}'), // 󰂸 ("md_bolt", '\u{f0db3}'), // ó°¶³ ("md_bomb", '\u{f0691}'), // ó°š‘ ("md_bomb_off", '\u{f06c5}'), // ó°›… ("md_bone", '\u{f00b9}'), // ó°‚¹ ("md_bone_off", '\u{f19e0}'), // ó±§  ("md_book", '\u{f00ba}'), // 󰂺 ("md_book_account", '\u{f13ad}'), // 󱎭 ("md_book_account_outline", '\u{f13ae}'), // 󱎮 ("md_book_alert", '\u{f167c}'), // ó±™¼ ("md_book_alert_outline", '\u{f167d}'), // ó±™½ ("md_book_alphabet", '\u{f061d}'), // ó°˜ ("md_book_arrow_down", '\u{f167e}'), // ó±™¾ ("md_book_arrow_down_outline", '\u{f167f}'), // 󱙿 ("md_book_arrow_left", '\u{f1680}'), // 󱚀 ("md_book_arrow_left_outline", '\u{f1681}'), // ó±š ("md_book_arrow_right", '\u{f1682}'), // 󱚂 ("md_book_arrow_right_outline", '\u{f1683}'), // 󱚃 ("md_book_arrow_up", '\u{f1684}'), // 󱚄 ("md_book_arrow_up_outline", '\u{f1685}'), // 󱚅 ("md_book_cancel", '\u{f1686}'), // 󱚆 ("md_book_cancel_outline", '\u{f1687}'), // 󱚇 ("md_book_check", '\u{f14f3}'), // 󱓳 ("md_book_check_outline", '\u{f14f4}'), // 󱓴 ("md_book_clock", '\u{f1688}'), // 󱚈 ("md_book_clock_outline", '\u{f1689}'), // 󱚉 ("md_book_cog", '\u{f168a}'), // 󱚊 ("md_book_cog_outline", '\u{f168b}'), // 󱚋 ("md_book_cross", '\u{f00a2}'), // ó°‚¢ ("md_book_edit", '\u{f168c}'), // 󱚌 ("md_book_edit_outline", '\u{f168d}'), // ó±š ("md_book_education", '\u{f16c9}'), // 󱛉 ("md_book_education_outline", '\u{f16ca}'), // 󱛊 ("md_book_heart", '\u{f1a1d}'), // ó±¨ ("md_book_heart_outline", '\u{f1a1e}'), // 󱨞 ("md_book_information_variant", '\u{f106f}'), // ó±¯ ("md_book_lock", '\u{f079a}'), // ó°žš ("md_book_lock_open", '\u{f079b}'), // ó°ž› ("md_book_lock_open_outline", '\u{f168e}'), // 󱚎 ("md_book_lock_outline", '\u{f168f}'), // ó±š ("md_book_marker", '\u{f1690}'), // ó±š ("md_book_marker_outline", '\u{f1691}'), // 󱚑 ("md_book_minus", '\u{f05d9}'), // ó°—™ ("md_book_minus_multiple", '\u{f0a94}'), // 󰪔 ("md_book_minus_multiple_outline", '\u{f090b}'), // 󰤋 ("md_book_minus_outline", '\u{f1692}'), // 󱚒 ("md_book_multiple", '\u{f00bb}'), // ó°‚» ("md_book_multiple_outline", '\u{f0436}'), // ó°¶ ("md_book_music", '\u{f0067}'), // ó°§ ("md_book_music_outline", '\u{f1693}'), // 󱚓 ("md_book_off", '\u{f1694}'), // 󱚔 ("md_book_off_outline", '\u{f1695}'), // 󱚕 ("md_book_open", '\u{f00bd}'), // ó°‚½ ("md_book_open_blank_variant", '\u{f00be}'), // ó°‚¾ ("md_book_open_outline", '\u{f0b63}'), // ó°­£ ("md_book_open_page_variant", '\u{f05da}'), // ó°—š ("md_book_open_page_variant_outline", '\u{f15d6}'), // ó±—– ("md_book_open_variant", '\u{f14f7}'), // 󱓷 ("md_book_outline", '\u{f0b64}'), // ó°­¤ ("md_book_play", '\u{f0e82}'), // 󰺂 ("md_book_play_outline", '\u{f0e83}'), // 󰺃 ("md_book_plus", '\u{f05db}'), // ó°—› ("md_book_plus_multiple", '\u{f0a95}'), // 󰪕 ("md_book_plus_multiple_outline", '\u{f0ade}'), // ó°«ž ("md_book_plus_outline", '\u{f1696}'), // 󱚖 ("md_book_refresh", '\u{f1697}'), // 󱚗 ("md_book_refresh_outline", '\u{f1698}'), // 󱚘 ("md_book_remove", '\u{f0a97}'), // ó°ª— ("md_book_remove_multiple", '\u{f0a96}'), // ó°ª– ("md_book_remove_multiple_outline", '\u{f04ca}'), // ó°“Š ("md_book_remove_outline", '\u{f1699}'), // 󱚙 ("md_book_search", '\u{f0e84}'), // 󰺄 ("md_book_search_outline", '\u{f0e85}'), // ó°º… ("md_book_settings", '\u{f169a}'), // 󱚚 ("md_book_settings_outline", '\u{f169b}'), // 󱚛 ("md_book_sync", '\u{f169c}'), // 󱚜 ("md_book_sync_outline", '\u{f16c8}'), // 󱛈 ("md_book_variant", '\u{f00bf}'), // ó°‚¿ ("md_book_variant_multiple", '\u{f00bc}'), // ó°‚¼ ("md_bookmark", '\u{f00c0}'), // 󰃀 ("md_bookmark_box_multiple", '\u{f196c}'), // 󱥬 ("md_bookmark_box_multiple_outline", '\u{f196d}'), // ó±¥­ ("md_bookmark_check", '\u{f00c1}'), // ó°ƒ ("md_bookmark_check_outline", '\u{f137b}'), // ó±» ("md_bookmark_minus", '\u{f09cc}'), // ó°§Œ ("md_bookmark_minus_outline", '\u{f09cd}'), // ó°§ ("md_bookmark_multiple", '\u{f0e15}'), // 󰸕 ("md_bookmark_multiple_outline", '\u{f0e16}'), // ó°¸– ("md_bookmark_music", '\u{f00c2}'), // 󰃂 ("md_bookmark_music_outline", '\u{f1379}'), // ó±¹ ("md_bookmark_off", '\u{f09ce}'), // ó°§Ž ("md_bookmark_off_outline", '\u{f09cf}'), // ó°§ ("md_bookmark_outline", '\u{f00c3}'), // 󰃃 ("md_bookmark_plus", '\u{f00c5}'), // ó°ƒ… ("md_bookmark_plus_outline", '\u{f00c4}'), // 󰃄 ("md_bookmark_remove", '\u{f00c6}'), // 󰃆 ("md_bookmark_remove_outline", '\u{f137a}'), // ó±º ("md_bookshelf", '\u{f125f}'), // 󱉟 ("md_boom_gate", '\u{f0e86}'), // 󰺆 ("md_boom_gate_alert", '\u{f0e87}'), // 󰺇 ("md_boom_gate_alert_outline", '\u{f0e88}'), // 󰺈 ("md_boom_gate_arrow_down", '\u{f0e89}'), // 󰺉 ("md_boom_gate_arrow_down_outline", '\u{f0e8a}'), // 󰺊 ("md_boom_gate_arrow_up", '\u{f0e8c}'), // 󰺌 ("md_boom_gate_arrow_up_outline", '\u{f0e8d}'), // ó°º ("md_boom_gate_outline", '\u{f0e8b}'), // 󰺋 ("md_boom_gate_up", '\u{f17f9}'), // 󱟹 ("md_boom_gate_up_outline", '\u{f17fa}'), // 󱟺 ("md_boombox", '\u{f05dc}'), // ó°—œ ("md_boomerang", '\u{f10cf}'), // ó±ƒ ("md_bootstrap", '\u{f06c6}'), // 󰛆 ("md_border_all", '\u{f00c7}'), // 󰃇 ("md_border_all_variant", '\u{f08a1}'), // 󰢡 ("md_border_bottom", '\u{f00c8}'), // 󰃈 ("md_border_bottom_variant", '\u{f08a2}'), // ó°¢¢ ("md_border_color", '\u{f00c9}'), // 󰃉 ("md_border_horizontal", '\u{f00ca}'), // 󰃊 ("md_border_inside", '\u{f00cb}'), // 󰃋 ("md_border_left", '\u{f00cc}'), // 󰃌 ("md_border_left_variant", '\u{f08a3}'), // ó°¢£ ("md_border_none", '\u{f00cd}'), // ó°ƒ ("md_border_none_variant", '\u{f08a4}'), // 󰢤 ("md_border_outside", '\u{f00ce}'), // 󰃎 ("md_border_right", '\u{f00cf}'), // ó°ƒ ("md_border_right_variant", '\u{f08a5}'), // ó°¢¥ ("md_border_style", '\u{f00d0}'), // ó°ƒ ("md_border_top", '\u{f00d1}'), // 󰃑 ("md_border_top_variant", '\u{f08a6}'), // 󰢦 ("md_border_vertical", '\u{f00d2}'), // ó°ƒ’ ("md_bottle_soda", '\u{f1070}'), // ó±° ("md_bottle_soda_classic", '\u{f1071}'), // ó±± ("md_bottle_soda_classic_outline", '\u{f1363}'), // ó±£ ("md_bottle_soda_outline", '\u{f1072}'), // ó±² ("md_bottle_tonic", '\u{f112e}'), // 󱄮 ("md_bottle_tonic_outline", '\u{f112f}'), // 󱄯 ("md_bottle_tonic_plus", '\u{f1130}'), // 󱄰 ("md_bottle_tonic_plus_outline", '\u{f1131}'), // 󱄱 ("md_bottle_tonic_skull", '\u{f1132}'), // 󱄲 ("md_bottle_tonic_skull_outline", '\u{f1133}'), // 󱄳 ("md_bottle_wine", '\u{f0854}'), // ó°¡” ("md_bottle_wine_outline", '\u{f1310}'), // ó±Œ ("md_bow_arrow", '\u{f1841}'), // ó±¡ ("md_bow_tie", '\u{f0678}'), // 󰙸 ("md_bowl", '\u{f028e}'), // ó°ŠŽ ("md_bowl_mix", '\u{f0617}'), // ó°˜— ("md_bowl_mix_outline", '\u{f02e4}'), // 󰋤 ("md_bowl_outline", '\u{f02a9}'), // ó°Š© ("md_bowling", '\u{f00d3}'), // 󰃓 ("md_box", '\u{f00d4}'), // 󰃔 ("md_box_cutter", '\u{f00d5}'), // 󰃕 ("md_box_cutter_off", '\u{f0b4a}'), // ó°­Š ("md_box_shadow", '\u{f0637}'), // ó°˜· ("md_boxing_glove", '\u{f0b65}'), // ó°­¥ ("md_braille", '\u{f09d0}'), // ó°§ ("md_brain", '\u{f09d1}'), // ó°§‘ ("md_bread_slice", '\u{f0cee}'), // ó°³® ("md_bread_slice_outline", '\u{f0cef}'), // 󰳯 ("md_bridge", '\u{f0618}'), // 󰘘 ("md_briefcase", '\u{f00d6}'), // ó°ƒ– ("md_briefcase_account", '\u{f0cf0}'), // ó°³° ("md_briefcase_account_outline", '\u{f0cf1}'), // ó°³± ("md_briefcase_arrow_left_right", '\u{f1a8d}'), // ó±ª ("md_briefcase_arrow_left_right_outline", '\u{f1a8e}'), // 󱪎 ("md_briefcase_arrow_up_down", '\u{f1a8f}'), // ó±ª ("md_briefcase_arrow_up_down_outline", '\u{f1a90}'), // ó±ª ("md_briefcase_check", '\u{f00d7}'), // ó°ƒ— ("md_briefcase_check_outline", '\u{f131e}'), // 󱌞 ("md_briefcase_clock", '\u{f10d0}'), // ó±ƒ ("md_briefcase_clock_outline", '\u{f10d1}'), // 󱃑 ("md_briefcase_download", '\u{f00d8}'), // 󰃘 ("md_briefcase_download_outline", '\u{f0c3d}'), // ó°°½ ("md_briefcase_edit", '\u{f0a98}'), // 󰪘 ("md_briefcase_edit_outline", '\u{f0c3e}'), // ó°°¾ ("md_briefcase_eye", '\u{f17d9}'), // 󱟙 ("md_briefcase_eye_outline", '\u{f17da}'), // 󱟚 ("md_briefcase_minus", '\u{f0a2a}'), // 󰨪 ("md_briefcase_minus_outline", '\u{f0c3f}'), // ó°°¿ ("md_briefcase_off", '\u{f1658}'), // 󱙘 ("md_briefcase_off_outline", '\u{f1659}'), // ó±™™ ("md_briefcase_outline", '\u{f0814}'), // ó° ” ("md_briefcase_plus", '\u{f0a2b}'), // 󰨫 ("md_briefcase_plus_outline", '\u{f0c40}'), // ó°±€ ("md_briefcase_remove", '\u{f0a2c}'), // 󰨬 ("md_briefcase_remove_outline", '\u{f0c41}'), // ó°± ("md_briefcase_search", '\u{f0a2d}'), // ó°¨­ ("md_briefcase_search_outline", '\u{f0c42}'), // 󰱂 ("md_briefcase_upload", '\u{f00d9}'), // 󰃙 ("md_briefcase_upload_outline", '\u{f0c43}'), // 󰱃 ("md_briefcase_variant", '\u{f1494}'), // ó±’” ("md_briefcase_variant_off", '\u{f165a}'), // 󱙚 ("md_briefcase_variant_off_outline", '\u{f165b}'), // ó±™› ("md_briefcase_variant_outline", '\u{f1495}'), // ó±’• ("md_brightness_1", '\u{f00da}'), // 󰃚 ("md_brightness_2", '\u{f00db}'), // 󰃛 ("md_brightness_3", '\u{f00dc}'), // 󰃜 ("md_brightness_4", '\u{f00dd}'), // ó°ƒ ("md_brightness_5", '\u{f00de}'), // 󰃞 ("md_brightness_6", '\u{f00df}'), // 󰃟 ("md_brightness_7", '\u{f00e0}'), // ó°ƒ  ("md_brightness_auto", '\u{f00e1}'), // 󰃡 ("md_brightness_percent", '\u{f0cf2}'), // ó°³² ("md_broadcast", '\u{f1720}'), // 󱜠 ("md_broadcast_off", '\u{f1721}'), // 󱜡 ("md_broom", '\u{f00e2}'), // 󰃢 ("md_brush", '\u{f00e3}'), // 󰃣 ("md_brush_off", '\u{f1771}'), // ó±± ("md_brush_outline", '\u{f1a0d}'), // ó±¨ ("md_brush_variant", '\u{f1813}'), // ó± “ ("md_bucket", '\u{f1415}'), // ó±• ("md_bucket_outline", '\u{f1416}'), // ó±– ("md_buffet", '\u{f0578}'), // 󰕸 ("md_bug", '\u{f00e4}'), // 󰃤 ("md_bug_check", '\u{f0a2e}'), // 󰨮 ("md_bug_check_outline", '\u{f0a2f}'), // 󰨯 ("md_bug_outline", '\u{f0a30}'), // ó°¨° ("md_bugle", '\u{f0db4}'), // ó°¶´ ("md_bulkhead_light", '\u{f1a2f}'), // 󱨯 ("md_bulldozer", '\u{f0b22}'), // 󰬢 ("md_bullet", '\u{f0cf3}'), // ó°³³ ("md_bulletin_board", '\u{f00e5}'), // 󰃥 ("md_bullhorn", '\u{f00e6}'), // 󰃦 ("md_bullhorn_outline", '\u{f0b23}'), // 󰬣 ("md_bullhorn_variant", '\u{f196e}'), // ó±¥® ("md_bullhorn_variant_outline", '\u{f196f}'), // 󱥯 ("md_bullseye", '\u{f05dd}'), // ó°— ("md_bullseye_arrow", '\u{f08c9}'), // 󰣉 ("md_bulma", '\u{f12e7}'), // 󱋧 ("md_bunk_bed", '\u{f1302}'), // 󱌂 ("md_bunk_bed_outline", '\u{f0097}'), // ó°‚— ("md_bus", '\u{f00e7}'), // 󰃧 ("md_bus_alert", '\u{f0a99}'), // 󰪙 ("md_bus_articulated_end", '\u{f079c}'), // ó°žœ ("md_bus_articulated_front", '\u{f079d}'), // ó°ž ("md_bus_clock", '\u{f08ca}'), // 󰣊 ("md_bus_double_decker", '\u{f079e}'), // ó°žž ("md_bus_electric", '\u{f191d}'), // ó±¤ ("md_bus_marker", '\u{f1212}'), // 󱈒 ("md_bus_multiple", '\u{f0f3f}'), // 󰼿 ("md_bus_school", '\u{f079f}'), // 󰞟 ("md_bus_side", '\u{f07a0}'), // ó°ž  ("md_bus_stop", '\u{f1012}'), // ó±€’ ("md_bus_stop_covered", '\u{f1013}'), // 󱀓 ("md_bus_stop_uncovered", '\u{f1014}'), // ó±€” ("md_butterfly", '\u{f1589}'), // ó±–‰ ("md_butterfly_outline", '\u{f158a}'), // ó±–Š ("md_cabin_a_frame", '\u{f188c}'), // 󱢌 ("md_cable_data", '\u{f1394}'), // 󱎔 ("md_cached", '\u{f00e8}'), // 󰃨 ("md_cactus", '\u{f0db5}'), // ó°¶µ ("md_cake", '\u{f00e9}'), // 󰃩 ("md_cake_layered", '\u{f00ea}'), // 󰃪 ("md_cake_variant", '\u{f00eb}'), // 󰃫 ("md_cake_variant_outline", '\u{f17f0}'), // 󱟰 ("md_calculator", '\u{f00ec}'), // 󰃬 ("md_calculator_variant", '\u{f0a9a}'), // 󰪚 ("md_calculator_variant_outline", '\u{f15a6}'), // ó±–¦ ("md_calendar", '\u{f00ed}'), // ó°ƒ­ ("md_calendar_account", '\u{f0ed7}'), // ó°»— ("md_calendar_account_outline", '\u{f0ed8}'), // 󰻘 ("md_calendar_alert", '\u{f0a31}'), // 󰨱 ("md_calendar_arrow_left", '\u{f1134}'), // 󱄴 ("md_calendar_arrow_right", '\u{f1135}'), // 󱄵 ("md_calendar_blank", '\u{f00ee}'), // 󰃮 ("md_calendar_blank_multiple", '\u{f1073}'), // ó±³ ("md_calendar_blank_outline", '\u{f0b66}'), // ó°­¦ ("md_calendar_check", '\u{f00ef}'), // 󰃯 ("md_calendar_check_outline", '\u{f0c44}'), // 󰱄 ("md_calendar_clock", '\u{f00f0}'), // ó°ƒ° ("md_calendar_clock_outline", '\u{f16e1}'), // 󱛡 ("md_calendar_collapse_horizontal", '\u{f189d}'), // ó±¢ ("md_calendar_cursor", '\u{f157b}'), // 󱕻 ("md_calendar_edit", '\u{f08a7}'), // ó°¢§ ("md_calendar_end", '\u{f166c}'), // 󱙬 ("md_calendar_expand_horizontal", '\u{f189e}'), // 󱢞 ("md_calendar_export", '\u{f0b24}'), // 󰬤 ("md_calendar_heart", '\u{f09d2}'), // ó°§’ ("md_calendar_import", '\u{f0b25}'), // 󰬥 ("md_calendar_lock", '\u{f1641}'), // ó±™ ("md_calendar_lock_outline", '\u{f1642}'), // 󱙂 ("md_calendar_minus", '\u{f0d5c}'), // 󰵜 ("md_calendar_month", '\u{f0e17}'), // ó°¸— ("md_calendar_month_outline", '\u{f0e18}'), // 󰸘 ("md_calendar_multiple", '\u{f00f1}'), // 󰃱 ("md_calendar_multiple_check", '\u{f00f2}'), // 󰃲 ("md_calendar_multiselect", '\u{f0a32}'), // 󰨲 ("md_calendar_outline", '\u{f0b67}'), // ó°­§ ("md_calendar_plus", '\u{f00f3}'), // 󰃳 ("md_calendar_question", '\u{f0692}'), // ó°š’ ("md_calendar_range", '\u{f0679}'), // ó°™¹ ("md_calendar_range_outline", '\u{f0b68}'), // ó°­¨ ("md_calendar_refresh", '\u{f01e1}'), // 󰇡 ("md_calendar_refresh_outline", '\u{f0203}'), // 󰈃 ("md_calendar_remove", '\u{f00f4}'), // ó°ƒ´ ("md_calendar_remove_outline", '\u{f0c45}'), // ó°±… ("md_calendar_search", '\u{f094c}'), // 󰥌 ("md_calendar_star", '\u{f09d3}'), // ó°§“ ("md_calendar_start", '\u{f166d}'), // ó±™­ ("md_calendar_sync", '\u{f0e8e}'), // 󰺎 ("md_calendar_sync_outline", '\u{f0e8f}'), // ó°º ("md_calendar_text", '\u{f00f5}'), // 󰃵 ("md_calendar_text_outline", '\u{f0c46}'), // 󰱆 ("md_calendar_today", '\u{f00f6}'), // 󰃶 ("md_calendar_today_outline", '\u{f1a30}'), // 󱨰 ("md_calendar_week", '\u{f0a33}'), // 󰨳 ("md_calendar_week_begin", '\u{f0a34}'), // ó°¨´ ("md_calendar_week_begin_outline", '\u{f1a31}'), // 󱨱 ("md_calendar_week_end", '\u{f1a32}'), // 󱨲 ("md_calendar_week_end_outline", '\u{f1a33}'), // 󱨳 ("md_calendar_week_outline", '\u{f1a34}'), // 󱨴 ("md_calendar_weekend", '\u{f0ed9}'), // ó°»™ ("md_calendar_weekend_outline", '\u{f0eda}'), // 󰻚 ("md_call_made", '\u{f00f7}'), // ó°ƒ· ("md_call_merge", '\u{f00f8}'), // 󰃸 ("md_call_missed", '\u{f00f9}'), // 󰃹 ("md_call_received", '\u{f00fa}'), // 󰃺 ("md_call_split", '\u{f00fb}'), // 󰃻 ("md_camcorder", '\u{f00fc}'), // 󰃼 ("md_camcorder_off", '\u{f00ff}'), // 󰃿 ("md_camera", '\u{f0100}'), // ó°„€ ("md_camera_account", '\u{f08cb}'), // 󰣋 ("md_camera_burst", '\u{f0693}'), // ó°š“ ("md_camera_control", '\u{f0b69}'), // ó°­© ("md_camera_document", '\u{f1871}'), // 󱡱 ("md_camera_document_off", '\u{f1872}'), // 󱡲 ("md_camera_enhance", '\u{f0101}'), // ó°„ ("md_camera_enhance_outline", '\u{f0b6a}'), // ó°­ª ("md_camera_flip", '\u{f15d9}'), // ó±—™ ("md_camera_flip_outline", '\u{f15da}'), // ó±—š ("md_camera_front", '\u{f0102}'), // ó°„‚ ("md_camera_front_variant", '\u{f0103}'), // 󰄃 ("md_camera_gopro", '\u{f07a1}'), // ó°ž¡ ("md_camera_image", '\u{f08cc}'), // 󰣌 ("md_camera_iris", '\u{f0104}'), // ó°„„ ("md_camera_lock", '\u{f1a14}'), // 󱨔 ("md_camera_lock_outline", '\u{f1a15}'), // 󱨕 ("md_camera_marker", '\u{f19a7}'), // 󱦧 ("md_camera_marker_outline", '\u{f19a8}'), // 󱦨 ("md_camera_metering_center", '\u{f07a2}'), // 󰞢 ("md_camera_metering_matrix", '\u{f07a3}'), // 󰞣 ("md_camera_metering_partial", '\u{f07a4}'), // 󰞤 ("md_camera_metering_spot", '\u{f07a5}'), // 󰞥 ("md_camera_off", '\u{f05df}'), // ó°—Ÿ ("md_camera_off_outline", '\u{f19bf}'), // 󱦿 ("md_camera_outline", '\u{f0d5d}'), // ó°µ ("md_camera_party_mode", '\u{f0105}'), // ó°„… ("md_camera_plus", '\u{f0edb}'), // ó°»› ("md_camera_plus_outline", '\u{f0edc}'), // 󰻜 ("md_camera_rear", '\u{f0106}'), // 󰄆 ("md_camera_rear_variant", '\u{f0107}'), // 󰄇 ("md_camera_retake", '\u{f0e19}'), // 󰸙 ("md_camera_retake_outline", '\u{f0e1a}'), // 󰸚 ("md_camera_switch", '\u{f0108}'), // 󰄈 ("md_camera_switch_outline", '\u{f084a}'), // ó°¡Š ("md_camera_timer", '\u{f0109}'), // 󰄉 ("md_camera_wireless", '\u{f0db6}'), // ó°¶¶ ("md_camera_wireless_outline", '\u{f0db7}'), // ó°¶· ("md_campfire", '\u{f0edd}'), // ó°» ("md_cancel", '\u{f073a}'), // 󰜺 ("md_candelabra", '\u{f17d2}'), // 󱟒 ("md_candelabra_fire", '\u{f17d3}'), // 󱟓 ("md_candle", '\u{f05e2}'), // ó°—¢ ("md_candy", '\u{f1970}'), // ó±¥° ("md_candy_off", '\u{f1971}'), // ó±¥± ("md_candy_off_outline", '\u{f1972}'), // ó±¥² ("md_candy_outline", '\u{f1973}'), // ó±¥³ ("md_candycane", '\u{f010a}'), // ó°„Š ("md_cannabis", '\u{f07a6}'), // 󰞦 ("md_cannabis_off", '\u{f166e}'), // ó±™® ("md_caps_lock", '\u{f0a9b}'), // 󰪛 ("md_car", '\u{f010b}'), // ó°„‹ ("md_car_2_plus", '\u{f1015}'), // 󱀕 ("md_car_3_plus", '\u{f1016}'), // ó±€– ("md_car_arrow_left", '\u{f13b2}'), // 󱎲 ("md_car_arrow_right", '\u{f13b3}'), // 󱎳 ("md_car_back", '\u{f0e1b}'), // 󰸛 ("md_car_battery", '\u{f010c}'), // ó°„Œ ("md_car_brake_abs", '\u{f0c47}'), // 󰱇 ("md_car_brake_alert", '\u{f0c48}'), // 󰱈 ("md_car_brake_fluid_level", '\u{f1909}'), // 󱤉 ("md_car_brake_hold", '\u{f0d5e}'), // 󰵞 ("md_car_brake_low_pressure", '\u{f190a}'), // 󱤊 ("md_car_brake_parking", '\u{f0d5f}'), // 󰵟 ("md_car_brake_retarder", '\u{f1017}'), // ó±€— ("md_car_brake_temperature", '\u{f190b}'), // 󱤋 ("md_car_brake_worn_linings", '\u{f190c}'), // 󱤌 ("md_car_child_seat", '\u{f0fa3}'), // ó°¾£ ("md_car_clock", '\u{f1974}'), // ó±¥´ ("md_car_clutch", '\u{f1018}'), // 󱀘 ("md_car_cog", '\u{f13cc}'), // ó±Œ ("md_car_connected", '\u{f010d}'), // ó°„ ("md_car_convertible", '\u{f07a7}'), // ó°ž§ ("md_car_coolant_level", '\u{f1019}'), // ó±€™ ("md_car_cruise_control", '\u{f0d60}'), // ó°µ  ("md_car_defrost_front", '\u{f0d61}'), // 󰵡 ("md_car_defrost_rear", '\u{f0d62}'), // ó°µ¢ ("md_car_door", '\u{f0b6b}'), // ó°­« ("md_car_door_lock", '\u{f109d}'), // ó±‚ ("md_car_electric", '\u{f0b6c}'), // ó°­¬ ("md_car_electric_outline", '\u{f15b5}'), // ó±–µ ("md_car_emergency", '\u{f160f}'), // ó±˜ ("md_car_esp", '\u{f0c49}'), // 󰱉 ("md_car_estate", '\u{f07a8}'), // 󰞨 ("md_car_hatchback", '\u{f07a9}'), // ó°ž© ("md_car_info", '\u{f11be}'), // 󱆾 ("md_car_key", '\u{f0b6d}'), // ó°­­ ("md_car_lifted_pickup", '\u{f152d}'), // ó±”­ ("md_car_light_alert", '\u{f190d}'), // ó±¤ ("md_car_light_dimmed", '\u{f0c4a}'), // 󰱊 ("md_car_light_fog", '\u{f0c4b}'), // 󰱋 ("md_car_light_high", '\u{f0c4c}'), // 󰱌 ("md_car_limousine", '\u{f08cd}'), // ó°£ ("md_car_multiple", '\u{f0b6e}'), // ó°­® ("md_car_off", '\u{f0e1c}'), // 󰸜 ("md_car_outline", '\u{f14ed}'), // 󱓭 ("md_car_parking_lights", '\u{f0d63}'), // ó°µ£ ("md_car_pickup", '\u{f07aa}'), // 󰞪 ("md_car_seat", '\u{f0fa4}'), // 󰾤 ("md_car_seat_cooler", '\u{f0fa5}'), // ó°¾¥ ("md_car_seat_heater", '\u{f0fa6}'), // 󰾦 ("md_car_select", '\u{f1879}'), // 󱡹 ("md_car_settings", '\u{f13cd}'), // ó± ("md_car_shift_pattern", '\u{f0f40}'), // ó°½€ ("md_car_side", '\u{f07ab}'), // ó°ž« ("md_car_speed_limiter", '\u{f190e}'), // 󱤎 ("md_car_sports", '\u{f07ac}'), // 󰞬 ("md_car_tire_alert", '\u{f0c4d}'), // ó°± ("md_car_traction_control", '\u{f0d64}'), // 󰵤 ("md_car_turbocharger", '\u{f101a}'), // 󱀚 ("md_car_wash", '\u{f010e}'), // ó°„Ž ("md_car_windshield", '\u{f101b}'), // ó±€› ("md_car_windshield_outline", '\u{f101c}'), // 󱀜 ("md_car_wireless", '\u{f1878}'), // 󱡸 ("md_car_wrench", '\u{f1814}'), // ó± ” ("md_carabiner", '\u{f14c0}'), // 󱓀 ("md_caravan", '\u{f07ad}'), // ó°ž­ ("md_card", '\u{f0b6f}'), // ó°­¯ ("md_card_account_details", '\u{f05d2}'), // ó°—’ ("md_card_account_details_outline", '\u{f0dab}'), // ó°¶« ("md_card_account_details_star", '\u{f02a3}'), // ó°Š£ ("md_card_account_details_star_outline", '\u{f06db}'), // ó°›› ("md_card_account_mail", '\u{f018e}'), // 󰆎 ("md_card_account_mail_outline", '\u{f0e98}'), // 󰺘 ("md_card_account_phone", '\u{f0e99}'), // 󰺙 ("md_card_account_phone_outline", '\u{f0e9a}'), // 󰺚 ("md_card_bulleted", '\u{f0b70}'), // ó°­° ("md_card_bulleted_off", '\u{f0b71}'), // ó°­± ("md_card_bulleted_off_outline", '\u{f0b72}'), // ó°­² ("md_card_bulleted_outline", '\u{f0b73}'), // ó°­³ ("md_card_bulleted_settings", '\u{f0b74}'), // ó°­´ ("md_card_bulleted_settings_outline", '\u{f0b75}'), // ó°­µ ("md_card_minus", '\u{f1600}'), // 󱘀 ("md_card_minus_outline", '\u{f1601}'), // ó±˜ ("md_card_multiple", '\u{f17f1}'), // 󱟱 ("md_card_multiple_outline", '\u{f17f2}'), // 󱟲 ("md_card_off", '\u{f1602}'), // 󱘂 ("md_card_off_outline", '\u{f1603}'), // 󱘃 ("md_card_outline", '\u{f0b76}'), // ó°­¶ ("md_card_plus", '\u{f11ff}'), // 󱇿 ("md_card_plus_outline", '\u{f1200}'), // 󱈀 ("md_card_remove", '\u{f1604}'), // 󱘄 ("md_card_remove_outline", '\u{f1605}'), // 󱘅 ("md_card_search", '\u{f1074}'), // ó±´ ("md_card_search_outline", '\u{f1075}'), // ó±µ ("md_card_text", '\u{f0b77}'), // ó°­· ("md_card_text_outline", '\u{f0b78}'), // ó°­¸ ("md_cards", '\u{f0638}'), // 󰘸 ("md_cards_club", '\u{f08ce}'), // 󰣎 ("md_cards_club_outline", '\u{f189f}'), // 󱢟 ("md_cards_diamond", '\u{f08cf}'), // ó°£ ("md_cards_diamond_outline", '\u{f101d}'), // ó±€ ("md_cards_outline", '\u{f0639}'), // 󰘹 ("md_cards_playing", '\u{f18a1}'), // 󱢡 ("md_cards_playing_club", '\u{f18a2}'), // ó±¢¢ ("md_cards_playing_club_multiple", '\u{f18a3}'), // ó±¢£ ("md_cards_playing_club_multiple_outline", '\u{f18a4}'), // 󱢤 ("md_cards_playing_club_outline", '\u{f18a5}'), // ó±¢¥ ("md_cards_playing_diamond", '\u{f18a6}'), // 󱢦 ("md_cards_playing_diamond_multiple", '\u{f18a7}'), // ó±¢§ ("md_cards_playing_diamond_multiple_outline", '\u{f18a8}'), // 󱢨 ("md_cards_playing_diamond_outline", '\u{f18a9}'), // 󱢩 ("md_cards_playing_heart", '\u{f18aa}'), // 󱢪 ("md_cards_playing_heart_multiple", '\u{f18ab}'), // 󱢫 ("md_cards_playing_heart_multiple_outline", '\u{f18ac}'), // 󱢬 ("md_cards_playing_heart_outline", '\u{f18ad}'), // ó±¢­ ("md_cards_playing_outline", '\u{f063a}'), // 󰘺 ("md_cards_playing_spade", '\u{f18ae}'), // ó±¢® ("md_cards_playing_spade_multiple", '\u{f18af}'), // 󱢯 ("md_cards_playing_spade_multiple_outline", '\u{f18b0}'), // ó±¢° ("md_cards_playing_spade_outline", '\u{f18b1}'), // ó±¢± ("md_cards_spade", '\u{f08d1}'), // 󰣑 ("md_cards_spade_outline", '\u{f18b2}'), // ó±¢² ("md_cards_variant", '\u{f06c7}'), // 󰛇 ("md_carrot", '\u{f010f}'), // ó°„ ("md_cart", '\u{f0110}'), // ó°„ ("md_cart_arrow_down", '\u{f0d66}'), // 󰵦 ("md_cart_arrow_right", '\u{f0c4e}'), // 󰱎 ("md_cart_arrow_up", '\u{f0d67}'), // ó°µ§ ("md_cart_check", '\u{f15ea}'), // ó±—ª ("md_cart_heart", '\u{f18e0}'), // ó±£  ("md_cart_minus", '\u{f0d68}'), // 󰵨 ("md_cart_off", '\u{f066b}'), // ó°™« ("md_cart_outline", '\u{f0111}'), // ó°„‘ ("md_cart_plus", '\u{f0112}'), // ó°„’ ("md_cart_remove", '\u{f0d69}'), // 󰵩 ("md_cart_variant", '\u{f15eb}'), // ó±—« ("md_case_sensitive_alt", '\u{f0113}'), // ó°„“ ("md_cash", '\u{f0114}'), // ó°„” ("md_cash_100", '\u{f0115}'), // ó°„• ("md_cash_check", '\u{f14ee}'), // 󱓮 ("md_cash_clock", '\u{f1a91}'), // 󱪑 ("md_cash_fast", '\u{f185c}'), // 󱡜 ("md_cash_lock", '\u{f14ea}'), // 󱓪 ("md_cash_lock_open", '\u{f14eb}'), // 󱓫 ("md_cash_marker", '\u{f0db8}'), // 󰶸 ("md_cash_minus", '\u{f1260}'), // 󱉠 ("md_cash_multiple", '\u{f0116}'), // ó°„– ("md_cash_plus", '\u{f1261}'), // 󱉡 ("md_cash_refund", '\u{f0a9c}'), // 󰪜 ("md_cash_register", '\u{f0cf4}'), // ó°³´ ("md_cash_remove", '\u{f1262}'), // 󱉢 ("md_cash_sync", '\u{f1a92}'), // 󱪒 ("md_cassette", '\u{f09d4}'), // ó°§” ("md_cast", '\u{f0118}'), // 󰄘 ("md_cast_audio", '\u{f101e}'), // 󱀞 ("md_cast_audio_variant", '\u{f1749}'), // ó±‰ ("md_cast_connected", '\u{f0119}'), // ó°„™ ("md_cast_education", '\u{f0e1d}'), // ó°¸ ("md_cast_off", '\u{f078a}'), // 󰞊 ("md_cast_variant", '\u{f001f}'), // 󰀟 ("md_castle", '\u{f011a}'), // ó°„š ("md_cat", '\u{f011b}'), // ó°„› ("md_cctv", '\u{f07ae}'), // ó°ž® ("md_cctv_off", '\u{f185f}'), // 󱡟 ("md_ceiling_fan", '\u{f1797}'), // 󱞗 ("md_ceiling_fan_light", '\u{f1798}'), // 󱞘 ("md_ceiling_light", '\u{f0769}'), // ó°© ("md_ceiling_light_multiple", '\u{f18dd}'), // ó±£ ("md_ceiling_light_multiple_outline", '\u{f18de}'), // 󱣞 ("md_ceiling_light_outline", '\u{f17c7}'), // 󱟇 ("md_cellphone", '\u{f011c}'), // ó°„œ ("md_cellphone_arrow_down", '\u{f09d5}'), // ó°§• ("md_cellphone_arrow_down_variant", '\u{f19c5}'), // ó±§… ("md_cellphone_basic", '\u{f011e}'), // ó°„ž ("md_cellphone_charging", '\u{f1397}'), // 󱎗 ("md_cellphone_check", '\u{f17fd}'), // 󱟽 ("md_cellphone_cog", '\u{f0951}'), // 󰥑 ("md_cellphone_dock", '\u{f011f}'), // ó°„Ÿ ("md_cellphone_information", '\u{f0f41}'), // ó°½ ("md_cellphone_key", '\u{f094e}'), // 󰥎 ("md_cellphone_link", '\u{f0121}'), // ó°„¡ ("md_cellphone_link_off", '\u{f0122}'), // ó°„¢ ("md_cellphone_lock", '\u{f094f}'), // ó°¥ ("md_cellphone_marker", '\u{f183a}'), // ó± º ("md_cellphone_message", '\u{f08d3}'), // 󰣓 ("md_cellphone_message_off", '\u{f10d2}'), // 󱃒 ("md_cellphone_nfc", '\u{f0e90}'), // ó°º ("md_cellphone_nfc_off", '\u{f12d8}'), // 󱋘 ("md_cellphone_off", '\u{f0950}'), // ó°¥ ("md_cellphone_play", '\u{f101f}'), // 󱀟 ("md_cellphone_remove", '\u{f094d}'), // ó°¥ ("md_cellphone_screenshot", '\u{f0a35}'), // 󰨵 ("md_cellphone_settings", '\u{f0123}'), // ó°„£ ("md_cellphone_sound", '\u{f0952}'), // ó°¥’ ("md_cellphone_text", '\u{f08d2}'), // ó°£’ ("md_cellphone_wireless", '\u{f0815}'), // ó° • ("md_centos", '\u{f111a}'), // 󱄚 ("md_certificate", '\u{f0124}'), // 󰄤 ("md_certificate_outline", '\u{f1188}'), // 󱆈 ("md_chair_rolling", '\u{f0f48}'), // 󰽈 ("md_chair_school", '\u{f0125}'), // ó°„¥ ("md_chandelier", '\u{f1793}'), // 󱞓 ("md_charity", '\u{f0c4f}'), // ó°± ("md_chart_arc", '\u{f0126}'), // 󰄦 ("md_chart_areaspline", '\u{f0127}'), // ó°„§ ("md_chart_areaspline_variant", '\u{f0e91}'), // 󰺑 ("md_chart_bar", '\u{f0128}'), // 󰄨 ("md_chart_bar_stacked", '\u{f076a}'), // ó°ª ("md_chart_bell_curve", '\u{f0c50}'), // ó°± ("md_chart_bell_curve_cumulative", '\u{f0fa7}'), // ó°¾§ ("md_chart_box", '\u{f154d}'), // ó±• ("md_chart_box_outline", '\u{f154e}'), // 󱕎 ("md_chart_box_plus_outline", '\u{f154f}'), // ó±• ("md_chart_bubble", '\u{f05e3}'), // ó°—£ ("md_chart_donut", '\u{f07af}'), // 󰞯 ("md_chart_donut_variant", '\u{f07b0}'), // ó°ž° ("md_chart_gantt", '\u{f066c}'), // 󰙬 ("md_chart_histogram", '\u{f0129}'), // ó°„© ("md_chart_line", '\u{f012a}'), // 󰄪 ("md_chart_line_stacked", '\u{f076b}'), // ó°« ("md_chart_line_variant", '\u{f07b1}'), // ó°ž± ("md_chart_multiline", '\u{f08d4}'), // ó°£” ("md_chart_multiple", '\u{f1213}'), // 󱈓 ("md_chart_pie", '\u{f012b}'), // ó°„« ("md_chart_ppf", '\u{f1380}'), // 󱎀 ("md_chart_sankey", '\u{f11df}'), // 󱇟 ("md_chart_sankey_variant", '\u{f11e0}'), // 󱇠 ("md_chart_scatter_plot", '\u{f0e92}'), // ó°º’ ("md_chart_scatter_plot_hexbin", '\u{f066d}'), // ó°™­ ("md_chart_timeline", '\u{f066e}'), // ó°™® ("md_chart_timeline_variant", '\u{f0e93}'), // 󰺓 ("md_chart_timeline_variant_shimmer", '\u{f15b6}'), // ó±–¶ ("md_chart_tree", '\u{f0e94}'), // 󰺔 ("md_chart_waterfall", '\u{f1918}'), // 󱤘 ("md_chat", '\u{f0b79}'), // ó°­¹ ("md_chat_alert", '\u{f0b7a}'), // ó°­º ("md_chat_alert_outline", '\u{f12c9}'), // 󱋉 ("md_chat_minus", '\u{f1410}'), // ó± ("md_chat_minus_outline", '\u{f1413}'), // ó±“ ("md_chat_outline", '\u{f0ede}'), // 󰻞 ("md_chat_plus", '\u{f140f}'), // ó± ("md_chat_plus_outline", '\u{f1412}'), // ó±’ ("md_chat_processing", '\u{f0b7b}'), // ó°­» ("md_chat_processing_outline", '\u{f12ca}'), // 󱋊 ("md_chat_question", '\u{f1738}'), // 󱜸 ("md_chat_question_outline", '\u{f1739}'), // 󱜹 ("md_chat_remove", '\u{f1411}'), // ó±‘ ("md_chat_remove_outline", '\u{f1414}'), // ó±” ("md_chat_sleep", '\u{f12d1}'), // 󱋑 ("md_chat_sleep_outline", '\u{f12d2}'), // 󱋒 ("md_check", '\u{f012c}'), // 󰄬 ("md_check_all", '\u{f012d}'), // ó°„­ ("md_check_bold", '\u{f0e1e}'), // 󰸞 ("md_check_circle", '\u{f05e0}'), // ó°—  ("md_check_circle_outline", '\u{f05e1}'), // ó°—¡ ("md_check_decagram", '\u{f0791}'), // ó°ž‘ ("md_check_decagram_outline", '\u{f1740}'), // ó±€ ("md_check_network", '\u{f0c53}'), // 󰱓 ("md_check_network_outline", '\u{f0c54}'), // ó°±” ("md_check_outline", '\u{f0855}'), // ó°¡• ("md_check_underline", '\u{f0e1f}'), // 󰸟 ("md_check_underline_circle", '\u{f0e20}'), // ó°¸  ("md_check_underline_circle_outline", '\u{f0e21}'), // 󰸡 ("md_checkbook", '\u{f0a9d}'), // ó°ª ("md_checkbox_blank", '\u{f012e}'), // ó°„® ("md_checkbox_blank_badge", '\u{f1176}'), // ó±…¶ ("md_checkbox_blank_badge_outline", '\u{f0117}'), // ó°„— ("md_checkbox_blank_circle", '\u{f0765}'), // ó°¥ ("md_checkbox_blank_circle", '\u{f0765}'), // ó°¥ ("md_checkbox_blank_circle_outline", '\u{f0766}'), // ó°¦ ("md_checkbox_blank_circle_outline", '\u{f0766}'), // ó°¦ ("md_checkbox_blank_circle_outline", '\u{f0766}'), // ó°¦ ("md_checkbox_blank_off", '\u{f12ec}'), // 󱋬 ("md_checkbox_blank_off_outline", '\u{f12ed}'), // 󱋭 ("md_checkbox_blank_outline", '\u{f0131}'), // ó°„± ("md_checkbox_intermediate", '\u{f0856}'), // ó°¡– ("md_checkbox_marked", '\u{f0132}'), // ó°„² ("md_checkbox_marked_circle", '\u{f0133}'), // ó°„³ ("md_checkbox_marked_circle_outline", '\u{f0134}'), // ó°„´ ("md_checkbox_marked_circle_plus_outline", '\u{f1927}'), // 󱤧 ("md_checkbox_marked_outline", '\u{f0135}'), // ó°„µ ("md_checkbox_multiple_blank", '\u{f0136}'), // ó°„¶ ("md_checkbox_multiple_blank_circle", '\u{f063b}'), // 󰘻 ("md_checkbox_multiple_blank_circle_outline", '\u{f063c}'), // 󰘼 ("md_checkbox_multiple_blank_outline", '\u{f0137}'), // ó°„· ("md_checkbox_multiple_marked", '\u{f0138}'), // 󰄸 ("md_checkbox_multiple_marked_circle", '\u{f063d}'), // 󰘽 ("md_checkbox_multiple_marked_circle_outline", '\u{f063e}'), // 󰘾 ("md_checkbox_multiple_marked_outline", '\u{f0139}'), // ó°„¹ ("md_checkbox_multiple_outline", '\u{f0c51}'), // 󰱑 ("md_checkbox_outline", '\u{f0c52}'), // ó°±’ ("md_checkerboard", '\u{f013a}'), // 󰄺 ("md_checkerboard_minus", '\u{f1202}'), // 󱈂 ("md_checkerboard_plus", '\u{f1201}'), // ó±ˆ ("md_checkerboard_remove", '\u{f1203}'), // 󱈃 ("md_cheese", '\u{f12b9}'), // 󱊹 ("md_cheese_off", '\u{f13ee}'), // ó±® ("md_chef_hat", '\u{f0b7c}'), // ó°­¼ ("md_chemical_weapon", '\u{f013b}'), // ó°„» ("md_chess_bishop", '\u{f085c}'), // ó°¡œ ("md_chess_king", '\u{f0857}'), // ó°¡— ("md_chess_knight", '\u{f0858}'), // 󰡘 ("md_chess_pawn", '\u{f0859}'), // ó°¡™ ("md_chess_queen", '\u{f085a}'), // ó°¡š ("md_chess_rook", '\u{f085b}'), // ó°¡› ("md_chevron_double_down", '\u{f013c}'), // ó°„¼ ("md_chevron_double_left", '\u{f013d}'), // ó°„½ ("md_chevron_double_right", '\u{f013e}'), // ó°„¾ ("md_chevron_double_up", '\u{f013f}'), // ó°„¿ ("md_chevron_down", '\u{f0140}'), // ó°…€ ("md_chevron_down_box", '\u{f09d6}'), // ó°§– ("md_chevron_down_box_outline", '\u{f09d7}'), // ó°§— ("md_chevron_down_circle", '\u{f0b26}'), // 󰬦 ("md_chevron_down_circle_outline", '\u{f0b27}'), // 󰬧 ("md_chevron_left", '\u{f0141}'), // ó°… ("md_chevron_left_box", '\u{f09d8}'), // 󰧘 ("md_chevron_left_box_outline", '\u{f09d9}'), // ó°§™ ("md_chevron_left_circle", '\u{f0b28}'), // 󰬨 ("md_chevron_left_circle_outline", '\u{f0b29}'), // 󰬩 ("md_chevron_right", '\u{f0142}'), // ó°…‚ ("md_chevron_right_box", '\u{f09da}'), // ó°§š ("md_chevron_right_box_outline", '\u{f09db}'), // ó°§› ("md_chevron_right_circle", '\u{f0b2a}'), // 󰬪 ("md_chevron_right_circle_outline", '\u{f0b2b}'), // 󰬫 ("md_chevron_triple_down", '\u{f0db9}'), // ó°¶¹ ("md_chevron_triple_left", '\u{f0dba}'), // 󰶺 ("md_chevron_triple_right", '\u{f0dbb}'), // ó°¶» ("md_chevron_triple_up", '\u{f0dbc}'), // ó°¶¼ ("md_chevron_up", '\u{f0143}'), // ó°…ƒ ("md_chevron_up_box", '\u{f09dc}'), // ó°§œ ("md_chevron_up_box_outline", '\u{f09dd}'), // ó°§ ("md_chevron_up_circle", '\u{f0b2c}'), // 󰬬 ("md_chevron_up_circle_outline", '\u{f0b2d}'), // ó°¬­ ("md_chili_alert", '\u{f17ea}'), // 󱟪 ("md_chili_alert_outline", '\u{f17eb}'), // 󱟫 ("md_chili_hot", '\u{f07b2}'), // ó°ž² ("md_chili_hot_outline", '\u{f17ec}'), // 󱟬 ("md_chili_medium", '\u{f07b3}'), // ó°ž³ ("md_chili_medium_outline", '\u{f17ed}'), // 󱟭 ("md_chili_mild", '\u{f07b4}'), // ó°ž´ ("md_chili_mild_outline", '\u{f17ee}'), // 󱟮 ("md_chili_off", '\u{f1467}'), // 󱑧 ("md_chili_off_outline", '\u{f17ef}'), // 󱟯 ("md_chip", '\u{f061a}'), // 󰘚 ("md_church", '\u{f0144}'), // ó°…„ ("md_cigar", '\u{f1189}'), // 󱆉 ("md_cigar_off", '\u{f141b}'), // ó±› ("md_circle_box", '\u{f15dc}'), // ó±—œ ("md_circle_box_outline", '\u{f15dd}'), // ó±— ("md_circle_double", '\u{f0e95}'), // 󰺕 ("md_circle_edit_outline", '\u{f08d5}'), // 󰣕 ("md_circle_expand", '\u{f0e96}'), // ó°º– ("md_circle_half", '\u{f1395}'), // 󱎕 ("md_circle_half_full", '\u{f1396}'), // 󱎖 ("md_circle_medium", '\u{f09de}'), // ó°§ž ("md_circle_multiple", '\u{f0b38}'), // 󰬸 ("md_circle_multiple_outline", '\u{f0695}'), // ó°š• ("md_circle_off_outline", '\u{f10d3}'), // 󱃓 ("md_circle_opacity", '\u{f1853}'), // 󱡓 ("md_circle_slice_1", '\u{f0a9e}'), // 󰪞 ("md_circle_slice_2", '\u{f0a9f}'), // 󰪟 ("md_circle_slice_3", '\u{f0aa0}'), // ó°ª  ("md_circle_slice_4", '\u{f0aa1}'), // 󰪡 ("md_circle_slice_5", '\u{f0aa2}'), // 󰪢 ("md_circle_slice_6", '\u{f0aa3}'), // 󰪣 ("md_circle_slice_7", '\u{f0aa4}'), // 󰪤 ("md_circle_slice_8", '\u{f0aa5}'), // 󰪥 ("md_circle_small", '\u{f09df}'), // ó°§Ÿ ("md_circular_saw", '\u{f0e22}'), // 󰸢 ("md_city", '\u{f0146}'), // ó°…† ("md_city_variant", '\u{f0a36}'), // 󰨶 ("md_city_variant_outline", '\u{f0a37}'), // ó°¨· ("md_clipboard", '\u{f0147}'), // ó°…‡ ("md_clipboard_account", '\u{f0148}'), // ó°…ˆ ("md_clipboard_account_outline", '\u{f0c55}'), // 󰱕 ("md_clipboard_alert", '\u{f0149}'), // ó°…‰ ("md_clipboard_alert_outline", '\u{f0cf7}'), // ó°³· ("md_clipboard_arrow_down", '\u{f014a}'), // ó°…Š ("md_clipboard_arrow_down_outline", '\u{f0c56}'), // ó°±– ("md_clipboard_arrow_left", '\u{f014b}'), // ó°…‹ ("md_clipboard_arrow_left_outline", '\u{f0cf8}'), // 󰳸 ("md_clipboard_arrow_right", '\u{f0cf9}'), // ó°³¹ ("md_clipboard_arrow_right_outline", '\u{f0cfa}'), // 󰳺 ("md_clipboard_arrow_up", '\u{f0c57}'), // ó°±— ("md_clipboard_arrow_up_outline", '\u{f0c58}'), // 󰱘 ("md_clipboard_check", '\u{f014e}'), // ó°…Ž ("md_clipboard_check_multiple", '\u{f1263}'), // 󱉣 ("md_clipboard_check_multiple_outline", '\u{f1264}'), // 󱉤 ("md_clipboard_check_outline", '\u{f08a8}'), // 󰢨 ("md_clipboard_clock", '\u{f16e2}'), // 󱛢 ("md_clipboard_clock_outline", '\u{f16e3}'), // 󱛣 ("md_clipboard_edit", '\u{f14e5}'), // 󱓥 ("md_clipboard_edit_outline", '\u{f14e6}'), // 󱓦 ("md_clipboard_file", '\u{f1265}'), // 󱉥 ("md_clipboard_file_outline", '\u{f1266}'), // 󱉦 ("md_clipboard_flow", '\u{f06c8}'), // 󰛈 ("md_clipboard_flow_outline", '\u{f1117}'), // 󱄗 ("md_clipboard_list", '\u{f10d4}'), // 󱃔 ("md_clipboard_list_outline", '\u{f10d5}'), // 󱃕 ("md_clipboard_minus", '\u{f1618}'), // 󱘘 ("md_clipboard_minus_outline", '\u{f1619}'), // 󱘙 ("md_clipboard_multiple", '\u{f1267}'), // 󱉧 ("md_clipboard_multiple_outline", '\u{f1268}'), // 󱉨 ("md_clipboard_off", '\u{f161a}'), // 󱘚 ("md_clipboard_off_outline", '\u{f161b}'), // 󱘛 ("md_clipboard_outline", '\u{f014c}'), // ó°…Œ ("md_clipboard_play", '\u{f0c59}'), // ó°±™ ("md_clipboard_play_multiple", '\u{f1269}'), // 󱉩 ("md_clipboard_play_multiple_outline", '\u{f126a}'), // 󱉪 ("md_clipboard_play_outline", '\u{f0c5a}'), // 󰱚 ("md_clipboard_plus", '\u{f0751}'), // ó°‘ ("md_clipboard_plus_outline", '\u{f131f}'), // 󱌟 ("md_clipboard_pulse", '\u{f085d}'), // ó°¡ ("md_clipboard_pulse_outline", '\u{f085e}'), // ó°¡ž ("md_clipboard_remove", '\u{f161c}'), // 󱘜 ("md_clipboard_remove_outline", '\u{f161d}'), // ó±˜ ("md_clipboard_search", '\u{f161e}'), // 󱘞 ("md_clipboard_search_outline", '\u{f161f}'), // 󱘟 ("md_clipboard_text", '\u{f014d}'), // ó°… ("md_clipboard_text_clock", '\u{f18f9}'), // ó±£¹ ("md_clipboard_text_clock_outline", '\u{f18fa}'), // 󱣺 ("md_clipboard_text_multiple", '\u{f126b}'), // 󱉫 ("md_clipboard_text_multiple_outline", '\u{f126c}'), // 󱉬 ("md_clipboard_text_off", '\u{f1620}'), // 󱘠 ("md_clipboard_text_off_outline", '\u{f1621}'), // 󱘡 ("md_clipboard_text_outline", '\u{f0a38}'), // 󰨸 ("md_clipboard_text_play", '\u{f0c5b}'), // ó°±› ("md_clipboard_text_play_outline", '\u{f0c5c}'), // 󰱜 ("md_clipboard_text_search", '\u{f1622}'), // 󱘢 ("md_clipboard_text_search_outline", '\u{f1623}'), // 󱘣 ("md_clippy", '\u{f014f}'), // ó°… ("md_clock", '\u{f0954}'), // ó°¥” ("md_clock_alert", '\u{f0955}'), // 󰥕 ("md_clock_alert_outline", '\u{f05ce}'), // ó°—Ž ("md_clock_check", '\u{f0fa8}'), // 󰾨 ("md_clock_check_outline", '\u{f0fa9}'), // 󰾩 ("md_clock_digital", '\u{f0e97}'), // ó°º— ("md_clock_edit", '\u{f19ba}'), // 󱦺 ("md_clock_edit_outline", '\u{f19bb}'), // 󱦻 ("md_clock_end", '\u{f0151}'), // ó°…‘ ("md_clock_fast", '\u{f0152}'), // ó°…’ ("md_clock_in", '\u{f0153}'), // ó°…“ ("md_clock_minus", '\u{f1863}'), // 󱡣 ("md_clock_minus_outline", '\u{f1864}'), // 󱡤 ("md_clock_out", '\u{f0154}'), // ó°…” ("md_clock_outline", '\u{f0150}'), // ó°… ("md_clock_plus", '\u{f1861}'), // 󱡡 ("md_clock_plus_outline", '\u{f1862}'), // 󱡢 ("md_clock_remove", '\u{f1865}'), // 󱡥 ("md_clock_remove_outline", '\u{f1866}'), // 󱡦 ("md_clock_start", '\u{f0155}'), // ó°…• ("md_clock_time_eight", '\u{f1446}'), // 󱑆 ("md_clock_time_eight_outline", '\u{f1452}'), // 󱑒 ("md_clock_time_eleven", '\u{f1449}'), // 󱑉 ("md_clock_time_eleven_outline", '\u{f1455}'), // 󱑕 ("md_clock_time_five", '\u{f1443}'), // 󱑃 ("md_clock_time_five_outline", '\u{f144f}'), // ó±‘ ("md_clock_time_four", '\u{f1442}'), // 󱑂 ("md_clock_time_four_outline", '\u{f144e}'), // 󱑎 ("md_clock_time_nine", '\u{f1447}'), // 󱑇 ("md_clock_time_nine_outline", '\u{f1453}'), // 󱑓 ("md_clock_time_one", '\u{f143f}'), // ó±¿ ("md_clock_time_one_outline", '\u{f144b}'), // 󱑋 ("md_clock_time_seven", '\u{f1445}'), // 󱑅 ("md_clock_time_seven_outline", '\u{f1451}'), // 󱑑 ("md_clock_time_six", '\u{f1444}'), // 󱑄 ("md_clock_time_six_outline", '\u{f1450}'), // ó±‘ ("md_clock_time_ten", '\u{f1448}'), // 󱑈 ("md_clock_time_ten_outline", '\u{f1454}'), // 󱑔 ("md_clock_time_three", '\u{f1441}'), // ó±‘ ("md_clock_time_three_outline", '\u{f144d}'), // ó±‘ ("md_clock_time_twelve", '\u{f144a}'), // 󱑊 ("md_clock_time_twelve_outline", '\u{f1456}'), // 󱑖 ("md_clock_time_two", '\u{f1440}'), // 󱑀 ("md_clock_time_two_outline", '\u{f144c}'), // 󱑌 ("md_close", '\u{f0156}'), // ó°…– ("md_close_box", '\u{f0157}'), // ó°…— ("md_close_box_multiple", '\u{f0c5d}'), // ó°± ("md_close_box_multiple_outline", '\u{f0c5e}'), // 󰱞 ("md_close_box_outline", '\u{f0158}'), // ó°…˜ ("md_close_circle", '\u{f0159}'), // ó°…™ ("md_close_circle_multiple", '\u{f062a}'), // 󰘪 ("md_close_circle_multiple_outline", '\u{f0883}'), // 󰢃 ("md_close_circle_outline", '\u{f015a}'), // ó°…š ("md_close_network", '\u{f015b}'), // ó°…› ("md_close_network_outline", '\u{f0c5f}'), // 󰱟 ("md_close_octagon", '\u{f015c}'), // ó°…œ ("md_close_octagon_outline", '\u{f015d}'), // ó°… ("md_close_outline", '\u{f06c9}'), // 󰛉 ("md_close_thick", '\u{f1398}'), // 󱎘 ("md_closed_caption", '\u{f015e}'), // ó°…ž ("md_closed_caption_outline", '\u{f0dbd}'), // ó°¶½ ("md_cloud", '\u{f015f}'), // ó°…Ÿ ("md_cloud_alert", '\u{f09e0}'), // ó°§  ("md_cloud_braces", '\u{f07b5}'), // ó°žµ ("md_cloud_check", '\u{f0160}'), // ó°…  ("md_cloud_check_outline", '\u{f12cc}'), // 󱋌 ("md_cloud_circle", '\u{f0161}'), // ó°…¡ ("md_cloud_download", '\u{f0162}'), // ó°…¢ ("md_cloud_download_outline", '\u{f0b7d}'), // ó°­½ ("md_cloud_lock", '\u{f11f1}'), // 󱇱 ("md_cloud_lock_outline", '\u{f11f2}'), // 󱇲 ("md_cloud_off_outline", '\u{f0164}'), // ó°…¤ ("md_cloud_outline", '\u{f0163}'), // ó°…£ ("md_cloud_percent", '\u{f1a35}'), // 󱨵 ("md_cloud_percent_outline", '\u{f1a36}'), // 󱨶 ("md_cloud_print", '\u{f0165}'), // ó°…¥ ("md_cloud_print_outline", '\u{f0166}'), // ó°…¦ ("md_cloud_question", '\u{f0a39}'), // 󰨹 ("md_cloud_refresh", '\u{f052a}'), // 󰔪 ("md_cloud_search", '\u{f0956}'), // ó°¥– ("md_cloud_search_outline", '\u{f0957}'), // ó°¥— ("md_cloud_sync", '\u{f063f}'), // 󰘿 ("md_cloud_sync_outline", '\u{f12d6}'), // 󱋖 ("md_cloud_tags", '\u{f07b6}'), // ó°ž¶ ("md_cloud_upload", '\u{f0167}'), // ó°…§ ("md_cloud_upload_outline", '\u{f0b7e}'), // ó°­¾ ("md_clover", '\u{f0816}'), // ó° – ("md_coach_lamp", '\u{f1020}'), // ó±€  ("md_coach_lamp_variant", '\u{f1a37}'), // 󱨷 ("md_coat_rack", '\u{f109e}'), // 󱂞 ("md_code_array", '\u{f0168}'), // ó°…¨ ("md_code_braces", '\u{f0169}'), // ó°…© ("md_code_braces_box", '\u{f10d6}'), // 󱃖 ("md_code_brackets", '\u{f016a}'), // ó°…ª ("md_code_equal", '\u{f016b}'), // ó°…« ("md_code_greater_than", '\u{f016c}'), // ó°…¬ ("md_code_greater_than_or_equal", '\u{f016d}'), // ó°…­ ("md_code_json", '\u{f0626}'), // 󰘦 ("md_code_less_than", '\u{f016e}'), // ó°…® ("md_code_less_than_or_equal", '\u{f016f}'), // ó°…¯ ("md_code_not_equal", '\u{f0170}'), // ó°…° ("md_code_not_equal_variant", '\u{f0171}'), // ó°…± ("md_code_parentheses", '\u{f0172}'), // ó°…² ("md_code_parentheses_box", '\u{f10d7}'), // 󱃗 ("md_code_string", '\u{f0173}'), // ó°…³ ("md_code_tags", '\u{f0174}'), // ó°…´ ("md_code_tags_check", '\u{f0694}'), // ó°š” ("md_codepen", '\u{f0175}'), // ó°…µ ("md_coffee", '\u{f0176}'), // ó°…¶ ("md_coffee_maker", '\u{f109f}'), // 󱂟 ("md_coffee_maker_check", '\u{f1931}'), // 󱤱 ("md_coffee_maker_check_outline", '\u{f1932}'), // 󱤲 ("md_coffee_maker_outline", '\u{f181b}'), // ó± › ("md_coffee_off", '\u{f0faa}'), // 󰾪 ("md_coffee_off_outline", '\u{f0fab}'), // 󰾫 ("md_coffee_outline", '\u{f06ca}'), // 󰛊 ("md_coffee_to_go", '\u{f0177}'), // ó°…· ("md_coffee_to_go_outline", '\u{f130e}'), // 󱌎 ("md_coffin", '\u{f0b7f}'), // ó°­¿ ("md_cog", '\u{f0493}'), // ó°’“ ("md_cog_box", '\u{f0494}'), // ó°’” ("md_cog_clockwise", '\u{f11dd}'), // ó±‡ ("md_cog_counterclockwise", '\u{f11de}'), // 󱇞 ("md_cog_off", '\u{f13ce}'), // ó±Ž ("md_cog_off_outline", '\u{f13cf}'), // ó± ("md_cog_outline", '\u{f08bb}'), // ó°¢» ("md_cog_pause", '\u{f1933}'), // 󱤳 ("md_cog_pause_outline", '\u{f1934}'), // 󱤴 ("md_cog_play", '\u{f1935}'), // 󱤵 ("md_cog_play_outline", '\u{f1936}'), // 󱤶 ("md_cog_refresh", '\u{f145e}'), // 󱑞 ("md_cog_refresh_outline", '\u{f145f}'), // 󱑟 ("md_cog_stop", '\u{f1937}'), // 󱤷 ("md_cog_stop_outline", '\u{f1938}'), // 󱤸 ("md_cog_sync", '\u{f1460}'), // 󱑠 ("md_cog_sync_outline", '\u{f1461}'), // 󱑡 ("md_cog_transfer", '\u{f105b}'), // ó±› ("md_cog_transfer_outline", '\u{f105c}'), // ó±œ ("md_cogs", '\u{f08d6}'), // ó°£– ("md_collage", '\u{f0640}'), // 󰙀 ("md_collapse_all", '\u{f0aa6}'), // 󰪦 ("md_collapse_all_outline", '\u{f0aa7}'), // 󰪧 ("md_color_helper", '\u{f0179}'), // ó°…¹ ("md_comma", '\u{f0e23}'), // 󰸣 ("md_comma_box", '\u{f0e2b}'), // 󰸫 ("md_comma_box_outline", '\u{f0e24}'), // 󰸤 ("md_comma_circle", '\u{f0e25}'), // 󰸥 ("md_comma_circle_outline", '\u{f0e26}'), // 󰸦 ("md_comment", '\u{f017a}'), // ó°…º ("md_comment_account", '\u{f017b}'), // ó°…» ("md_comment_account_outline", '\u{f017c}'), // ó°…¼ ("md_comment_alert", '\u{f017d}'), // ó°…½ ("md_comment_alert_outline", '\u{f017e}'), // ó°…¾ ("md_comment_arrow_left", '\u{f09e1}'), // ó°§¡ ("md_comment_arrow_left_outline", '\u{f09e2}'), // ó°§¢ ("md_comment_arrow_right", '\u{f09e3}'), // ó°§£ ("md_comment_arrow_right_outline", '\u{f09e4}'), // 󰧤 ("md_comment_bookmark", '\u{f15ae}'), // ó±–® ("md_comment_bookmark_outline", '\u{f15af}'), // ó±–¯ ("md_comment_check", '\u{f017f}'), // ó°…¿ ("md_comment_check_outline", '\u{f0180}'), // 󰆀 ("md_comment_edit", '\u{f11bf}'), // 󱆿 ("md_comment_edit_outline", '\u{f12c4}'), // 󱋄 ("md_comment_eye", '\u{f0a3a}'), // 󰨺 ("md_comment_eye_outline", '\u{f0a3b}'), // 󰨻 ("md_comment_flash", '\u{f15b0}'), // ó±–° ("md_comment_flash_outline", '\u{f15b1}'), // ó±–± ("md_comment_minus", '\u{f15df}'), // ó±—Ÿ ("md_comment_minus_outline", '\u{f15e0}'), // ó±—  ("md_comment_multiple", '\u{f085f}'), // ó°¡Ÿ ("md_comment_multiple_outline", '\u{f0181}'), // ó°† ("md_comment_off", '\u{f15e1}'), // ó±—¡ ("md_comment_off_outline", '\u{f15e2}'), // ó±—¢ ("md_comment_outline", '\u{f0182}'), // 󰆂 ("md_comment_plus", '\u{f09e5}'), // ó°§¥ ("md_comment_plus_outline", '\u{f0183}'), // 󰆃 ("md_comment_processing", '\u{f0184}'), // 󰆄 ("md_comment_processing_outline", '\u{f0185}'), // ó°†… ("md_comment_question", '\u{f0817}'), // ó° — ("md_comment_question_outline", '\u{f0186}'), // 󰆆 ("md_comment_quote", '\u{f1021}'), // 󱀡 ("md_comment_quote_outline", '\u{f1022}'), // ó±€¢ ("md_comment_remove", '\u{f05de}'), // ó°—ž ("md_comment_remove_outline", '\u{f0187}'), // 󰆇 ("md_comment_search", '\u{f0a3c}'), // 󰨼 ("md_comment_search_outline", '\u{f0a3d}'), // 󰨽 ("md_comment_text", '\u{f0188}'), // 󰆈 ("md_comment_text_multiple", '\u{f0860}'), // ó°¡  ("md_comment_text_multiple_outline", '\u{f0861}'), // ó°¡¡ ("md_comment_text_outline", '\u{f0189}'), // 󰆉 ("md_compare", '\u{f018a}'), // 󰆊 ("md_compare_horizontal", '\u{f1492}'), // ó±’’ ("md_compare_remove", '\u{f18b3}'), // ó±¢³ ("md_compare_vertical", '\u{f1493}'), // ó±’“ ("md_compass", '\u{f018b}'), // 󰆋 ("md_compass_off", '\u{f0b80}'), // 󰮀 ("md_compass_off_outline", '\u{f0b81}'), // ó°® ("md_compass_outline", '\u{f018c}'), // 󰆌 ("md_compass_rose", '\u{f1382}'), // 󱎂 ("md_compost", '\u{f1a38}'), // 󱨸 ("md_cone", '\u{f194c}'), // 󱥌 ("md_cone_off", '\u{f194d}'), // ó±¥ ("md_connection", '\u{f1616}'), // 󱘖 ("md_console", '\u{f018d}'), // ó°† ("md_console_line", '\u{f07b7}'), // ó°ž· ("md_console_network", '\u{f08a9}'), // 󰢩 ("md_console_network_outline", '\u{f0c60}'), // ó°±  ("md_consolidate", '\u{f10d8}'), // 󱃘 ("md_contactless_payment", '\u{f0d6a}'), // 󰵪 ("md_contactless_payment_circle", '\u{f0321}'), // 󰌡 ("md_contactless_payment_circle_outline", '\u{f0408}'), // ó°ˆ ("md_contacts", '\u{f06cb}'), // ó°›‹ ("md_contacts_outline", '\u{f05b8}'), // ó°–¸ ("md_contain", '\u{f0a3e}'), // 󰨾 ("md_contain_end", '\u{f0a3f}'), // 󰨿 ("md_contain_start", '\u{f0a40}'), // ó°©€ ("md_content_copy", '\u{f018f}'), // ó°† ("md_content_cut", '\u{f0190}'), // ó°† ("md_content_duplicate", '\u{f0191}'), // 󰆑 ("md_content_paste", '\u{f0192}'), // ó°†’ ("md_content_save", '\u{f0193}'), // 󰆓 ("md_content_save_alert", '\u{f0f42}'), // 󰽂 ("md_content_save_alert_outline", '\u{f0f43}'), // 󰽃 ("md_content_save_all", '\u{f0194}'), // 󰆔 ("md_content_save_all_outline", '\u{f0f44}'), // 󰽄 ("md_content_save_check", '\u{f18ea}'), // 󱣪 ("md_content_save_check_outline", '\u{f18eb}'), // 󱣫 ("md_content_save_cog", '\u{f145b}'), // 󱑛 ("md_content_save_cog_outline", '\u{f145c}'), // 󱑜 ("md_content_save_edit", '\u{f0cfb}'), // ó°³» ("md_content_save_edit_outline", '\u{f0cfc}'), // ó°³¼ ("md_content_save_move", '\u{f0e27}'), // 󰸧 ("md_content_save_move_outline", '\u{f0e28}'), // 󰸨 ("md_content_save_off", '\u{f1643}'), // 󱙃 ("md_content_save_off_outline", '\u{f1644}'), // 󱙄 ("md_content_save_outline", '\u{f0818}'), // ó° ˜ ("md_content_save_settings", '\u{f061b}'), // 󰘛 ("md_content_save_settings_outline", '\u{f0b2e}'), // 󰬮 ("md_contrast", '\u{f0195}'), // 󰆕 ("md_contrast_box", '\u{f0196}'), // ó°†– ("md_contrast_circle", '\u{f0197}'), // ó°†— ("md_controller_classic", '\u{f0b82}'), // ó°®‚ ("md_controller_classic_outline", '\u{f0b83}'), // 󰮃 ("md_cookie", '\u{f0198}'), // 󰆘 ("md_cookie_alert", '\u{f16d0}'), // ó±› ("md_cookie_alert_outline", '\u{f16d1}'), // 󱛑 ("md_cookie_check", '\u{f16d2}'), // ó±›’ ("md_cookie_check_outline", '\u{f16d3}'), // 󱛓 ("md_cookie_clock", '\u{f16e4}'), // 󱛤 ("md_cookie_clock_outline", '\u{f16e5}'), // 󱛥 ("md_cookie_cog", '\u{f16d4}'), // ó±›” ("md_cookie_cog_outline", '\u{f16d5}'), // 󱛕 ("md_cookie_edit", '\u{f16e6}'), // 󱛦 ("md_cookie_edit_outline", '\u{f16e7}'), // ó±›§ ("md_cookie_lock", '\u{f16e8}'), // 󱛨 ("md_cookie_lock_outline", '\u{f16e9}'), // 󱛩 ("md_cookie_minus", '\u{f16da}'), // 󱛚 ("md_cookie_minus_outline", '\u{f16db}'), // ó±›› ("md_cookie_off", '\u{f16ea}'), // 󱛪 ("md_cookie_off_outline", '\u{f16eb}'), // 󱛫 ("md_cookie_outline", '\u{f16de}'), // 󱛞 ("md_cookie_plus", '\u{f16d6}'), // ó±›– ("md_cookie_plus_outline", '\u{f16d7}'), // ó±›— ("md_cookie_refresh", '\u{f16ec}'), // 󱛬 ("md_cookie_refresh_outline", '\u{f16ed}'), // ó±›­ ("md_cookie_remove", '\u{f16d8}'), // 󱛘 ("md_cookie_remove_outline", '\u{f16d9}'), // ó±›™ ("md_cookie_settings", '\u{f16dc}'), // 󱛜 ("md_cookie_settings_outline", '\u{f16dd}'), // ó±› ("md_coolant_temperature", '\u{f03c8}'), // ó°ˆ ("md_copyleft", '\u{f1939}'), // 󱤹 ("md_copyright", '\u{f05e6}'), // ó°—¦ ("md_cordova", '\u{f0958}'), // 󰥘 ("md_corn", '\u{f07b8}'), // 󰞸 ("md_corn_off", '\u{f13ef}'), // ó±¯ ("md_cosine_wave", '\u{f1479}'), // 󱑹 ("md_counter", '\u{f0199}'), // 󰆙 ("md_countertop", '\u{f181c}'), // ó± œ ("md_countertop_outline", '\u{f181d}'), // ó±  ("md_cow", '\u{f019a}'), // 󰆚 ("md_cow_off", '\u{f18fc}'), // ó±£¼ ("md_cpu_32_bit", '\u{f0edf}'), // 󰻟 ("md_cpu_64_bit", '\u{f0ee0}'), // ó°»  ("md_cradle", '\u{f198b}'), // 󱦋 ("md_cradle_outline", '\u{f1991}'), // 󱦑 ("md_crane", '\u{f0862}'), // ó°¡¢ ("md_creation", '\u{f0674}'), // ó°™´ ("md_creative_commons", '\u{f0d6b}'), // 󰵫 ("md_credit_card", '\u{f0fef}'), // 󰿯 ("md_credit_card_check", '\u{f13d0}'), // ó± ("md_credit_card_check_outline", '\u{f13d1}'), // ó±‘ ("md_credit_card_chip", '\u{f190f}'), // ó±¤ ("md_credit_card_chip_outline", '\u{f1910}'), // ó±¤ ("md_credit_card_clock", '\u{f0ee1}'), // ó°»¡ ("md_credit_card_clock_outline", '\u{f0ee2}'), // 󰻢 ("md_credit_card_edit", '\u{f17d7}'), // 󱟗 ("md_credit_card_edit_outline", '\u{f17d8}'), // 󱟘 ("md_credit_card_fast", '\u{f1911}'), // 󱤑 ("md_credit_card_fast_outline", '\u{f1912}'), // 󱤒 ("md_credit_card_lock", '\u{f18e7}'), // ó±£§ ("md_credit_card_lock_outline", '\u{f18e8}'), // 󱣨 ("md_credit_card_marker", '\u{f06a8}'), // 󰚨 ("md_credit_card_marker_outline", '\u{f0dbe}'), // ó°¶¾ ("md_credit_card_minus", '\u{f0fac}'), // 󰾬 ("md_credit_card_minus_outline", '\u{f0fad}'), // ó°¾­ ("md_credit_card_multiple", '\u{f0ff0}'), // ó°¿° ("md_credit_card_multiple_outline", '\u{f019c}'), // 󰆜 ("md_credit_card_off", '\u{f0ff1}'), // ó°¿± ("md_credit_card_off_outline", '\u{f05e4}'), // ó°—¤ ("md_credit_card_outline", '\u{f019b}'), // 󰆛 ("md_credit_card_plus", '\u{f0ff2}'), // ó°¿² ("md_credit_card_plus_outline", '\u{f0676}'), // ó°™¶ ("md_credit_card_refresh", '\u{f1645}'), // ó±™… ("md_credit_card_refresh_outline", '\u{f1646}'), // 󱙆 ("md_credit_card_refund", '\u{f0ff3}'), // ó°¿³ ("md_credit_card_refund_outline", '\u{f0aa8}'), // 󰪨 ("md_credit_card_remove", '\u{f0fae}'), // ó°¾® ("md_credit_card_remove_outline", '\u{f0faf}'), // 󰾯 ("md_credit_card_scan", '\u{f0ff4}'), // ó°¿´ ("md_credit_card_scan_outline", '\u{f019d}'), // ó°† ("md_credit_card_search", '\u{f1647}'), // 󱙇 ("md_credit_card_search_outline", '\u{f1648}'), // 󱙈 ("md_credit_card_settings", '\u{f0ff5}'), // ó°¿µ ("md_credit_card_settings_outline", '\u{f08d7}'), // ó°£— ("md_credit_card_sync", '\u{f1649}'), // 󱙉 ("md_credit_card_sync_outline", '\u{f164a}'), // 󱙊 ("md_credit_card_wireless", '\u{f0802}'), // ó° ‚ ("md_credit_card_wireless_off", '\u{f057a}'), // 󰕺 ("md_credit_card_wireless_off_outline", '\u{f057b}'), // ó°•» ("md_credit_card_wireless_outline", '\u{f0d6c}'), // 󰵬 ("md_cricket", '\u{f0d6d}'), // ó°µ­ ("md_crop", '\u{f019e}'), // 󰆞 ("md_crop_free", '\u{f019f}'), // 󰆟 ("md_crop_landscape", '\u{f01a0}'), // ó°†  ("md_crop_portrait", '\u{f01a1}'), // 󰆡 ("md_crop_rotate", '\u{f0696}'), // ó°š– ("md_crop_square", '\u{f01a2}'), // 󰆢 ("md_cross", '\u{f0953}'), // 󰥓 ("md_cross_bolnisi", '\u{f0ced}'), // ó°³­ ("md_cross_celtic", '\u{f0cf5}'), // ó°³µ ("md_cross_outline", '\u{f0cf6}'), // ó°³¶ ("md_crosshairs", '\u{f01a3}'), // 󰆣 ("md_crosshairs_gps", '\u{f01a4}'), // 󰆤 ("md_crosshairs_off", '\u{f0f45}'), // ó°½… ("md_crosshairs_question", '\u{f1136}'), // 󱄶 ("md_crowd", '\u{f1975}'), // ó±¥µ ("md_crown", '\u{f01a5}'), // 󰆥 ("md_crown_circle", '\u{f17dc}'), // 󱟜 ("md_crown_circle_outline", '\u{f17dd}'), // ó±Ÿ ("md_crown_outline", '\u{f11d0}'), // ó±‡ ("md_cryengine", '\u{f0959}'), // ó°¥™ ("md_crystal_ball", '\u{f0b2f}'), // 󰬯 ("md_cube", '\u{f01a6}'), // 󰆦 ("md_cube_off", '\u{f141c}'), // ó±œ ("md_cube_off_outline", '\u{f141d}'), // ó± ("md_cube_outline", '\u{f01a7}'), // 󰆧 ("md_cube_scan", '\u{f0b84}'), // ó°®„ ("md_cube_send", '\u{f01a8}'), // 󰆨 ("md_cube_unfolded", '\u{f01a9}'), // 󰆩 ("md_cup", '\u{f01aa}'), // 󰆪 ("md_cup_off", '\u{f05e5}'), // ó°—¥ ("md_cup_off_outline", '\u{f137d}'), // ó±½ ("md_cup_outline", '\u{f130f}'), // ó±Œ ("md_cup_water", '\u{f01ab}'), // 󰆫 ("md_cupboard", '\u{f0f46}'), // 󰽆 ("md_cupboard_outline", '\u{f0f47}'), // 󰽇 ("md_cupcake", '\u{f095a}'), // 󰥚 ("md_curling", '\u{f0863}'), // ó°¡£ ("md_currency_bdt", '\u{f0864}'), // 󰡤 ("md_currency_brl", '\u{f0b85}'), // ó°®… ("md_currency_btc", '\u{f01ac}'), // 󰆬 ("md_currency_cny", '\u{f07ba}'), // 󰞺 ("md_currency_eth", '\u{f07bb}'), // ó°ž» ("md_currency_eur", '\u{f01ad}'), // ó°†­ ("md_currency_eur_off", '\u{f1315}'), // 󱌕 ("md_currency_fra", '\u{f1a39}'), // 󱨹 ("md_currency_gbp", '\u{f01ae}'), // 󰆮 ("md_currency_ils", '\u{f0c61}'), // 󰱡 ("md_currency_inr", '\u{f01af}'), // 󰆯 ("md_currency_jpy", '\u{f07bc}'), // ó°ž¼ ("md_currency_krw", '\u{f07bd}'), // ó°ž½ ("md_currency_kzt", '\u{f0865}'), // ó°¡¥ ("md_currency_mnt", '\u{f1512}'), // ó±”’ ("md_currency_ngn", '\u{f01b0}'), // ó°†° ("md_currency_php", '\u{f09e6}'), // 󰧦 ("md_currency_rial", '\u{f0e9c}'), // 󰺜 ("md_currency_rub", '\u{f01b1}'), // 󰆱 ("md_currency_rupee", '\u{f1976}'), // ó±¥¶ ("md_currency_sign", '\u{f07be}'), // ó°ž¾ ("md_currency_try", '\u{f01b2}'), // 󰆲 ("md_currency_twd", '\u{f07bf}'), // ó°ž¿ ("md_currency_usd", '\u{f01c1}'), // ó°‡ ("md_currency_usd_off", '\u{f067a}'), // 󰙺 ("md_current_ac", '\u{f1480}'), // ó±’€ ("md_current_dc", '\u{f095c}'), // 󰥜 ("md_cursor_default", '\u{f01c0}'), // 󰇀 ("md_cursor_default_click", '\u{f0cfd}'), // ó°³½ ("md_cursor_default_click_outline", '\u{f0cfe}'), // ó°³¾ ("md_cursor_default_gesture", '\u{f1127}'), // 󱄧 ("md_cursor_default_gesture_outline", '\u{f1128}'), // 󱄨 ("md_cursor_default_outline", '\u{f01bf}'), // 󰆿 ("md_cursor_move", '\u{f01be}'), // 󰆾 ("md_cursor_pointer", '\u{f01bd}'), // 󰆽 ("md_cursor_text", '\u{f05e7}'), // ó°—§ ("md_curtains", '\u{f1846}'), // 󱡆 ("md_curtains_closed", '\u{f1847}'), // 󱡇 ("md_cylinder", '\u{f194e}'), // 󱥎 ("md_cylinder_off", '\u{f194f}'), // ó±¥ ("md_dance_ballroom", '\u{f15fb}'), // ó±—» ("md_dance_pole", '\u{f1578}'), // 󱕸 ("md_data_matrix", '\u{f153c}'), // ó±”¼ ("md_data_matrix_edit", '\u{f153d}'), // ó±”½ ("md_data_matrix_minus", '\u{f153e}'), // ó±”¾ ("md_data_matrix_plus", '\u{f153f}'), // 󱔿 ("md_data_matrix_remove", '\u{f1540}'), // 󱕀 ("md_data_matrix_scan", '\u{f1541}'), // ó±• ("md_database", '\u{f01bc}'), // 󰆼 ("md_database_alert", '\u{f163a}'), // 󱘺 ("md_database_alert_outline", '\u{f1624}'), // 󱘤 ("md_database_arrow_down", '\u{f163b}'), // 󱘻 ("md_database_arrow_down_outline", '\u{f1625}'), // 󱘥 ("md_database_arrow_left", '\u{f163c}'), // 󱘼 ("md_database_arrow_left_outline", '\u{f1626}'), // 󱘦 ("md_database_arrow_right", '\u{f163d}'), // 󱘽 ("md_database_arrow_right_outline", '\u{f1627}'), // 󱘧 ("md_database_arrow_up", '\u{f163e}'), // 󱘾 ("md_database_arrow_up_outline", '\u{f1628}'), // 󱘨 ("md_database_check", '\u{f0aa9}'), // 󰪩 ("md_database_check_outline", '\u{f1629}'), // 󱘩 ("md_database_clock", '\u{f163f}'), // 󱘿 ("md_database_clock_outline", '\u{f162a}'), // 󱘪 ("md_database_cog", '\u{f164b}'), // 󱙋 ("md_database_cog_outline", '\u{f164c}'), // 󱙌 ("md_database_edit", '\u{f0b86}'), // 󰮆 ("md_database_edit_outline", '\u{f162b}'), // 󱘫 ("md_database_export", '\u{f095e}'), // 󰥞 ("md_database_export_outline", '\u{f162c}'), // 󱘬 ("md_database_eye", '\u{f191f}'), // 󱤟 ("md_database_eye_off", '\u{f1920}'), // 󱤠 ("md_database_eye_off_outline", '\u{f1921}'), // 󱤡 ("md_database_eye_outline", '\u{f1922}'), // 󱤢 ("md_database_import", '\u{f095d}'), // ó°¥ ("md_database_import_outline", '\u{f162d}'), // 󱘭 ("md_database_lock", '\u{f0aaa}'), // 󰪪 ("md_database_lock_outline", '\u{f162e}'), // 󱘮 ("md_database_marker", '\u{f12f6}'), // 󱋶 ("md_database_marker_outline", '\u{f162f}'), // 󱘯 ("md_database_minus", '\u{f01bb}'), // 󰆻 ("md_database_minus_outline", '\u{f1630}'), // 󱘰 ("md_database_off", '\u{f1640}'), // 󱙀 ("md_database_off_outline", '\u{f1631}'), // 󱘱 ("md_database_outline", '\u{f1632}'), // 󱘲 ("md_database_plus", '\u{f01ba}'), // 󰆺 ("md_database_plus_outline", '\u{f1633}'), // 󱘳 ("md_database_refresh", '\u{f05c2}'), // ó°—‚ ("md_database_refresh_outline", '\u{f1634}'), // 󱘴 ("md_database_remove", '\u{f0d00}'), // ó°´€ ("md_database_remove_outline", '\u{f1635}'), // 󱘵 ("md_database_search", '\u{f0866}'), // 󰡦 ("md_database_search_outline", '\u{f1636}'), // 󱘶 ("md_database_settings", '\u{f0d01}'), // ó°´ ("md_database_settings_outline", '\u{f1637}'), // 󱘷 ("md_database_sync", '\u{f0cff}'), // 󰳿 ("md_database_sync_outline", '\u{f1638}'), // 󱘸 ("md_death_star", '\u{f08d8}'), // 󰣘 ("md_death_star_variant", '\u{f08d9}'), // ó°£™ ("md_deathly_hallows", '\u{f0b87}'), // 󰮇 ("md_debian", '\u{f08da}'), // 󰣚 ("md_debug_step_into", '\u{f01b9}'), // 󰆹 ("md_debug_step_out", '\u{f01b8}'), // 󰆸 ("md_debug_step_over", '\u{f01b7}'), // ó°†· ("md_decagram", '\u{f076c}'), // ó°¬ ("md_decagram_outline", '\u{f076d}'), // ó°­ ("md_decimal", '\u{f10a1}'), // 󱂡 ("md_decimal_comma", '\u{f10a2}'), // 󱂢 ("md_decimal_comma_decrease", '\u{f10a3}'), // 󱂣 ("md_decimal_comma_increase", '\u{f10a4}'), // 󱂤 ("md_decimal_decrease", '\u{f01b6}'), // 󰆶 ("md_decimal_increase", '\u{f01b5}'), // 󰆵 ("md_delete", '\u{f01b4}'), // ó°†´ ("md_delete_alert", '\u{f10a5}'), // 󱂥 ("md_delete_alert_outline", '\u{f10a6}'), // 󱂦 ("md_delete_circle", '\u{f0683}'), // 󰚃 ("md_delete_circle_outline", '\u{f0b88}'), // 󰮈 ("md_delete_clock", '\u{f1556}'), // 󱕖 ("md_delete_clock_outline", '\u{f1557}'), // 󱕗 ("md_delete_empty", '\u{f06cc}'), // 󰛌 ("md_delete_empty_outline", '\u{f0e9d}'), // ó°º ("md_delete_forever", '\u{f05e8}'), // ó°—¨ ("md_delete_forever_outline", '\u{f0b89}'), // 󰮉 ("md_delete_off", '\u{f10a7}'), // 󱂧 ("md_delete_off_outline", '\u{f10a8}'), // 󱂨 ("md_delete_outline", '\u{f09e7}'), // ó°§§ ("md_delete_restore", '\u{f0819}'), // ó° ™ ("md_delete_sweep", '\u{f05e9}'), // ó°—© ("md_delete_sweep_outline", '\u{f0c62}'), // ó°±¢ ("md_delete_variant", '\u{f01b3}'), // 󰆳 ("md_delta", '\u{f01c2}'), // 󰇂 ("md_desk", '\u{f1239}'), // 󱈹 ("md_desk_lamp", '\u{f095f}'), // 󰥟 ("md_deskphone", '\u{f01c3}'), // 󰇃 ("md_desktop_classic", '\u{f07c0}'), // ó°Ÿ€ ("md_desktop_mac", '\u{f01c4}'), // 󰇄 ("md_desktop_mac_dashboard", '\u{f09e8}'), // 󰧨 ("md_desktop_tower", '\u{f01c5}'), // ó°‡… ("md_desktop_tower_monitor", '\u{f0aab}'), // 󰪫 ("md_details", '\u{f01c6}'), // 󰇆 ("md_dev_to", '\u{f0d6e}'), // ó°µ® ("md_developer_board", '\u{f0697}'), // ó°š— ("md_deviantart", '\u{f01c7}'), // 󰇇 ("md_devices", '\u{f0fb0}'), // ó°¾° ("md_dharmachakra", '\u{f094b}'), // 󰥋 ("md_diabetes", '\u{f1126}'), // 󱄦 ("md_dialpad", '\u{f061c}'), // 󰘜 ("md_diameter", '\u{f0c63}'), // ó°±£ ("md_diameter_outline", '\u{f0c64}'), // 󰱤 ("md_diameter_variant", '\u{f0c65}'), // ó°±¥ ("md_diamond", '\u{f0b8a}'), // 󰮊 ("md_diamond_outline", '\u{f0b8b}'), // ó°®‹ ("md_diamond_stone", '\u{f01c8}'), // 󰇈 ("md_dice_1", '\u{f01ca}'), // 󰇊 ("md_dice_1_outline", '\u{f114a}'), // ó±…Š ("md_dice_2", '\u{f01cb}'), // 󰇋 ("md_dice_2_outline", '\u{f114b}'), // ó±…‹ ("md_dice_3", '\u{f01cc}'), // 󰇌 ("md_dice_3_outline", '\u{f114c}'), // ó±…Œ ("md_dice_4", '\u{f01cd}'), // ó°‡ ("md_dice_4_outline", '\u{f114d}'), // ó±… ("md_dice_5", '\u{f01ce}'), // 󰇎 ("md_dice_5_outline", '\u{f114e}'), // ó±…Ž ("md_dice_6", '\u{f01cf}'), // ó°‡ ("md_dice_6_outline", '\u{f114f}'), // ó±… ("md_dice_d4", '\u{f1150}'), // ó±… ("md_dice_d4_outline", '\u{f05eb}'), // ó°—« ("md_dice_d6", '\u{f1151}'), // ó±…‘ ("md_dice_d6_outline", '\u{f05ed}'), // ó°—­ ("md_dice_d8", '\u{f1152}'), // ó±…’ ("md_dice_d8_outline", '\u{f05ec}'), // ó°—¬ ("md_dice_d10", '\u{f1153}'), // ó±…“ ("md_dice_d10_outline", '\u{f076f}'), // ó°¯ ("md_dice_d12", '\u{f1154}'), // ó±…” ("md_dice_d12_outline", '\u{f0867}'), // ó°¡§ ("md_dice_d20", '\u{f1155}'), // ó±…• ("md_dice_d20_outline", '\u{f05ea}'), // ó°—ª ("md_dice_multiple", '\u{f076e}'), // ó°® ("md_dice_multiple_outline", '\u{f1156}'), // ó±…– ("md_digital_ocean", '\u{f1237}'), // 󱈷 ("md_dip_switch", '\u{f07c1}'), // ó°Ÿ ("md_directions", '\u{f01d0}'), // ó°‡ ("md_directions_fork", '\u{f0641}'), // ó°™ ("md_disc", '\u{f05ee}'), // ó°—® ("md_disc_alert", '\u{f01d1}'), // 󰇑 ("md_disc_player", '\u{f0960}'), // ó°¥  ("md_discord", '\u{f066f}'), // 󰙯 ("md_dishwasher", '\u{f0aac}'), // 󰪬 ("md_dishwasher_alert", '\u{f11b8}'), // 󱆸 ("md_dishwasher_off", '\u{f11b9}'), // 󱆹 ("md_disqus", '\u{f01d2}'), // ó°‡’ ("md_distribute_horizontal_center", '\u{f11c9}'), // 󱇉 ("md_distribute_horizontal_left", '\u{f11c8}'), // 󱇈 ("md_distribute_horizontal_right", '\u{f11ca}'), // 󱇊 ("md_distribute_vertical_bottom", '\u{f11cb}'), // 󱇋 ("md_distribute_vertical_center", '\u{f11cc}'), // 󱇌 ("md_distribute_vertical_top", '\u{f11cd}'), // ó±‡ ("md_diversify", '\u{f1877}'), // 󱡷 ("md_diving", '\u{f1977}'), // ó±¥· ("md_diving_flippers", '\u{f0dbf}'), // ó°¶¿ ("md_diving_helmet", '\u{f0dc0}'), // ó°·€ ("md_diving_scuba", '\u{f0dc1}'), // ó°· ("md_diving_scuba_flag", '\u{f0dc2}'), // ó°·‚ ("md_diving_scuba_tank", '\u{f0dc3}'), // ó°·ƒ ("md_diving_scuba_tank_multiple", '\u{f0dc4}'), // ó°·„ ("md_diving_snorkel", '\u{f0dc5}'), // ó°·… ("md_division", '\u{f01d4}'), // 󰇔 ("md_division_box", '\u{f01d5}'), // 󰇕 ("md_dlna", '\u{f0a41}'), // ó°© ("md_dna", '\u{f0684}'), // ó°š„ ("md_dns", '\u{f01d6}'), // ó°‡– ("md_dns_outline", '\u{f0b8c}'), // 󰮌 ("md_dock_bottom", '\u{f10a9}'), // 󱂩 ("md_dock_left", '\u{f10aa}'), // 󱂪 ("md_dock_right", '\u{f10ab}'), // 󱂫 ("md_dock_top", '\u{f1513}'), // 󱔓 ("md_dock_window", '\u{f10ac}'), // 󱂬 ("md_docker", '\u{f0868}'), // 󰡨 ("md_doctor", '\u{f0a42}'), // ó°©‚ ("md_dog", '\u{f0a43}'), // 󰩃 ("md_dog_service", '\u{f0aad}'), // ó°ª­ ("md_dog_side", '\u{f0a44}'), // ó°©„ ("md_dog_side_off", '\u{f16ee}'), // ó±›® ("md_dolby", '\u{f06b3}'), // ó°š³ ("md_dolly", '\u{f0e9e}'), // 󰺞 ("md_dolphin", '\u{f18b4}'), // ó±¢´ ("md_domain", '\u{f01d7}'), // ó°‡— ("md_domain_off", '\u{f0d6f}'), // 󰵯 ("md_domain_plus", '\u{f10ad}'), // 󱂭 ("md_domain_remove", '\u{f10ae}'), // 󱂮 ("md_dome_light", '\u{f141e}'), // ó±ž ("md_domino_mask", '\u{f1023}'), // ó±€£ ("md_donkey", '\u{f07c2}'), // ó°Ÿ‚ ("md_door", '\u{f081a}'), // ó° š ("md_door_closed", '\u{f081b}'), // ó° › ("md_door_closed_lock", '\u{f10af}'), // 󱂯 ("md_door_open", '\u{f081c}'), // ó° œ ("md_door_sliding", '\u{f181e}'), // ó± ž ("md_door_sliding_lock", '\u{f181f}'), // ó± Ÿ ("md_door_sliding_open", '\u{f1820}'), // ó±   ("md_doorbell", '\u{f12e6}'), // 󱋦 ("md_doorbell_video", '\u{f0869}'), // ó°¡© ("md_dot_net", '\u{f0aae}'), // 󰪮 ("md_dots_circle", '\u{f1978}'), // 󱥸 ("md_dots_grid", '\u{f15fc}'), // ó±—¼ ("md_dots_hexagon", '\u{f15ff}'), // ó±—¿ ("md_dots_horizontal", '\u{f01d8}'), // 󰇘 ("md_dots_horizontal_circle", '\u{f07c3}'), // 󰟃 ("md_dots_horizontal_circle_outline", '\u{f0b8d}'), // ó°® ("md_dots_square", '\u{f15fd}'), // ó±—½ ("md_dots_triangle", '\u{f15fe}'), // ó±—¾ ("md_dots_vertical", '\u{f01d9}'), // 󰇙 ("md_dots_vertical_circle", '\u{f07c4}'), // ó°Ÿ„ ("md_dots_vertical_circle_outline", '\u{f0b8e}'), // 󰮎 ("md_download", '\u{f01da}'), // 󰇚 ("md_download_box", '\u{f1462}'), // 󱑢 ("md_download_box_outline", '\u{f1463}'), // 󱑣 ("md_download_circle", '\u{f1464}'), // 󱑤 ("md_download_circle_outline", '\u{f1465}'), // 󱑥 ("md_download_lock", '\u{f1320}'), // 󱌠 ("md_download_lock_outline", '\u{f1321}'), // 󱌡 ("md_download_multiple", '\u{f09e9}'), // ó°§© ("md_download_network", '\u{f06f4}'), // ó°›´ ("md_download_network_outline", '\u{f0c66}'), // 󰱦 ("md_download_off", '\u{f10b0}'), // 󱂰 ("md_download_off_outline", '\u{f10b1}'), // 󱂱 ("md_download_outline", '\u{f0b8f}'), // ó°® ("md_drag", '\u{f01db}'), // 󰇛 ("md_drag_horizontal", '\u{f01dc}'), // 󰇜 ("md_drag_horizontal_variant", '\u{f12f0}'), // 󱋰 ("md_drag_variant", '\u{f0b90}'), // ó°® ("md_drag_vertical", '\u{f01dd}'), // ó°‡ ("md_drag_vertical_variant", '\u{f12f1}'), // 󱋱 ("md_drama_masks", '\u{f0d02}'), // ó°´‚ ("md_draw", '\u{f0f49}'), // 󰽉 ("md_draw_pen", '\u{f19b9}'), // 󱦹 ("md_drawing", '\u{f01de}'), // 󰇞 ("md_drawing_box", '\u{f01df}'), // 󰇟 ("md_dresser", '\u{f0f4a}'), // 󰽊 ("md_dresser_outline", '\u{f0f4b}'), // 󰽋 ("md_drone", '\u{f01e2}'), // 󰇢 ("md_dropbox", '\u{f01e3}'), // 󰇣 ("md_drupal", '\u{f01e4}'), // 󰇤 ("md_duck", '\u{f01e5}'), // 󰇥 ("md_dumbbell", '\u{f01e6}'), // 󰇦 ("md_dump_truck", '\u{f0c67}'), // ó°±§ ("md_ear_hearing", '\u{f07c5}'), // ó°Ÿ… ("md_ear_hearing_loop", '\u{f1aee}'), // 󱫮 ("md_ear_hearing_off", '\u{f0a45}'), // ó°©… ("md_earbuds", '\u{f184f}'), // ó±¡ ("md_earbuds_off", '\u{f1850}'), // ó±¡ ("md_earbuds_off_outline", '\u{f1851}'), // 󱡑 ("md_earbuds_outline", '\u{f1852}'), // 󱡒 ("md_earth", '\u{f01e7}'), // 󰇧 ("md_earth_arrow_right", '\u{f1311}'), // 󱌑 ("md_earth_box", '\u{f06cd}'), // ó°› ("md_earth_box_minus", '\u{f1407}'), // ó±‡ ("md_earth_box_off", '\u{f06ce}'), // 󰛎 ("md_earth_box_plus", '\u{f1406}'), // ó±† ("md_earth_box_remove", '\u{f1408}'), // ó±ˆ ("md_earth_minus", '\u{f1404}'), // ó±„ ("md_earth_off", '\u{f01e8}'), // 󰇨 ("md_earth_plus", '\u{f1403}'), // ó±ƒ ("md_earth_remove", '\u{f1405}'), // ó±… ("md_egg", '\u{f0aaf}'), // 󰪯 ("md_egg_easter", '\u{f0ab0}'), // ó°ª° ("md_egg_fried", '\u{f184a}'), // 󱡊 ("md_egg_off", '\u{f13f0}'), // ó±° ("md_egg_off_outline", '\u{f13f1}'), // ó±± ("md_egg_outline", '\u{f13f2}'), // ó±² ("md_eiffel_tower", '\u{f156b}'), // 󱕫 ("md_eight_track", '\u{f09ea}'), // 󰧪 ("md_eject", '\u{f01ea}'), // 󰇪 ("md_eject_outline", '\u{f0b91}'), // ó°®‘ ("md_electric_switch", '\u{f0e9f}'), // 󰺟 ("md_electric_switch_closed", '\u{f10d9}'), // 󱃙 ("md_electron_framework", '\u{f1024}'), // 󱀤 ("md_elephant", '\u{f07c6}'), // 󰟆 ("md_elevation_decline", '\u{f01eb}'), // 󰇫 ("md_elevation_rise", '\u{f01ec}'), // 󰇬 ("md_elevator", '\u{f01ed}'), // ó°‡­ ("md_elevator_down", '\u{f12c2}'), // 󱋂 ("md_elevator_passenger", '\u{f1381}'), // ó±Ž ("md_elevator_passenger_off", '\u{f1979}'), // ó±¥¹ ("md_elevator_passenger_off_outline", '\u{f197a}'), // 󱥺 ("md_elevator_passenger_outline", '\u{f197b}'), // ó±¥» ("md_elevator_up", '\u{f12c1}'), // ó±‹ ("md_ellipse", '\u{f0ea0}'), // ó°º  ("md_ellipse_outline", '\u{f0ea1}'), // 󰺡 ("md_email", '\u{f01ee}'), // 󰇮 ("md_email_alert", '\u{f06cf}'), // ó°› ("md_email_alert_outline", '\u{f0d42}'), // 󰵂 ("md_email_box", '\u{f0d03}'), // ó°´ƒ ("md_email_check", '\u{f0ab1}'), // 󰪱 ("md_email_check_outline", '\u{f0ab2}'), // 󰪲 ("md_email_edit", '\u{f0ee3}'), // 󰻣 ("md_email_edit_outline", '\u{f0ee4}'), // 󰻤 ("md_email_fast", '\u{f186f}'), // 󱡯 ("md_email_fast_outline", '\u{f1870}'), // 󱡰 ("md_email_lock", '\u{f01f1}'), // 󰇱 ("md_email_mark_as_unread", '\u{f0b92}'), // ó°®’ ("md_email_minus", '\u{f0ee5}'), // 󰻥 ("md_email_minus_outline", '\u{f0ee6}'), // 󰻦 ("md_email_multiple", '\u{f0ee7}'), // ó°»§ ("md_email_multiple_outline", '\u{f0ee8}'), // 󰻨 ("md_email_newsletter", '\u{f0fb1}'), // ó°¾± ("md_email_off", '\u{f13e3}'), // ó±£ ("md_email_off_outline", '\u{f13e4}'), // ó±¤ ("md_email_open", '\u{f01ef}'), // 󰇯 ("md_email_open_multiple", '\u{f0ee9}'), // ó°»© ("md_email_open_multiple_outline", '\u{f0eea}'), // 󰻪 ("md_email_open_outline", '\u{f05ef}'), // ó°—¯ ("md_email_outline", '\u{f01f0}'), // ó°‡° ("md_email_plus", '\u{f09eb}'), // ó°§« ("md_email_plus_outline", '\u{f09ec}'), // 󰧬 ("md_email_receive", '\u{f10da}'), // 󱃚 ("md_email_receive_outline", '\u{f10db}'), // 󱃛 ("md_email_remove", '\u{f1661}'), // 󱙡 ("md_email_remove_outline", '\u{f1662}'), // 󱙢 ("md_email_seal", '\u{f195b}'), // ó±¥› ("md_email_seal_outline", '\u{f195c}'), // 󱥜 ("md_email_search", '\u{f0961}'), // 󰥡 ("md_email_search_outline", '\u{f0962}'), // ó°¥¢ ("md_email_send", '\u{f10dc}'), // 󱃜 ("md_email_send_outline", '\u{f10dd}'), // ó±ƒ ("md_email_sync", '\u{f12c7}'), // 󱋇 ("md_email_sync_outline", '\u{f12c8}'), // 󱋈 ("md_email_variant", '\u{f05f0}'), // ó°—° ("md_ember", '\u{f0b30}'), // ó°¬° ("md_emby", '\u{f06b4}'), // ó°š´ ("md_emoticon", '\u{f0c68}'), // 󰱨 ("md_emoticon_angry", '\u{f0c69}'), // 󰱩 ("md_emoticon_angry_outline", '\u{f0c6a}'), // 󰱪 ("md_emoticon_confused", '\u{f10de}'), // 󱃞 ("md_emoticon_confused_outline", '\u{f10df}'), // 󱃟 ("md_emoticon_cool", '\u{f0c6b}'), // 󰱫 ("md_emoticon_cool_outline", '\u{f01f3}'), // 󰇳 ("md_emoticon_cry", '\u{f0c6c}'), // 󰱬 ("md_emoticon_cry_outline", '\u{f0c6d}'), // ó°±­ ("md_emoticon_dead", '\u{f0c6e}'), // ó°±® ("md_emoticon_dead_outline", '\u{f069b}'), // ó°š› ("md_emoticon_devil", '\u{f0c6f}'), // 󰱯 ("md_emoticon_devil_outline", '\u{f01f4}'), // ó°‡´ ("md_emoticon_excited", '\u{f0c70}'), // ó°±° ("md_emoticon_excited_outline", '\u{f069c}'), // ó°šœ ("md_emoticon_frown", '\u{f0f4c}'), // 󰽌 ("md_emoticon_frown_outline", '\u{f0f4d}'), // ó°½ ("md_emoticon_happy", '\u{f0c71}'), // ó°±± ("md_emoticon_happy_outline", '\u{f01f5}'), // 󰇵 ("md_emoticon_kiss", '\u{f0c72}'), // ó°±² ("md_emoticon_kiss_outline", '\u{f0c73}'), // ó°±³ ("md_emoticon_lol", '\u{f1214}'), // 󱈔 ("md_emoticon_lol_outline", '\u{f1215}'), // 󱈕 ("md_emoticon_neutral", '\u{f0c74}'), // ó°±´ ("md_emoticon_neutral_outline", '\u{f01f6}'), // 󰇶 ("md_emoticon_outline", '\u{f01f2}'), // 󰇲 ("md_emoticon_poop", '\u{f01f7}'), // ó°‡· ("md_emoticon_poop_outline", '\u{f0c75}'), // ó°±µ ("md_emoticon_sad", '\u{f0c76}'), // ó°±¶ ("md_emoticon_sad_outline", '\u{f01f8}'), // 󰇸 ("md_emoticon_sick", '\u{f157c}'), // 󱕼 ("md_emoticon_sick_outline", '\u{f157d}'), // 󱕽 ("md_emoticon_tongue", '\u{f01f9}'), // 󰇹 ("md_emoticon_tongue_outline", '\u{f0c77}'), // ó°±· ("md_emoticon_wink", '\u{f0c78}'), // 󰱸 ("md_emoticon_wink_outline", '\u{f0c79}'), // ó°±¹ ("md_engine", '\u{f01fa}'), // 󰇺 ("md_engine_off", '\u{f0a46}'), // 󰩆 ("md_engine_off_outline", '\u{f0a47}'), // 󰩇 ("md_engine_outline", '\u{f01fb}'), // 󰇻 ("md_epsilon", '\u{f10e0}'), // 󱃠 ("md_equal", '\u{f01fc}'), // 󰇼 ("md_equal_box", '\u{f01fd}'), // 󰇽 ("md_equalizer", '\u{f0ea2}'), // 󰺢 ("md_equalizer_outline", '\u{f0ea3}'), // 󰺣 ("md_eraser", '\u{f01fe}'), // 󰇾 ("md_eraser_variant", '\u{f0642}'), // ó°™‚ ("md_escalator", '\u{f01ff}'), // 󰇿 ("md_escalator_box", '\u{f1399}'), // 󱎙 ("md_escalator_down", '\u{f12c0}'), // 󱋀 ("md_escalator_up", '\u{f12bf}'), // 󱊿 ("md_eslint", '\u{f0c7a}'), // 󰱺 ("md_et", '\u{f0ab3}'), // 󰪳 ("md_ethereum", '\u{f086a}'), // 󰡪 ("md_ethernet", '\u{f0200}'), // 󰈀 ("md_ethernet_cable", '\u{f0201}'), // ó°ˆ ("md_ethernet_cable_off", '\u{f0202}'), // 󰈂 ("md_ev_plug_ccs1", '\u{f1519}'), // ó±”™ ("md_ev_plug_ccs2", '\u{f151a}'), // 󱔚 ("md_ev_plug_chademo", '\u{f151b}'), // ó±”› ("md_ev_plug_tesla", '\u{f151c}'), // 󱔜 ("md_ev_plug_type1", '\u{f151d}'), // ó±” ("md_ev_plug_type2", '\u{f151e}'), // 󱔞 ("md_ev_station", '\u{f05f1}'), // ó°—± ("md_evernote", '\u{f0204}'), // 󰈄 ("md_excavator", '\u{f1025}'), // ó±€¥ ("md_exclamation", '\u{f0205}'), // ó°ˆ… ("md_exclamation_thick", '\u{f1238}'), // 󱈸 ("md_exit_run", '\u{f0a48}'), // 󰩈 ("md_exit_to_app", '\u{f05fc}'), // ó°—¼ ("md_exit_to_app", '\u{f05fc}'), // ó°—¼ ("md_expand_all", '\u{f0ab4}'), // ó°ª´ ("md_expand_all_outline", '\u{f0ab5}'), // 󰪵 ("md_expansion_card", '\u{f08ae}'), // ó°¢® ("md_expansion_card_variant", '\u{f0fb2}'), // ó°¾² ("md_exponent", '\u{f0963}'), // ó°¥£ ("md_exponent_box", '\u{f0964}'), // 󰥤 ("md_export", '\u{f0207}'), // 󰈇 ("md_export_variant", '\u{f0b93}'), // ó°®“ ("md_eye", '\u{f0208}'), // 󰈈 ("md_eye_arrow_left", '\u{f18fd}'), // ó±£½ ("md_eye_arrow_left_outline", '\u{f18fe}'), // ó±£¾ ("md_eye_arrow_right", '\u{f18ff}'), // 󱣿 ("md_eye_arrow_right_outline", '\u{f1900}'), // 󱤀 ("md_eye_check", '\u{f0d04}'), // ó°´„ ("md_eye_check_outline", '\u{f0d05}'), // ó°´… ("md_eye_circle", '\u{f0b94}'), // ó°®” ("md_eye_circle_outline", '\u{f0b95}'), // ó°®• ("md_eye_minus", '\u{f1026}'), // 󱀦 ("md_eye_minus_outline", '\u{f1027}'), // ó±€§ ("md_eye_off", '\u{f0209}'), // 󰈉 ("md_eye_off_outline", '\u{f06d1}'), // ó°›‘ ("md_eye_outline", '\u{f06d0}'), // ó°› ("md_eye_plus", '\u{f086b}'), // ó°¡« ("md_eye_plus_outline", '\u{f086c}'), // 󰡬 ("md_eye_refresh", '\u{f197c}'), // ó±¥¼ ("md_eye_refresh_outline", '\u{f197d}'), // ó±¥½ ("md_eye_remove", '\u{f15e3}'), // ó±—£ ("md_eye_remove_outline", '\u{f15e4}'), // ó±—¤ ("md_eye_settings", '\u{f086d}'), // ó°¡­ ("md_eye_settings_outline", '\u{f086e}'), // ó°¡® ("md_eyedropper", '\u{f020a}'), // 󰈊 ("md_eyedropper_minus", '\u{f13dd}'), // ó± ("md_eyedropper_off", '\u{f13df}'), // ó±Ÿ ("md_eyedropper_plus", '\u{f13dc}'), // ó±œ ("md_eyedropper_remove", '\u{f13de}'), // ó±ž ("md_eyedropper_variant", '\u{f020b}'), // 󰈋 ("md_face_agent", '\u{f0d70}'), // ó°µ° ("md_face_man", '\u{f0643}'), // 󰙃 ("md_face_man_outline", '\u{f0b96}'), // ó°®– ("md_face_man_profile", '\u{f0644}'), // ó°™„ ("md_face_man_shimmer", '\u{f15cc}'), // ó±—Œ ("md_face_man_shimmer_outline", '\u{f15cd}'), // ó±— ("md_face_mask", '\u{f1586}'), // ó±–† ("md_face_mask_outline", '\u{f1587}'), // ó±–‡ ("md_face_recognition", '\u{f0c7b}'), // ó°±» ("md_face_woman", '\u{f1077}'), // ó±· ("md_face_woman_outline", '\u{f1078}'), // ó±¸ ("md_face_woman_profile", '\u{f1076}'), // ó±¶ ("md_face_woman_shimmer", '\u{f15ce}'), // ó±—Ž ("md_face_woman_shimmer_outline", '\u{f15cf}'), // ó±— ("md_facebook", '\u{f020c}'), // 󰈌 ("md_facebook_gaming", '\u{f07dd}'), // ó°Ÿ ("md_facebook_messenger", '\u{f020e}'), // 󰈎 ("md_facebook_workplace", '\u{f0b31}'), // 󰬱 ("md_factory", '\u{f020f}'), // ó°ˆ ("md_family_tree", '\u{f160e}'), // 󱘎 ("md_fan", '\u{f0210}'), // ó°ˆ ("md_fan_alert", '\u{f146c}'), // 󱑬 ("md_fan_auto", '\u{f171d}'), // ó±œ ("md_fan_chevron_down", '\u{f146d}'), // 󱑭 ("md_fan_chevron_up", '\u{f146e}'), // 󱑮 ("md_fan_clock", '\u{f1a3a}'), // 󱨺 ("md_fan_minus", '\u{f1470}'), // 󱑰 ("md_fan_off", '\u{f081d}'), // ó°  ("md_fan_plus", '\u{f146f}'), // 󱑯 ("md_fan_remove", '\u{f1471}'), // 󱑱 ("md_fan_speed_1", '\u{f1472}'), // 󱑲 ("md_fan_speed_2", '\u{f1473}'), // 󱑳 ("md_fan_speed_3", '\u{f1474}'), // 󱑴 ("md_fast_forward", '\u{f0211}'), // 󰈑 ("md_fast_forward_5", '\u{f11f8}'), // 󱇸 ("md_fast_forward_10", '\u{f0d71}'), // ó°µ± ("md_fast_forward_15", '\u{f193a}'), // 󱤺 ("md_fast_forward_30", '\u{f0d06}'), // ó°´† ("md_fast_forward_60", '\u{f160b}'), // 󱘋 ("md_fast_forward_outline", '\u{f06d2}'), // ó°›’ ("md_fax", '\u{f0212}'), // ó°ˆ’ ("md_feather", '\u{f06d3}'), // ó°›“ ("md_feature_search", '\u{f0a49}'), // 󰩉 ("md_feature_search_outline", '\u{f0a4a}'), // ó°©Š ("md_fedora", '\u{f08db}'), // ó°£› ("md_fence", '\u{f179a}'), // 󱞚 ("md_fence_electric", '\u{f17f6}'), // 󱟶 ("md_fencing", '\u{f14c1}'), // ó±“ ("md_ferris_wheel", '\u{f0ea4}'), // 󰺤 ("md_ferry", '\u{f0213}'), // 󰈓 ("md_file", '\u{f0214}'), // 󰈔 ("md_file_account", '\u{f073b}'), // 󰜻 ("md_file_account_outline", '\u{f1028}'), // 󱀨 ("md_file_alert", '\u{f0a4b}'), // ó°©‹ ("md_file_alert_outline", '\u{f0a4c}'), // ó°©Œ ("md_file_arrow_left_right", '\u{f1a93}'), // 󱪓 ("md_file_arrow_left_right_outline", '\u{f1a94}'), // 󱪔 ("md_file_arrow_up_down", '\u{f1a95}'), // 󱪕 ("md_file_arrow_up_down_outline", '\u{f1a96}'), // 󱪖 ("md_file_cabinet", '\u{f0ab6}'), // 󰪶 ("md_file_cad", '\u{f0eeb}'), // ó°»« ("md_file_cad_box", '\u{f0eec}'), // 󰻬 ("md_file_cancel", '\u{f0dc6}'), // ó°·† ("md_file_cancel_outline", '\u{f0dc7}'), // ó°·‡ ("md_file_certificate", '\u{f1186}'), // 󱆆 ("md_file_certificate_outline", '\u{f1187}'), // 󱆇 ("md_file_chart", '\u{f0215}'), // 󰈕 ("md_file_chart_check", '\u{f19c6}'), // 󱧆 ("md_file_chart_check_outline", '\u{f19c7}'), // 󱧇 ("md_file_chart_outline", '\u{f1029}'), // 󱀩 ("md_file_check", '\u{f0216}'), // ó°ˆ– ("md_file_check_outline", '\u{f0e29}'), // 󰸩 ("md_file_clock", '\u{f12e1}'), // 󱋡 ("md_file_clock_outline", '\u{f12e2}'), // 󱋢 ("md_file_cloud", '\u{f0217}'), // ó°ˆ— ("md_file_cloud_outline", '\u{f102a}'), // 󱀪 ("md_file_code", '\u{f022e}'), // 󰈮 ("md_file_code_outline", '\u{f102b}'), // 󱀫 ("md_file_cog", '\u{f107b}'), // ó±» ("md_file_cog_outline", '\u{f107c}'), // ó±¼ ("md_file_compare", '\u{f08aa}'), // 󰢪 ("md_file_delimited", '\u{f0218}'), // 󰈘 ("md_file_delimited_outline", '\u{f0ea5}'), // 󰺥 ("md_file_document", '\u{f0219}'), // 󰈙 ("md_file_document_alert", '\u{f1a97}'), // 󱪗 ("md_file_document_alert_outline", '\u{f1a98}'), // 󱪘 ("md_file_document_check", '\u{f1a99}'), // 󱪙 ("md_file_document_check_outline", '\u{f1a9a}'), // 󱪚 ("md_file_document_edit", '\u{f0dc8}'), // ó°·ˆ ("md_file_document_edit_outline", '\u{f0dc9}'), // ó°·‰ ("md_file_document_minus", '\u{f1a9b}'), // 󱪛 ("md_file_document_minus_outline", '\u{f1a9c}'), // 󱪜 ("md_file_document_multiple", '\u{f1517}'), // ó±”— ("md_file_document_multiple_outline", '\u{f1518}'), // 󱔘 ("md_file_document_outline", '\u{f09ee}'), // ó°§® ("md_file_document_plus", '\u{f1a9d}'), // ó±ª ("md_file_document_plus_outline", '\u{f1a9e}'), // 󱪞 ("md_file_document_remove", '\u{f1a9f}'), // 󱪟 ("md_file_document_remove_outline", '\u{f1aa0}'), // 󱪠 ("md_file_download", '\u{f0965}'), // ó°¥¥ ("md_file_download_outline", '\u{f0966}'), // 󰥦 ("md_file_edit", '\u{f11e7}'), // 󱇧 ("md_file_edit_outline", '\u{f11e8}'), // 󱇨 ("md_file_excel", '\u{f021b}'), // 󰈛 ("md_file_excel_box", '\u{f021c}'), // 󰈜 ("md_file_excel_box_outline", '\u{f102c}'), // 󱀬 ("md_file_excel_outline", '\u{f102d}'), // ó±€­ ("md_file_export", '\u{f021d}'), // ó°ˆ ("md_file_export_outline", '\u{f102e}'), // ó±€® ("md_file_eye", '\u{f0dca}'), // ó°·Š ("md_file_eye_outline", '\u{f0dcb}'), // ó°·‹ ("md_file_find", '\u{f021e}'), // 󰈞 ("md_file_find_outline", '\u{f0b97}'), // ó°®— ("md_file_gif_box", '\u{f0d78}'), // 󰵸 ("md_file_hidden", '\u{f0613}'), // 󰘓 ("md_file_image", '\u{f021f}'), // 󰈟 ("md_file_image_marker", '\u{f1772}'), // ó±² ("md_file_image_marker_outline", '\u{f1773}'), // ó±³ ("md_file_image_minus", '\u{f193b}'), // 󱤻 ("md_file_image_minus_outline", '\u{f193c}'), // 󱤼 ("md_file_image_outline", '\u{f0eb0}'), // ó°º° ("md_file_image_plus", '\u{f193d}'), // 󱤽 ("md_file_image_plus_outline", '\u{f193e}'), // 󱤾 ("md_file_image_remove", '\u{f193f}'), // 󱤿 ("md_file_image_remove_outline", '\u{f1940}'), // ó±¥€ ("md_file_import", '\u{f0220}'), // ó°ˆ  ("md_file_import_outline", '\u{f102f}'), // 󱀯 ("md_file_jpg_box", '\u{f0225}'), // 󰈥 ("md_file_key", '\u{f1184}'), // 󱆄 ("md_file_key_outline", '\u{f1185}'), // 󱆅 ("md_file_link", '\u{f1177}'), // ó±…· ("md_file_link_outline", '\u{f1178}'), // ó±…¸ ("md_file_lock", '\u{f0221}'), // 󰈡 ("md_file_lock_open", '\u{f19c8}'), // 󱧈 ("md_file_lock_open_outline", '\u{f19c9}'), // 󱧉 ("md_file_lock_outline", '\u{f1030}'), // ó±€° ("md_file_marker", '\u{f1774}'), // ó±´ ("md_file_marker_outline", '\u{f1775}'), // ó±µ ("md_file_minus", '\u{f1aa1}'), // 󱪡 ("md_file_minus_outline", '\u{f1aa2}'), // 󱪢 ("md_file_move", '\u{f0ab9}'), // 󰪹 ("md_file_move_outline", '\u{f1031}'), // ó±€± ("md_file_multiple", '\u{f0222}'), // 󰈢 ("md_file_multiple_outline", '\u{f1032}'), // ó±€² ("md_file_music", '\u{f0223}'), // 󰈣 ("md_file_music_outline", '\u{f0e2a}'), // 󰸪 ("md_file_outline", '\u{f0224}'), // 󰈤 ("md_file_pdf_box", '\u{f0226}'), // 󰈦 ("md_file_percent", '\u{f081e}'), // ó° ž ("md_file_percent_outline", '\u{f1033}'), // ó±€³ ("md_file_phone", '\u{f1179}'), // ó±…¹ ("md_file_phone_outline", '\u{f117a}'), // ó±…º ("md_file_plus", '\u{f0752}'), // ó°’ ("md_file_plus_outline", '\u{f0eed}'), // ó°»­ ("md_file_png_box", '\u{f0e2d}'), // ó°¸­ ("md_file_powerpoint", '\u{f0227}'), // 󰈧 ("md_file_powerpoint_box", '\u{f0228}'), // 󰈨 ("md_file_powerpoint_box_outline", '\u{f1034}'), // ó±€´ ("md_file_powerpoint_outline", '\u{f1035}'), // ó±€µ ("md_file_presentation_box", '\u{f0229}'), // 󰈩 ("md_file_question", '\u{f086f}'), // 󰡯 ("md_file_question_outline", '\u{f1036}'), // ó±€¶ ("md_file_refresh", '\u{f0918}'), // 󰤘 ("md_file_refresh_outline", '\u{f0541}'), // ó°• ("md_file_remove", '\u{f0b98}'), // 󰮘 ("md_file_remove_outline", '\u{f1037}'), // ó±€· ("md_file_replace", '\u{f0b32}'), // 󰬲 ("md_file_replace_outline", '\u{f0b33}'), // 󰬳 ("md_file_restore", '\u{f0670}'), // ó°™° ("md_file_restore_outline", '\u{f1038}'), // 󱀸 ("md_file_rotate_left", '\u{f1a3b}'), // 󱨻 ("md_file_rotate_left_outline", '\u{f1a3c}'), // 󱨼 ("md_file_rotate_right", '\u{f1a3d}'), // 󱨽 ("md_file_rotate_right_outline", '\u{f1a3e}'), // 󱨾 ("md_file_search", '\u{f0c7c}'), // ó°±¼ ("md_file_search_outline", '\u{f0c7d}'), // ó°±½ ("md_file_send", '\u{f022a}'), // 󰈪 ("md_file_send_outline", '\u{f1039}'), // ó±€¹ ("md_file_settings", '\u{f1079}'), // ó±¹ ("md_file_settings_outline", '\u{f107a}'), // ó±º ("md_file_sign", '\u{f19c3}'), // 󱧃 ("md_file_star", '\u{f103a}'), // 󱀺 ("md_file_star_outline", '\u{f103b}'), // ó±€» ("md_file_swap", '\u{f0fb4}'), // ó°¾´ ("md_file_swap_outline", '\u{f0fb5}'), // ó°¾µ ("md_file_sync", '\u{f1216}'), // 󱈖 ("md_file_sync_outline", '\u{f1217}'), // 󱈗 ("md_file_table", '\u{f0c7e}'), // ó°±¾ ("md_file_table_box", '\u{f10e1}'), // 󱃡 ("md_file_table_box_multiple", '\u{f10e2}'), // 󱃢 ("md_file_table_box_multiple_outline", '\u{f10e3}'), // 󱃣 ("md_file_table_box_outline", '\u{f10e4}'), // 󱃤 ("md_file_table_outline", '\u{f0c7f}'), // 󰱿 ("md_file_tree", '\u{f0645}'), // ó°™… ("md_file_tree_outline", '\u{f13d2}'), // ó±’ ("md_file_undo", '\u{f08dc}'), // 󰣜 ("md_file_undo_outline", '\u{f103c}'), // ó±€¼ ("md_file_upload", '\u{f0a4d}'), // ó°© ("md_file_upload_outline", '\u{f0a4e}'), // ó°©Ž ("md_file_video", '\u{f022b}'), // 󰈫 ("md_file_video_outline", '\u{f0e2c}'), // 󰸬 ("md_file_word", '\u{f022c}'), // 󰈬 ("md_file_word_box", '\u{f022d}'), // ó°ˆ­ ("md_file_word_box_outline", '\u{f103d}'), // ó±€½ ("md_file_word_outline", '\u{f103e}'), // ó±€¾ ("md_film", '\u{f022f}'), // 󰈯 ("md_filmstrip", '\u{f0230}'), // ó°ˆ° ("md_filmstrip_box", '\u{f0332}'), // 󰌲 ("md_filmstrip_box_multiple", '\u{f0d18}'), // ó°´˜ ("md_filmstrip_off", '\u{f0231}'), // 󰈱 ("md_filter", '\u{f0232}'), // 󰈲 ("md_filter_check", '\u{f18ec}'), // 󱣬 ("md_filter_check_outline", '\u{f18ed}'), // ó±£­ ("md_filter_cog", '\u{f1aa3}'), // 󱪣 ("md_filter_cog_outline", '\u{f1aa4}'), // 󱪤 ("md_filter_menu", '\u{f10e5}'), // 󱃥 ("md_filter_menu_outline", '\u{f10e6}'), // 󱃦 ("md_filter_minus", '\u{f0eee}'), // ó°»® ("md_filter_minus_outline", '\u{f0eef}'), // 󰻯 ("md_filter_multiple", '\u{f1a3f}'), // 󱨿 ("md_filter_multiple_outline", '\u{f1a40}'), // 󱩀 ("md_filter_off", '\u{f14ef}'), // 󱓯 ("md_filter_off_outline", '\u{f14f0}'), // 󱓰 ("md_filter_outline", '\u{f0233}'), // 󰈳 ("md_filter_plus", '\u{f0ef0}'), // ó°»° ("md_filter_plus_outline", '\u{f0ef1}'), // ó°»± ("md_filter_remove", '\u{f0234}'), // ó°ˆ´ ("md_filter_remove_outline", '\u{f0235}'), // 󰈵 ("md_filter_settings", '\u{f1aa5}'), // 󱪥 ("md_filter_settings_outline", '\u{f1aa6}'), // 󱪦 ("md_filter_variant", '\u{f0236}'), // 󰈶 ("md_filter_variant_minus", '\u{f1112}'), // 󱄒 ("md_filter_variant_plus", '\u{f1113}'), // 󱄓 ("md_filter_variant_remove", '\u{f103f}'), // 󱀿 ("md_finance", '\u{f081f}'), // ó° Ÿ ("md_find_replace", '\u{f06d4}'), // ó°›” ("md_fingerprint", '\u{f0237}'), // ó°ˆ· ("md_fingerprint_off", '\u{f0eb1}'), // 󰺱 ("md_fire", '\u{f0238}'), // 󰈸 ("md_fire_alert", '\u{f15d7}'), // ó±—— ("md_fire_circle", '\u{f1807}'), // ó± ‡ ("md_fire_extinguisher", '\u{f0ef2}'), // ó°»² ("md_fire_hydrant", '\u{f1137}'), // 󱄷 ("md_fire_hydrant_alert", '\u{f1138}'), // 󱄸 ("md_fire_hydrant_off", '\u{f1139}'), // 󱄹 ("md_fire_off", '\u{f1722}'), // 󱜢 ("md_fire_truck", '\u{f08ab}'), // 󰢫 ("md_firebase", '\u{f0967}'), // ó°¥§ ("md_firefox", '\u{f0239}'), // 󰈹 ("md_fireplace", '\u{f0e2e}'), // 󰸮 ("md_fireplace_off", '\u{f0e2f}'), // 󰸯 ("md_firewire", '\u{f05be}'), // ó°–¾ ("md_firework", '\u{f0e30}'), // ó°¸° ("md_firework_off", '\u{f1723}'), // 󱜣 ("md_fish", '\u{f023a}'), // 󰈺 ("md_fish_off", '\u{f13f3}'), // ó±³ ("md_fishbowl", '\u{f0ef3}'), // ó°»³ ("md_fishbowl_outline", '\u{f0ef4}'), // ó°»´ ("md_fit_to_page", '\u{f0ef5}'), // ó°»µ ("md_fit_to_page_outline", '\u{f0ef6}'), // ó°»¶ ("md_fit_to_screen", '\u{f18f4}'), // ó±£´ ("md_fit_to_screen_outline", '\u{f18f5}'), // ó±£µ ("md_flag", '\u{f023b}'), // 󰈻 ("md_flag_checkered", '\u{f023c}'), // 󰈼 ("md_flag_minus", '\u{f0b99}'), // ó°®™ ("md_flag_minus_outline", '\u{f10b2}'), // 󱂲 ("md_flag_off", '\u{f18ee}'), // ó±£® ("md_flag_off_outline", '\u{f18ef}'), // 󱣯 ("md_flag_outline", '\u{f023d}'), // 󰈽 ("md_flag_plus", '\u{f0b9a}'), // 󰮚 ("md_flag_plus_outline", '\u{f10b3}'), // 󱂳 ("md_flag_remove", '\u{f0b9b}'), // ó°®› ("md_flag_remove_outline", '\u{f10b4}'), // 󱂴 ("md_flag_triangle", '\u{f023f}'), // 󰈿 ("md_flag_variant", '\u{f0240}'), // 󰉀 ("md_flag_variant_outline", '\u{f023e}'), // 󰈾 ("md_flare", '\u{f0d72}'), // ó°µ² ("md_flash", '\u{f0241}'), // ó°‰ ("md_flash_alert", '\u{f0ef7}'), // ó°»· ("md_flash_alert_outline", '\u{f0ef8}'), // 󰻸 ("md_flash_auto", '\u{f0242}'), // 󰉂 ("md_flash_off", '\u{f0243}'), // 󰉃 ("md_flash_outline", '\u{f06d5}'), // ó°›• ("md_flash_red_eye", '\u{f067b}'), // ó°™» ("md_flashlight", '\u{f0244}'), // 󰉄 ("md_flashlight_off", '\u{f0245}'), // ó°‰… ("md_flask", '\u{f0093}'), // ó°‚“ ("md_flask_empty", '\u{f0094}'), // ó°‚” ("md_flask_empty_minus", '\u{f123a}'), // 󱈺 ("md_flask_empty_minus_outline", '\u{f123b}'), // 󱈻 ("md_flask_empty_off", '\u{f13f4}'), // ó±´ ("md_flask_empty_off_outline", '\u{f13f5}'), // ó±µ ("md_flask_empty_outline", '\u{f0095}'), // ó°‚• ("md_flask_empty_plus", '\u{f123c}'), // 󱈼 ("md_flask_empty_plus_outline", '\u{f123d}'), // 󱈽 ("md_flask_empty_remove", '\u{f123e}'), // 󱈾 ("md_flask_empty_remove_outline", '\u{f123f}'), // 󱈿 ("md_flask_minus", '\u{f1240}'), // 󱉀 ("md_flask_minus_outline", '\u{f1241}'), // ó±‰ ("md_flask_off", '\u{f13f6}'), // ó±¶ ("md_flask_off_outline", '\u{f13f7}'), // ó±· ("md_flask_outline", '\u{f0096}'), // ó°‚– ("md_flask_plus", '\u{f1242}'), // 󱉂 ("md_flask_plus_outline", '\u{f1243}'), // 󱉃 ("md_flask_remove", '\u{f1244}'), // 󱉄 ("md_flask_remove_outline", '\u{f1245}'), // 󱉅 ("md_flask_round_bottom", '\u{f124b}'), // 󱉋 ("md_flask_round_bottom_empty", '\u{f124c}'), // 󱉌 ("md_flask_round_bottom_empty_outline", '\u{f124d}'), // ó±‰ ("md_flask_round_bottom_outline", '\u{f124e}'), // 󱉎 ("md_fleur_de_lis", '\u{f1303}'), // 󱌃 ("md_flip_horizontal", '\u{f10e7}'), // 󱃧 ("md_flip_to_back", '\u{f0247}'), // 󰉇 ("md_flip_to_front", '\u{f0248}'), // 󰉈 ("md_flip_vertical", '\u{f10e8}'), // 󱃨 ("md_floor_lamp", '\u{f08dd}'), // ó°£ ("md_floor_lamp_dual", '\u{f1040}'), // ó±€ ("md_floor_lamp_dual_outline", '\u{f17ce}'), // 󱟎 ("md_floor_lamp_outline", '\u{f17c8}'), // 󱟈 ("md_floor_lamp_torchiere", '\u{f1747}'), // ó±‡ ("md_floor_lamp_torchiere_outline", '\u{f17d6}'), // 󱟖 ("md_floor_lamp_torchiere_variant", '\u{f1041}'), // ó± ("md_floor_lamp_torchiere_variant_outline", '\u{f17cf}'), // ó±Ÿ ("md_floor_plan", '\u{f0821}'), // ó° ¡ ("md_floppy", '\u{f0249}'), // 󰉉 ("md_floppy_variant", '\u{f09ef}'), // 󰧯 ("md_flower", '\u{f024a}'), // 󰉊 ("md_flower_outline", '\u{f09f0}'), // ó°§° ("md_flower_pollen", '\u{f1885}'), // ó±¢… ("md_flower_pollen_outline", '\u{f1886}'), // 󱢆 ("md_flower_poppy", '\u{f0d08}'), // ó°´ˆ ("md_flower_tulip", '\u{f09f1}'), // ó°§± ("md_flower_tulip_outline", '\u{f09f2}'), // ó°§² ("md_focus_auto", '\u{f0f4e}'), // 󰽎 ("md_focus_field", '\u{f0f4f}'), // ó°½ ("md_focus_field_horizontal", '\u{f0f50}'), // ó°½ ("md_focus_field_vertical", '\u{f0f51}'), // 󰽑 ("md_folder", '\u{f024b}'), // 󰉋 ("md_folder_account", '\u{f024c}'), // 󰉌 ("md_folder_account_outline", '\u{f0b9c}'), // 󰮜 ("md_folder_alert", '\u{f0dcc}'), // ó°·Œ ("md_folder_alert_outline", '\u{f0dcd}'), // ó°· ("md_folder_arrow_down", '\u{f19e8}'), // 󱧨 ("md_folder_arrow_down_outline", '\u{f19e9}'), // ó±§© ("md_folder_arrow_left", '\u{f19ea}'), // 󱧪 ("md_folder_arrow_left_outline", '\u{f19eb}'), // ó±§« ("md_folder_arrow_left_right", '\u{f19ec}'), // 󱧬 ("md_folder_arrow_left_right_outline", '\u{f19ed}'), // ó±§­ ("md_folder_arrow_right", '\u{f19ee}'), // ó±§® ("md_folder_arrow_right_outline", '\u{f19ef}'), // 󱧯 ("md_folder_arrow_up", '\u{f19f0}'), // ó±§° ("md_folder_arrow_up_down", '\u{f19f1}'), // ó±§± ("md_folder_arrow_up_down_outline", '\u{f19f2}'), // ó±§² ("md_folder_arrow_up_outline", '\u{f19f3}'), // ó±§³ ("md_folder_cancel", '\u{f19f4}'), // ó±§´ ("md_folder_cancel_outline", '\u{f19f5}'), // ó±§µ ("md_folder_check", '\u{f197e}'), // ó±¥¾ ("md_folder_check_outline", '\u{f197f}'), // 󱥿 ("md_folder_clock", '\u{f0aba}'), // 󰪺 ("md_folder_clock_outline", '\u{f0abb}'), // 󰪻 ("md_folder_cog", '\u{f107f}'), // ó±¿ ("md_folder_cog_outline", '\u{f1080}'), // 󱂀 ("md_folder_download", '\u{f024d}'), // ó°‰ ("md_folder_download_outline", '\u{f10e9}'), // 󱃩 ("md_folder_edit", '\u{f08de}'), // 󰣞 ("md_folder_edit_outline", '\u{f0dce}'), // ó°·Ž ("md_folder_eye", '\u{f178a}'), // 󱞊 ("md_folder_eye_outline", '\u{f178b}'), // 󱞋 ("md_folder_file", '\u{f19f6}'), // ó±§¶ ("md_folder_file_outline", '\u{f19f7}'), // ó±§· ("md_folder_google_drive", '\u{f024e}'), // 󰉎 ("md_folder_heart", '\u{f10ea}'), // 󱃪 ("md_folder_heart_outline", '\u{f10eb}'), // 󱃫 ("md_folder_hidden", '\u{f179e}'), // 󱞞 ("md_folder_home", '\u{f10b5}'), // 󱂵 ("md_folder_home_outline", '\u{f10b6}'), // 󱂶 ("md_folder_image", '\u{f024f}'), // ó°‰ ("md_folder_information", '\u{f10b7}'), // 󱂷 ("md_folder_information_outline", '\u{f10b8}'), // 󱂸 ("md_folder_key", '\u{f08ac}'), // 󰢬 ("md_folder_key_network", '\u{f08ad}'), // ó°¢­ ("md_folder_key_network_outline", '\u{f0c80}'), // ó°²€ ("md_folder_key_outline", '\u{f10ec}'), // 󱃬 ("md_folder_lock", '\u{f0250}'), // ó°‰ ("md_folder_lock_open", '\u{f0251}'), // 󰉑 ("md_folder_lock_open_outline", '\u{f1aa7}'), // 󱪧 ("md_folder_lock_outline", '\u{f1aa8}'), // 󱪨 ("md_folder_marker", '\u{f126d}'), // 󱉭 ("md_folder_marker_outline", '\u{f126e}'), // 󱉮 ("md_folder_move", '\u{f0252}'), // ó°‰’ ("md_folder_move_outline", '\u{f1246}'), // 󱉆 ("md_folder_multiple", '\u{f0253}'), // 󰉓 ("md_folder_multiple_image", '\u{f0254}'), // 󰉔 ("md_folder_multiple_outline", '\u{f0255}'), // 󰉕 ("md_folder_multiple_plus", '\u{f147e}'), // 󱑾 ("md_folder_multiple_plus_outline", '\u{f147f}'), // 󱑿 ("md_folder_music", '\u{f1359}'), // ó±™ ("md_folder_music_outline", '\u{f135a}'), // ó±š ("md_folder_network", '\u{f0870}'), // ó°¡° ("md_folder_network_outline", '\u{f0c81}'), // ó°² ("md_folder_off", '\u{f19f8}'), // 󱧸 ("md_folder_off_outline", '\u{f19f9}'), // ó±§¹ ("md_folder_open", '\u{f0770}'), // ó°° ("md_folder_open_outline", '\u{f0dcf}'), // ó°· ("md_folder_outline", '\u{f0256}'), // ó°‰– ("md_folder_play", '\u{f19fa}'), // 󱧺 ("md_folder_play_outline", '\u{f19fb}'), // ó±§» ("md_folder_plus", '\u{f0257}'), // ó°‰— ("md_folder_plus_outline", '\u{f0b9d}'), // ó°® ("md_folder_pound", '\u{f0d09}'), // ó°´‰ ("md_folder_pound_outline", '\u{f0d0a}'), // ó°´Š ("md_folder_question", '\u{f19ca}'), // ó±§Š ("md_folder_question_outline", '\u{f19cb}'), // ó±§‹ ("md_folder_refresh", '\u{f0749}'), // ó°‰ ("md_folder_refresh_outline", '\u{f0542}'), // ó°•‚ ("md_folder_remove", '\u{f0258}'), // 󰉘 ("md_folder_remove_outline", '\u{f0b9e}'), // 󰮞 ("md_folder_search", '\u{f0968}'), // 󰥨 ("md_folder_search_outline", '\u{f0969}'), // 󰥩 ("md_folder_settings", '\u{f107d}'), // ó±½ ("md_folder_settings_outline", '\u{f107e}'), // ó±¾ ("md_folder_star", '\u{f069d}'), // ó°š ("md_folder_star_multiple", '\u{f13d3}'), // ó±“ ("md_folder_star_multiple_outline", '\u{f13d4}'), // ó±” ("md_folder_star_outline", '\u{f0b9f}'), // 󰮟 ("md_folder_swap", '\u{f0fb6}'), // ó°¾¶ ("md_folder_swap_outline", '\u{f0fb7}'), // ó°¾· ("md_folder_sync", '\u{f0d0b}'), // ó°´‹ ("md_folder_sync_outline", '\u{f0d0c}'), // ó°´Œ ("md_folder_table", '\u{f12e3}'), // 󱋣 ("md_folder_table_outline", '\u{f12e4}'), // 󱋤 ("md_folder_text", '\u{f0c82}'), // 󰲂 ("md_folder_text_outline", '\u{f0c83}'), // 󰲃 ("md_folder_upload", '\u{f0259}'), // 󰉙 ("md_folder_upload_outline", '\u{f10ed}'), // 󱃭 ("md_folder_wrench", '\u{f19fc}'), // ó±§¼ ("md_folder_wrench_outline", '\u{f19fd}'), // ó±§½ ("md_folder_zip", '\u{f06eb}'), // ó°›« ("md_folder_zip_outline", '\u{f07b9}'), // ó°ž¹ ("md_font_awesome", '\u{f003a}'), // 󰀺 ("md_food", '\u{f025a}'), // 󰉚 ("md_food_apple", '\u{f025b}'), // 󰉛 ("md_food_apple_outline", '\u{f0c84}'), // 󰲄 ("md_food_croissant", '\u{f07c8}'), // 󰟈 ("md_food_drumstick", '\u{f141f}'), // ó±Ÿ ("md_food_drumstick_off", '\u{f1468}'), // 󱑨 ("md_food_drumstick_off_outline", '\u{f1469}'), // 󱑩 ("md_food_drumstick_outline", '\u{f1420}'), // ó±  ("md_food_fork_drink", '\u{f05f2}'), // ó°—² ("md_food_halal", '\u{f1572}'), // 󱕲 ("md_food_hot_dog", '\u{f184b}'), // 󱡋 ("md_food_kosher", '\u{f1573}'), // 󱕳 ("md_food_off", '\u{f05f3}'), // ó°—³ ("md_food_off_outline", '\u{f1915}'), // 󱤕 ("md_food_outline", '\u{f1916}'), // 󱤖 ("md_food_steak", '\u{f146a}'), // 󱑪 ("md_food_steak_off", '\u{f146b}'), // 󱑫 ("md_food_takeout_box", '\u{f1836}'), // ó± ¶ ("md_food_takeout_box_outline", '\u{f1837}'), // ó± · ("md_food_turkey", '\u{f171c}'), // 󱜜 ("md_food_variant", '\u{f025c}'), // 󰉜 ("md_food_variant_off", '\u{f13e5}'), // ó±¥ ("md_foot_print", '\u{f0f52}'), // ó°½’ ("md_football", '\u{f025d}'), // ó°‰ ("md_football_australian", '\u{f025e}'), // 󰉞 ("md_football_helmet", '\u{f025f}'), // 󰉟 ("md_forest", '\u{f1897}'), // ó±¢— ("md_forklift", '\u{f07c9}'), // 󰟉 ("md_form_dropdown", '\u{f1400}'), // ó±€ ("md_form_select", '\u{f1401}'), // ó± ("md_form_textarea", '\u{f1095}'), // 󱂕 ("md_form_textbox", '\u{f060e}'), // 󰘎 ("md_form_textbox_lock", '\u{f135d}'), // ó± ("md_form_textbox_password", '\u{f07f5}'), // 󰟵 ("md_format_align_bottom", '\u{f0753}'), // ó°“ ("md_format_align_center", '\u{f0260}'), // ó°‰  ("md_format_align_justify", '\u{f0261}'), // 󰉡 ("md_format_align_left", '\u{f0262}'), // 󰉢 ("md_format_align_middle", '\u{f0754}'), // ó°” ("md_format_align_right", '\u{f0263}'), // 󰉣 ("md_format_align_top", '\u{f0755}'), // ó°• ("md_format_annotation_minus", '\u{f0abc}'), // 󰪼 ("md_format_annotation_plus", '\u{f0646}'), // 󰙆 ("md_format_bold", '\u{f0264}'), // 󰉤 ("md_format_clear", '\u{f0265}'), // 󰉥 ("md_format_color_fill", '\u{f0266}'), // 󰉦 ("md_format_color_highlight", '\u{f0e31}'), // 󰸱 ("md_format_color_marker_cancel", '\u{f1313}'), // 󱌓 ("md_format_color_text", '\u{f069e}'), // ó°šž ("md_format_columns", '\u{f08df}'), // 󰣟 ("md_format_float_center", '\u{f0267}'), // 󰉧 ("md_format_float_left", '\u{f0268}'), // 󰉨 ("md_format_float_none", '\u{f0269}'), // 󰉩 ("md_format_float_right", '\u{f026a}'), // 󰉪 ("md_format_font", '\u{f06d6}'), // ó°›– ("md_format_font_size_decrease", '\u{f09f3}'), // ó°§³ ("md_format_font_size_increase", '\u{f09f4}'), // ó°§´ ("md_format_header_1", '\u{f026b}'), // 󰉫 ("md_format_header_2", '\u{f026c}'), // 󰉬 ("md_format_header_3", '\u{f026d}'), // ó°‰­ ("md_format_header_4", '\u{f026e}'), // 󰉮 ("md_format_header_5", '\u{f026f}'), // 󰉯 ("md_format_header_6", '\u{f0270}'), // ó°‰° ("md_format_header_decrease", '\u{f0271}'), // 󰉱 ("md_format_header_equal", '\u{f0272}'), // 󰉲 ("md_format_header_increase", '\u{f0273}'), // 󰉳 ("md_format_header_pound", '\u{f0274}'), // ó°‰´ ("md_format_horizontal_align_center", '\u{f061e}'), // 󰘞 ("md_format_horizontal_align_left", '\u{f061f}'), // 󰘟 ("md_format_horizontal_align_right", '\u{f0620}'), // ó°˜  ("md_format_indent_decrease", '\u{f0275}'), // 󰉵 ("md_format_indent_increase", '\u{f0276}'), // 󰉶 ("md_format_italic", '\u{f0277}'), // ó°‰· ("md_format_letter_case", '\u{f0b34}'), // ó°¬´ ("md_format_letter_case_lower", '\u{f0b35}'), // 󰬵 ("md_format_letter_case_upper", '\u{f0b36}'), // 󰬶 ("md_format_letter_ends_with", '\u{f0fb8}'), // 󰾸 ("md_format_letter_matches", '\u{f0fb9}'), // ó°¾¹ ("md_format_letter_spacing", '\u{f1956}'), // ó±¥– ("md_format_letter_starts_with", '\u{f0fba}'), // 󰾺 ("md_format_line_spacing", '\u{f0278}'), // 󰉸 ("md_format_line_style", '\u{f05c8}'), // ó°—ˆ ("md_format_line_weight", '\u{f05c9}'), // ó°—‰ ("md_format_list_bulleted", '\u{f0279}'), // 󰉹 ("md_format_list_bulleted_square", '\u{f0dd0}'), // ó°· ("md_format_list_bulleted_triangle", '\u{f0eb2}'), // 󰺲 ("md_format_list_bulleted_type", '\u{f027a}'), // 󰉺 ("md_format_list_checkbox", '\u{f096a}'), // 󰥪 ("md_format_list_checks", '\u{f0756}'), // ó°– ("md_format_list_group", '\u{f1860}'), // 󱡠 ("md_format_list_numbered", '\u{f027b}'), // 󰉻 ("md_format_list_numbered_rtl", '\u{f0d0d}'), // ó°´ ("md_format_list_text", '\u{f126f}'), // 󱉯 ("md_format_overline", '\u{f0eb3}'), // 󰺳 ("md_format_page_break", '\u{f06d7}'), // ó°›— ("md_format_page_split", '\u{f1917}'), // 󱤗 ("md_format_paint", '\u{f027c}'), // 󰉼 ("md_format_paragraph", '\u{f027d}'), // 󰉽 ("md_format_pilcrow", '\u{f06d8}'), // 󰛘 ("md_format_quote_close", '\u{f027e}'), // 󰉾 ("md_format_quote_close_outline", '\u{f11a8}'), // 󱆨 ("md_format_quote_open", '\u{f0757}'), // ó°— ("md_format_quote_open_outline", '\u{f11a7}'), // 󱆧 ("md_format_rotate_90", '\u{f06aa}'), // 󰚪 ("md_format_section", '\u{f069f}'), // 󰚟 ("md_format_size", '\u{f027f}'), // 󰉿 ("md_format_strikethrough", '\u{f0280}'), // ó°Š€ ("md_format_strikethrough_variant", '\u{f0281}'), // ó°Š ("md_format_subscript", '\u{f0282}'), // ó°Š‚ ("md_format_superscript", '\u{f0283}'), // 󰊃 ("md_format_text", '\u{f0284}'), // ó°Š„ ("md_format_text_rotation_angle_down", '\u{f0fbb}'), // ó°¾» ("md_format_text_rotation_angle_up", '\u{f0fbc}'), // ó°¾¼ ("md_format_text_rotation_down", '\u{f0d73}'), // ó°µ³ ("md_format_text_rotation_down_vertical", '\u{f0fbd}'), // ó°¾½ ("md_format_text_rotation_none", '\u{f0d74}'), // ó°µ´ ("md_format_text_rotation_up", '\u{f0fbe}'), // ó°¾¾ ("md_format_text_rotation_vertical", '\u{f0fbf}'), // 󰾿 ("md_format_text_variant", '\u{f0e32}'), // 󰸲 ("md_format_text_variant_outline", '\u{f150f}'), // ó±” ("md_format_text_wrapping_clip", '\u{f0d0e}'), // ó°´Ž ("md_format_text_wrapping_overflow", '\u{f0d0f}'), // ó°´ ("md_format_text_wrapping_wrap", '\u{f0d10}'), // ó°´ ("md_format_textbox", '\u{f0d11}'), // ó°´‘ ("md_format_textdirection_l_to_r", '\u{f0285}'), // ó°Š… ("md_format_textdirection_r_to_l", '\u{f0286}'), // 󰊆 ("md_format_title", '\u{f05f4}'), // ó°—´ ("md_format_underline", '\u{f0287}'), // 󰊇 ("md_format_underline_wavy", '\u{f18e9}'), // 󱣩 ("md_format_vertical_align_bottom", '\u{f0621}'), // 󰘡 ("md_format_vertical_align_center", '\u{f0622}'), // 󰘢 ("md_format_vertical_align_top", '\u{f0623}'), // 󰘣 ("md_format_wrap_inline", '\u{f0288}'), // 󰊈 ("md_format_wrap_square", '\u{f0289}'), // 󰊉 ("md_format_wrap_tight", '\u{f028a}'), // ó°ŠŠ ("md_format_wrap_top_bottom", '\u{f028b}'), // ó°Š‹ ("md_forum", '\u{f028c}'), // ó°ŠŒ ("md_forum_minus", '\u{f1aa9}'), // 󱪩 ("md_forum_minus_outline", '\u{f1aaa}'), // 󱪪 ("md_forum_outline", '\u{f0822}'), // ó° ¢ ("md_forum_plus", '\u{f1aab}'), // 󱪫 ("md_forum_plus_outline", '\u{f1aac}'), // 󱪬 ("md_forum_remove", '\u{f1aad}'), // 󱪭 ("md_forum_remove_outline", '\u{f1aae}'), // 󱪮 ("md_forward", '\u{f028d}'), // ó°Š ("md_forwardburger", '\u{f0d75}'), // ó°µµ ("md_fountain", '\u{f096b}'), // 󰥫 ("md_fountain_pen", '\u{f0d12}'), // ó°´’ ("md_fountain_pen_tip", '\u{f0d13}'), // ó°´“ ("md_fraction_one_half", '\u{f1992}'), // 󱦒 ("md_freebsd", '\u{f08e0}'), // ó°£  ("md_french_fries", '\u{f1957}'), // ó±¥— ("md_frequently_asked_questions", '\u{f0eb4}'), // ó°º´ ("md_fridge", '\u{f0290}'), // ó°Š ("md_fridge_alert", '\u{f11b1}'), // 󱆱 ("md_fridge_alert_outline", '\u{f11b2}'), // 󱆲 ("md_fridge_bottom", '\u{f0292}'), // ó°Š’ ("md_fridge_industrial", '\u{f15ee}'), // ó±—® ("md_fridge_industrial_alert", '\u{f15ef}'), // ó±—¯ ("md_fridge_industrial_alert_outline", '\u{f15f0}'), // ó±—° ("md_fridge_industrial_off", '\u{f15f1}'), // ó±—± ("md_fridge_industrial_off_outline", '\u{f15f2}'), // ó±—² ("md_fridge_industrial_outline", '\u{f15f3}'), // ó±—³ ("md_fridge_off", '\u{f11af}'), // 󱆯 ("md_fridge_off_outline", '\u{f11b0}'), // 󱆰 ("md_fridge_outline", '\u{f028f}'), // ó°Š ("md_fridge_top", '\u{f0291}'), // ó°Š‘ ("md_fridge_variant", '\u{f15f4}'), // ó±—´ ("md_fridge_variant_alert", '\u{f15f5}'), // ó±—µ ("md_fridge_variant_alert_outline", '\u{f15f6}'), // ó±—¶ ("md_fridge_variant_off", '\u{f15f7}'), // ó±—· ("md_fridge_variant_off_outline", '\u{f15f8}'), // ó±—¸ ("md_fridge_variant_outline", '\u{f15f9}'), // ó±—¹ ("md_fruit_cherries", '\u{f1042}'), // ó±‚ ("md_fruit_cherries_off", '\u{f13f8}'), // ó±¸ ("md_fruit_citrus", '\u{f1043}'), // ó±ƒ ("md_fruit_citrus_off", '\u{f13f9}'), // ó±¹ ("md_fruit_grapes", '\u{f1044}'), // ó±„ ("md_fruit_grapes_outline", '\u{f1045}'), // ó±… ("md_fruit_pear", '\u{f1a0e}'), // 󱨎 ("md_fruit_pineapple", '\u{f1046}'), // ó±† ("md_fruit_watermelon", '\u{f1047}'), // ó±‡ ("md_fuel", '\u{f07ca}'), // ó°ŸŠ ("md_fuel_cell", '\u{f18b5}'), // ó±¢µ ("md_fullscreen", '\u{f0293}'), // ó°Š“ ("md_fullscreen_exit", '\u{f0294}'), // ó°Š” ("md_function", '\u{f0295}'), // ó°Š• ("md_function_variant", '\u{f0871}'), // ó°¡± ("md_furigana_horizontal", '\u{f1081}'), // ó±‚ ("md_furigana_vertical", '\u{f1082}'), // 󱂂 ("md_fuse", '\u{f0c85}'), // ó°²… ("md_fuse_alert", '\u{f142d}'), // ó±­ ("md_fuse_blade", '\u{f0c86}'), // 󰲆 ("md_fuse_off", '\u{f142c}'), // ó±¬ ("md_gamepad", '\u{f0296}'), // ó°Š– ("md_gamepad_circle", '\u{f0e33}'), // 󰸳 ("md_gamepad_circle_down", '\u{f0e34}'), // ó°¸´ ("md_gamepad_circle_left", '\u{f0e35}'), // 󰸵 ("md_gamepad_circle_outline", '\u{f0e36}'), // 󰸶 ("md_gamepad_circle_right", '\u{f0e37}'), // ó°¸· ("md_gamepad_circle_up", '\u{f0e38}'), // 󰸸 ("md_gamepad_down", '\u{f0e39}'), // 󰸹 ("md_gamepad_left", '\u{f0e3a}'), // 󰸺 ("md_gamepad_outline", '\u{f1919}'), // 󱤙 ("md_gamepad_right", '\u{f0e3b}'), // 󰸻 ("md_gamepad_round", '\u{f0e3c}'), // 󰸼 ("md_gamepad_round_down", '\u{f0e3d}'), // 󰸽 ("md_gamepad_round_left", '\u{f0e3e}'), // 󰸾 ("md_gamepad_round_outline", '\u{f0e3f}'), // 󰸿 ("md_gamepad_round_right", '\u{f0e40}'), // ó°¹€ ("md_gamepad_round_up", '\u{f0e41}'), // ó°¹ ("md_gamepad_square", '\u{f0eb5}'), // 󰺵 ("md_gamepad_square_outline", '\u{f0eb6}'), // 󰺶 ("md_gamepad_up", '\u{f0e42}'), // 󰹂 ("md_gamepad_variant", '\u{f0297}'), // ó°Š— ("md_gamepad_variant_outline", '\u{f0eb7}'), // ó°º· ("md_gamma", '\u{f10ee}'), // 󱃮 ("md_gantry_crane", '\u{f0dd1}'), // ó°·‘ ("md_garage", '\u{f06d9}'), // ó°›™ ("md_garage_alert", '\u{f0872}'), // ó°¡² ("md_garage_alert_variant", '\u{f12d5}'), // 󱋕 ("md_garage_lock", '\u{f17fb}'), // 󱟻 ("md_garage_open", '\u{f06da}'), // 󰛚 ("md_garage_open_variant", '\u{f12d4}'), // 󱋔 ("md_garage_variant", '\u{f12d3}'), // 󱋓 ("md_garage_variant_lock", '\u{f17fc}'), // 󱟼 ("md_gas_burner", '\u{f1a1b}'), // 󱨛 ("md_gas_cylinder", '\u{f0647}'), // 󰙇 ("md_gas_station", '\u{f0298}'), // 󰊘 ("md_gas_station_off", '\u{f1409}'), // ó±‰ ("md_gas_station_off_outline", '\u{f140a}'), // ó±Š ("md_gas_station_outline", '\u{f0eb8}'), // 󰺸 ("md_gate", '\u{f0299}'), // ó°Š™ ("md_gate_alert", '\u{f17f8}'), // 󱟸 ("md_gate_and", '\u{f08e1}'), // 󰣡 ("md_gate_arrow_left", '\u{f17f7}'), // 󱟷 ("md_gate_arrow_right", '\u{f1169}'), // ó±…© ("md_gate_nand", '\u{f08e2}'), // ó°£¢ ("md_gate_nor", '\u{f08e3}'), // ó°££ ("md_gate_not", '\u{f08e4}'), // 󰣤 ("md_gate_open", '\u{f116a}'), // ó±…ª ("md_gate_or", '\u{f08e5}'), // ó°£¥ ("md_gate_xnor", '\u{f08e6}'), // 󰣦 ("md_gate_xor", '\u{f08e7}'), // ó°£§ ("md_gatsby", '\u{f0e43}'), // 󰹃 ("md_gauge", '\u{f029a}'), // ó°Šš ("md_gauge_empty", '\u{f0873}'), // ó°¡³ ("md_gauge_full", '\u{f0874}'), // ó°¡´ ("md_gauge_low", '\u{f0875}'), // ó°¡µ ("md_gavel", '\u{f029b}'), // ó°Š› ("md_gender_female", '\u{f029c}'), // ó°Šœ ("md_gender_male", '\u{f029d}'), // ó°Š ("md_gender_male_female", '\u{f029e}'), // ó°Šž ("md_gender_male_female_variant", '\u{f113f}'), // 󱄿 ("md_gender_non_binary", '\u{f1140}'), // ó±…€ ("md_gender_transgender", '\u{f029f}'), // ó°ŠŸ ("md_gentoo", '\u{f08e8}'), // 󰣨 ("md_gesture", '\u{f07cb}'), // ó°Ÿ‹ ("md_gesture_double_tap", '\u{f073c}'), // 󰜼 ("md_gesture_pinch", '\u{f0abd}'), // 󰪽 ("md_gesture_spread", '\u{f0abe}'), // 󰪾 ("md_gesture_swipe", '\u{f0d76}'), // ó°µ¶ ("md_gesture_swipe_down", '\u{f073d}'), // 󰜽 ("md_gesture_swipe_horizontal", '\u{f0abf}'), // 󰪿 ("md_gesture_swipe_left", '\u{f073e}'), // 󰜾 ("md_gesture_swipe_right", '\u{f073f}'), // 󰜿 ("md_gesture_swipe_up", '\u{f0740}'), // ó°€ ("md_gesture_swipe_vertical", '\u{f0ac0}'), // ó°«€ ("md_gesture_tap", '\u{f0741}'), // ó° ("md_gesture_tap_box", '\u{f12a9}'), // 󱊩 ("md_gesture_tap_button", '\u{f12a8}'), // 󱊨 ("md_gesture_tap_hold", '\u{f0d77}'), // ó°µ· ("md_gesture_two_double_tap", '\u{f0742}'), // ó°‚ ("md_gesture_two_tap", '\u{f0743}'), // ó°ƒ ("md_ghost", '\u{f02a0}'), // ó°Š  ("md_ghost_off", '\u{f09f5}'), // ó°§µ ("md_ghost_off_outline", '\u{f165c}'), // 󱙜 ("md_ghost_outline", '\u{f165d}'), // ó±™ ("md_gift", '\u{f0e44}'), // 󰹄 ("md_gift_off", '\u{f16ef}'), // 󱛯 ("md_gift_off_outline", '\u{f16f0}'), // ó±›° ("md_gift_open", '\u{f16f1}'), // ó±›± ("md_gift_open_outline", '\u{f16f2}'), // ó±›² ("md_gift_outline", '\u{f02a1}'), // ó°Š¡ ("md_git", '\u{f02a2}'), // ó°Š¢ ("md_github", '\u{f02a4}'), // 󰊤 ("md_gitlab", '\u{f0ba0}'), // ó°®  ("md_glass_cocktail", '\u{f0356}'), // ó°– ("md_glass_cocktail_off", '\u{f15e6}'), // ó±—¦ ("md_glass_flute", '\u{f02a5}'), // ó°Š¥ ("md_glass_fragile", '\u{f1873}'), // 󱡳 ("md_glass_mug", '\u{f02a6}'), // 󰊦 ("md_glass_mug_off", '\u{f15e7}'), // ó±—§ ("md_glass_mug_variant", '\u{f1116}'), // 󱄖 ("md_glass_mug_variant_off", '\u{f15e8}'), // ó±—¨ ("md_glass_pint_outline", '\u{f130d}'), // ó±Œ ("md_glass_stange", '\u{f02a7}'), // 󰊧 ("md_glass_tulip", '\u{f02a8}'), // 󰊨 ("md_glass_wine", '\u{f0876}'), // ó°¡¶ ("md_glasses", '\u{f02aa}'), // 󰊪 ("md_globe_light", '\u{f12d7}'), // 󱋗 ("md_globe_model", '\u{f08e9}'), // 󰣩 ("md_gmail", '\u{f02ab}'), // ó°Š« ("md_gnome", '\u{f02ac}'), // 󰊬 ("md_go_kart", '\u{f0d79}'), // ó°µ¹ ("md_go_kart_track", '\u{f0d7a}'), // 󰵺 ("md_gog", '\u{f0ba1}'), // ó°®¡ ("md_gold", '\u{f124f}'), // ó±‰ ("md_golf", '\u{f0823}'), // ó° £ ("md_golf_cart", '\u{f11a4}'), // 󱆤 ("md_golf_tee", '\u{f1083}'), // 󱂃 ("md_gondola", '\u{f0686}'), // 󰚆 ("md_goodreads", '\u{f0d7b}'), // ó°µ» ("md_google", '\u{f02ad}'), // ó°Š­ ("md_google_ads", '\u{f0c87}'), // 󰲇 ("md_google_analytics", '\u{f07cc}'), // ó°ŸŒ ("md_google_assistant", '\u{f07cd}'), // ó°Ÿ ("md_google_cardboard", '\u{f02ae}'), // ó°Š® ("md_google_chrome", '\u{f02af}'), // 󰊯 ("md_google_circles", '\u{f02b0}'), // 󰊰 ("md_google_circles_communities", '\u{f02b1}'), // 󰊱 ("md_google_circles_extended", '\u{f02b2}'), // 󰊲 ("md_google_circles_group", '\u{f02b3}'), // 󰊳 ("md_google_classroom", '\u{f02c0}'), // ó°‹€ ("md_google_cloud", '\u{f11f6}'), // 󱇶 ("md_google_controller", '\u{f02b4}'), // ó°Š´ ("md_google_controller_off", '\u{f02b5}'), // 󰊵 ("md_google_downasaur", '\u{f1362}'), // ó±¢ ("md_google_drive", '\u{f02b6}'), // 󰊶 ("md_google_earth", '\u{f02b7}'), // ó°Š· ("md_google_fit", '\u{f096c}'), // 󰥬 ("md_google_glass", '\u{f02b8}'), // 󰊸 ("md_google_hangouts", '\u{f02c9}'), // 󰋉 ("md_google_home", '\u{f0824}'), // ó° ¤ ("md_google_keep", '\u{f06dc}'), // 󰛜 ("md_google_lens", '\u{f09f6}'), // ó°§¶ ("md_google_maps", '\u{f05f5}'), // ó°—µ ("md_google_my_business", '\u{f1048}'), // ó±ˆ ("md_google_nearby", '\u{f02b9}'), // 󰊹 ("md_google_play", '\u{f02bc}'), // 󰊼 ("md_google_plus", '\u{f02bd}'), // 󰊽 ("md_google_podcast", '\u{f0eb9}'), // 󰺹 ("md_google_spreadsheet", '\u{f09f7}'), // ó°§· ("md_google_street_view", '\u{f0c88}'), // 󰲈 ("md_google_translate", '\u{f02bf}'), // ó°Š¿ ("md_gradient_horizontal", '\u{f174a}'), // ó±Š ("md_gradient_vertical", '\u{f06a0}'), // ó°š  ("md_grain", '\u{f0d7c}'), // ó°µ¼ ("md_graph", '\u{f1049}'), // ó±‰ ("md_graph_outline", '\u{f104a}'), // ó±Š ("md_graphql", '\u{f0877}'), // ó°¡· ("md_grass", '\u{f1510}'), // ó±” ("md_grave_stone", '\u{f0ba2}'), // 󰮢 ("md_grease_pencil", '\u{f0648}'), // 󰙈 ("md_greater_than", '\u{f096d}'), // ó°¥­ ("md_greater_than_or_equal", '\u{f096e}'), // ó°¥® ("md_greenhouse", '\u{f002d}'), // ó°€­ ("md_grid", '\u{f02c1}'), // ó°‹ ("md_grid_large", '\u{f0758}'), // ó°˜ ("md_grid_off", '\u{f02c2}'), // ó°‹‚ ("md_grill", '\u{f0e45}'), // ó°¹… ("md_grill_outline", '\u{f118a}'), // 󱆊 ("md_group", '\u{f02c3}'), // 󰋃 ("md_guitar_acoustic", '\u{f0771}'), // ó°± ("md_guitar_electric", '\u{f02c4}'), // ó°‹„ ("md_guitar_pick", '\u{f02c5}'), // ó°‹… ("md_guitar_pick_outline", '\u{f02c6}'), // 󰋆 ("md_guy_fawkes_mask", '\u{f0825}'), // ó° ¥ ("md_gymnastics", '\u{f1a41}'), // ó±© ("md_hail", '\u{f0ac1}'), // ó°« ("md_hair_dryer", '\u{f10ef}'), // 󱃯 ("md_hair_dryer_outline", '\u{f10f0}'), // 󱃰 ("md_halloween", '\u{f0ba3}'), // 󰮣 ("md_hamburger", '\u{f0685}'), // ó°š… ("md_hamburger_check", '\u{f1776}'), // ó±¶ ("md_hamburger_minus", '\u{f1777}'), // ó±· ("md_hamburger_off", '\u{f1778}'), // ó±¸ ("md_hamburger_plus", '\u{f1779}'), // ó±¹ ("md_hamburger_remove", '\u{f177a}'), // ó±º ("md_hammer", '\u{f08ea}'), // 󰣪 ("md_hammer_screwdriver", '\u{f1322}'), // 󱌢 ("md_hammer_sickle", '\u{f1887}'), // 󱢇 ("md_hammer_wrench", '\u{f1323}'), // 󱌣 ("md_hand_back_left", '\u{f0e46}'), // 󰹆 ("md_hand_back_left_off", '\u{f1830}'), // ó± ° ("md_hand_back_left_off_outline", '\u{f1832}'), // ó± ² ("md_hand_back_left_outline", '\u{f182c}'), // ó± ¬ ("md_hand_back_right", '\u{f0e47}'), // 󰹇 ("md_hand_back_right_off", '\u{f1831}'), // ó± ± ("md_hand_back_right_off_outline", '\u{f1833}'), // ó± ³ ("md_hand_back_right_outline", '\u{f182d}'), // ó± ­ ("md_hand_clap", '\u{f194b}'), // 󱥋 ("md_hand_clap_off", '\u{f1a42}'), // 󱩂 ("md_hand_coin", '\u{f188f}'), // ó±¢ ("md_hand_coin_outline", '\u{f1890}'), // ó±¢ ("md_hand_extended", '\u{f18b6}'), // ó±¢¶ ("md_hand_extended_outline", '\u{f18b7}'), // ó±¢· ("md_hand_front_left", '\u{f182b}'), // ó± « ("md_hand_front_left_outline", '\u{f182e}'), // ó± ® ("md_hand_front_right", '\u{f0a4f}'), // ó°© ("md_hand_front_right_outline", '\u{f182f}'), // ó± ¯ ("md_hand_heart", '\u{f10f1}'), // 󱃱 ("md_hand_heart_outline", '\u{f157e}'), // 󱕾 ("md_hand_okay", '\u{f0a50}'), // ó°© ("md_hand_peace", '\u{f0a51}'), // ó°©‘ ("md_hand_peace_variant", '\u{f0a52}'), // ó°©’ ("md_hand_pointing_down", '\u{f0a53}'), // ó°©“ ("md_hand_pointing_left", '\u{f0a54}'), // ó°©” ("md_hand_pointing_right", '\u{f02c7}'), // 󰋇 ("md_hand_pointing_up", '\u{f0a55}'), // ó°©• ("md_hand_saw", '\u{f0e48}'), // 󰹈 ("md_hand_wash", '\u{f157f}'), // 󱕿 ("md_hand_wash_outline", '\u{f1580}'), // ó±–€ ("md_hand_water", '\u{f139f}'), // 󱎟 ("md_hand_wave", '\u{f1821}'), // ó± ¡ ("md_hand_wave_outline", '\u{f1822}'), // ó± ¢ ("md_handball", '\u{f0f53}'), // 󰽓 ("md_handcuffs", '\u{f113e}'), // 󱄾 ("md_hands_pray", '\u{f0579}'), // ó°•¹ ("md_handshake", '\u{f1218}'), // 󱈘 ("md_handshake_outline", '\u{f15a1}'), // ó±–¡ ("md_hanger", '\u{f02c8}'), // 󰋈 ("md_hard_hat", '\u{f096f}'), // 󰥯 ("md_harddisk", '\u{f02ca}'), // ó°‹Š ("md_harddisk_plus", '\u{f104b}'), // ó±‹ ("md_harddisk_remove", '\u{f104c}'), // ó±Œ ("md_hat_fedora", '\u{f0ba4}'), // 󰮤 ("md_hazard_lights", '\u{f0c89}'), // 󰲉 ("md_hdr", '\u{f0d7d}'), // ó°µ½ ("md_hdr_off", '\u{f0d7e}'), // ó°µ¾ ("md_head", '\u{f135e}'), // ó±ž ("md_head_alert", '\u{f1338}'), // 󱌸 ("md_head_alert_outline", '\u{f1339}'), // 󱌹 ("md_head_check", '\u{f133a}'), // 󱌺 ("md_head_check_outline", '\u{f133b}'), // 󱌻 ("md_head_cog", '\u{f133c}'), // 󱌼 ("md_head_cog_outline", '\u{f133d}'), // 󱌽 ("md_head_dots_horizontal", '\u{f133e}'), // 󱌾 ("md_head_dots_horizontal_outline", '\u{f133f}'), // 󱌿 ("md_head_flash", '\u{f1340}'), // ó±€ ("md_head_flash_outline", '\u{f1341}'), // ó± ("md_head_heart", '\u{f1342}'), // ó±‚ ("md_head_heart_outline", '\u{f1343}'), // ó±ƒ ("md_head_lightbulb", '\u{f1344}'), // ó±„ ("md_head_lightbulb_outline", '\u{f1345}'), // ó±… ("md_head_minus", '\u{f1346}'), // ó±† ("md_head_minus_outline", '\u{f1347}'), // ó±‡ ("md_head_outline", '\u{f135f}'), // ó±Ÿ ("md_head_plus", '\u{f1348}'), // ó±ˆ ("md_head_plus_outline", '\u{f1349}'), // ó±‰ ("md_head_question", '\u{f134a}'), // ó±Š ("md_head_question_outline", '\u{f134b}'), // ó±‹ ("md_head_remove", '\u{f134c}'), // ó±Œ ("md_head_remove_outline", '\u{f134d}'), // ó± ("md_head_snowflake", '\u{f134e}'), // ó±Ž ("md_head_snowflake_outline", '\u{f134f}'), // ó± ("md_head_sync", '\u{f1350}'), // ó± ("md_head_sync_outline", '\u{f1351}'), // ó±‘ ("md_headphones", '\u{f02cb}'), // ó°‹‹ ("md_headphones_bluetooth", '\u{f0970}'), // ó°¥° ("md_headphones_box", '\u{f02cc}'), // ó°‹Œ ("md_headphones_off", '\u{f07ce}'), // ó°ŸŽ ("md_headphones_settings", '\u{f02cd}'), // ó°‹ ("md_headset", '\u{f02ce}'), // ó°‹Ž ("md_headset_dock", '\u{f02cf}'), // ó°‹ ("md_headset_off", '\u{f02d0}'), // ó°‹ ("md_heart", '\u{f08d0}'), // ó°£ ("md_heart", '\u{f08d0}'), // ó°£ ("md_heart_box", '\u{f02d2}'), // ó°‹’ ("md_heart_box_outline", '\u{f02d3}'), // ó°‹“ ("md_heart_broken", '\u{f02d4}'), // ó°‹” ("md_heart_broken_outline", '\u{f0d14}'), // ó°´” ("md_heart_circle", '\u{f0971}'), // ó°¥± ("md_heart_circle_outline", '\u{f0972}'), // ó°¥² ("md_heart_cog", '\u{f1663}'), // 󱙣 ("md_heart_cog_outline", '\u{f1664}'), // 󱙤 ("md_heart_flash", '\u{f0ef9}'), // ó°»¹ ("md_heart_half", '\u{f06df}'), // 󰛟 ("md_heart_half_full", '\u{f06de}'), // 󰛞 ("md_heart_half_outline", '\u{f06e0}'), // ó°›  ("md_heart_minus", '\u{f142f}'), // ó±¯ ("md_heart_minus_outline", '\u{f1432}'), // ó±² ("md_heart_multiple", '\u{f0a56}'), // ó°©– ("md_heart_multiple_outline", '\u{f0a57}'), // ó°©— ("md_heart_off", '\u{f0759}'), // ó°™ ("md_heart_off_outline", '\u{f1434}'), // ó±´ ("md_heart_outline", '\u{f18a0}'), // ó±¢  ("md_heart_outline", '\u{f18a0}'), // ó±¢  ("md_heart_plus", '\u{f142e}'), // ó±® ("md_heart_plus_outline", '\u{f1431}'), // ó±± ("md_heart_pulse", '\u{f05f6}'), // ó°—¶ ("md_heart_remove", '\u{f1430}'), // ó±° ("md_heart_remove_outline", '\u{f1433}'), // ó±³ ("md_heart_settings", '\u{f1665}'), // 󱙥 ("md_heart_settings_outline", '\u{f1666}'), // 󱙦 ("md_heat_pump", '\u{f1a43}'), // 󱩃 ("md_heat_pump_outline", '\u{f1a44}'), // 󱩄 ("md_heat_wave", '\u{f1a45}'), // 󱩅 ("md_heating_coil", '\u{f1aaf}'), // 󱪯 ("md_helicopter", '\u{f0ac2}'), // ó°«‚ ("md_help", '\u{f02d6}'), // ó°‹– ("md_help_box", '\u{f078b}'), // ó°ž‹ ("md_help_circle", '\u{f02d7}'), // ó°‹— ("md_help_circle_outline", '\u{f0625}'), // 󰘥 ("md_help_network", '\u{f06f5}'), // ó°›µ ("md_help_network_outline", '\u{f0c8a}'), // 󰲊 ("md_help_rhombus", '\u{f0ba5}'), // 󰮥 ("md_help_rhombus_outline", '\u{f0ba6}'), // 󰮦 ("md_hexadecimal", '\u{f12a7}'), // 󱊧 ("md_hexagon", '\u{f02d8}'), // 󰋘 ("md_hexagon_multiple", '\u{f06e1}'), // ó°›¡ ("md_hexagon_multiple_outline", '\u{f10f2}'), // 󱃲 ("md_hexagon_outline", '\u{f02d9}'), // ó°‹™ ("md_hexagon_slice_1", '\u{f0ac3}'), // 󰫃 ("md_hexagon_slice_2", '\u{f0ac4}'), // ó°«„ ("md_hexagon_slice_3", '\u{f0ac5}'), // ó°«… ("md_hexagon_slice_4", '\u{f0ac6}'), // 󰫆 ("md_hexagon_slice_5", '\u{f0ac7}'), // 󰫇 ("md_hexagon_slice_6", '\u{f0ac8}'), // 󰫈 ("md_hexagram", '\u{f0ac9}'), // 󰫉 ("md_hexagram_outline", '\u{f0aca}'), // ó°«Š ("md_high_definition", '\u{f07cf}'), // ó°Ÿ ("md_high_definition_box", '\u{f0878}'), // 󰡸 ("md_highway", '\u{f05f7}'), // ó°—· ("md_hiking", '\u{f0d7f}'), // 󰵿 ("md_history", '\u{f02da}'), // ó°‹š ("md_hockey_puck", '\u{f0879}'), // ó°¡¹ ("md_hockey_sticks", '\u{f087a}'), // 󰡺 ("md_hololens", '\u{f02db}'), // ó°‹› ("md_home", '\u{f02dc}'), // ó°‹œ ("md_home_account", '\u{f0826}'), // ó° ¦ ("md_home_alert", '\u{f087b}'), // ó°¡» ("md_home_alert_outline", '\u{f15d0}'), // ó±— ("md_home_analytics", '\u{f0eba}'), // 󰺺 ("md_home_assistant", '\u{f07d0}'), // ó°Ÿ ("md_home_automation", '\u{f07d1}'), // ó°Ÿ‘ ("md_home_battery", '\u{f1901}'), // ó±¤ ("md_home_battery_outline", '\u{f1902}'), // 󱤂 ("md_home_circle", '\u{f07d2}'), // ó°Ÿ’ ("md_home_circle_outline", '\u{f104d}'), // ó± ("md_home_city", '\u{f0d15}'), // ó°´• ("md_home_city_outline", '\u{f0d16}'), // ó°´– ("md_home_clock", '\u{f1a12}'), // 󱨒 ("md_home_clock_outline", '\u{f1a13}'), // 󱨓 ("md_home_edit", '\u{f1159}'), // ó±…™ ("md_home_edit_outline", '\u{f115a}'), // ó±…š ("md_home_export_outline", '\u{f0f9b}'), // ó°¾› ("md_home_flood", '\u{f0efa}'), // 󰻺 ("md_home_floor_0", '\u{f0dd2}'), // ó°·’ ("md_home_floor_1", '\u{f0d80}'), // ó°¶€ ("md_home_floor_2", '\u{f0d81}'), // ó°¶ ("md_home_floor_3", '\u{f0d82}'), // ó°¶‚ ("md_home_floor_a", '\u{f0d83}'), // 󰶃 ("md_home_floor_b", '\u{f0d84}'), // ó°¶„ ("md_home_floor_g", '\u{f0d85}'), // ó°¶… ("md_home_floor_l", '\u{f0d86}'), // 󰶆 ("md_home_floor_negative_1", '\u{f0dd3}'), // ó°·“ ("md_home_group", '\u{f0dd4}'), // ó°·” ("md_home_group_minus", '\u{f19c1}'), // ó±§ ("md_home_group_plus", '\u{f19c0}'), // ó±§€ ("md_home_group_remove", '\u{f19c2}'), // ó±§‚ ("md_home_heart", '\u{f0827}'), // ó° § ("md_home_import_outline", '\u{f0f9c}'), // 󰾜 ("md_home_lightbulb", '\u{f1251}'), // 󱉑 ("md_home_lightbulb_outline", '\u{f1252}'), // 󱉒 ("md_home_lightning_bolt", '\u{f1903}'), // 󱤃 ("md_home_lightning_bolt_outline", '\u{f1904}'), // 󱤄 ("md_home_lock", '\u{f08eb}'), // 󰣫 ("md_home_lock_open", '\u{f08ec}'), // 󰣬 ("md_home_map_marker", '\u{f05f8}'), // ó°—¸ ("md_home_minus", '\u{f0974}'), // ó°¥´ ("md_home_minus_outline", '\u{f13d5}'), // ó±• ("md_home_modern", '\u{f02dd}'), // ó°‹ ("md_home_off", '\u{f1a46}'), // 󱩆 ("md_home_off_outline", '\u{f1a47}'), // 󱩇 ("md_home_outline", '\u{f06a1}'), // ó°š¡ ("md_home_plus", '\u{f0975}'), // ó°¥µ ("md_home_plus_outline", '\u{f13d6}'), // ó±– ("md_home_remove", '\u{f1247}'), // 󱉇 ("md_home_remove_outline", '\u{f13d7}'), // ó±— ("md_home_roof", '\u{f112b}'), // 󱄫 ("md_home_search", '\u{f13b0}'), // 󱎰 ("md_home_search_outline", '\u{f13b1}'), // 󱎱 ("md_home_switch", '\u{f1794}'), // 󱞔 ("md_home_switch_outline", '\u{f1795}'), // 󱞕 ("md_home_thermometer", '\u{f0f54}'), // ó°½” ("md_home_thermometer_outline", '\u{f0f55}'), // 󰽕 ("md_home_variant", '\u{f02de}'), // ó°‹ž ("md_home_variant_outline", '\u{f0ba7}'), // ó°®§ ("md_hook", '\u{f06e2}'), // 󰛢 ("md_hook_off", '\u{f06e3}'), // 󰛣 ("md_hoop_house", '\u{f0e56}'), // ó°¹– ("md_hops", '\u{f02df}'), // ó°‹Ÿ ("md_horizontal_rotate_clockwise", '\u{f10f3}'), // 󱃳 ("md_horizontal_rotate_counterclockwise", '\u{f10f4}'), // 󱃴 ("md_horse", '\u{f15bf}'), // ó±–¿ ("md_horse_human", '\u{f15c0}'), // ó±—€ ("md_horse_variant", '\u{f15c1}'), // ó±— ("md_horse_variant_fast", '\u{f186e}'), // 󱡮 ("md_horseshoe", '\u{f0a58}'), // 󰩘 ("md_hospital", '\u{f0ff6}'), // ó°¿¶ ("md_hospital_box", '\u{f02e0}'), // ó°‹  ("md_hospital_box_outline", '\u{f0ff7}'), // ó°¿· ("md_hospital_building", '\u{f02e1}'), // ó°‹¡ ("md_hospital_marker", '\u{f02e2}'), // ó°‹¢ ("md_hot_tub", '\u{f0828}'), // ó° ¨ ("md_hours_24", '\u{f1478}'), // 󱑸 ("md_hubspot", '\u{f0d17}'), // ó°´— ("md_hulu", '\u{f0829}'), // ó° © ("md_human", '\u{f02e6}'), // 󰋦 ("md_human_baby_changing_table", '\u{f138b}'), // 󱎋 ("md_human_cane", '\u{f1581}'), // ó±– ("md_human_capacity_decrease", '\u{f159b}'), // ó±–› ("md_human_capacity_increase", '\u{f159c}'), // ó±–œ ("md_human_child", '\u{f02e7}'), // ó°‹§ ("md_human_dolly", '\u{f1980}'), // 󱦀 ("md_human_edit", '\u{f14e8}'), // 󱓨 ("md_human_female", '\u{f0649}'), // 󰙉 ("md_human_female_boy", '\u{f0a59}'), // ó°©™ ("md_human_female_dance", '\u{f15c9}'), // ó±—‰ ("md_human_female_female", '\u{f0a5a}'), // ó°©š ("md_human_female_girl", '\u{f0a5b}'), // ó°©› ("md_human_greeting", '\u{f17c4}'), // 󱟄 ("md_human_greeting_proximity", '\u{f159d}'), // ó±– ("md_human_greeting_variant", '\u{f064a}'), // 󰙊 ("md_human_handsdown", '\u{f064b}'), // ó°™‹ ("md_human_handsup", '\u{f064c}'), // 󰙌 ("md_human_male", '\u{f064d}'), // ó°™ ("md_human_male_board", '\u{f0890}'), // ó°¢ ("md_human_male_board_poll", '\u{f0846}'), // 󰡆 ("md_human_male_boy", '\u{f0a5c}'), // ó°©œ ("md_human_male_child", '\u{f138c}'), // 󱎌 ("md_human_male_female", '\u{f02e8}'), // 󰋨 ("md_human_male_female_child", '\u{f1823}'), // ó± £ ("md_human_male_girl", '\u{f0a5d}'), // ó°© ("md_human_male_height", '\u{f0efb}'), // ó°»» ("md_human_male_height_variant", '\u{f0efc}'), // ó°»¼ ("md_human_male_male", '\u{f0a5e}'), // ó°©ž ("md_human_non_binary", '\u{f1848}'), // 󱡈 ("md_human_pregnant", '\u{f05cf}'), // ó°— ("md_human_queue", '\u{f1571}'), // 󱕱 ("md_human_scooter", '\u{f11e9}'), // 󱇩 ("md_human_wheelchair", '\u{f138d}'), // ó±Ž ("md_human_white_cane", '\u{f1981}'), // ó±¦ ("md_humble_bundle", '\u{f0744}'), // ó°„ ("md_hvac", '\u{f1352}'), // ó±’ ("md_hvac_off", '\u{f159e}'), // ó±–ž ("md_hydraulic_oil_level", '\u{f1324}'), // 󱌤 ("md_hydraulic_oil_temperature", '\u{f1325}'), // 󱌥 ("md_hydro_power", '\u{f12e5}'), // 󱋥 ("md_hydrogen_station", '\u{f1894}'), // ó±¢” ("md_ice_cream", '\u{f082a}'), // ó° ª ("md_ice_cream_off", '\u{f0e52}'), // ó°¹’ ("md_ice_pop", '\u{f0efd}'), // ó°»½ ("md_id_card", '\u{f0fc0}'), // ó°¿€ ("md_identifier", '\u{f0efe}'), // ó°»¾ ("md_ideogram_cjk", '\u{f1331}'), // 󱌱 ("md_ideogram_cjk_variant", '\u{f1332}'), // 󱌲 ("md_image", '\u{f02e9}'), // ó°‹© ("md_image_album", '\u{f02ea}'), // 󰋪 ("md_image_area", '\u{f02eb}'), // ó°‹« ("md_image_area_close", '\u{f02ec}'), // 󰋬 ("md_image_auto_adjust", '\u{f0fc1}'), // ó°¿ ("md_image_broken", '\u{f02ed}'), // ó°‹­ ("md_image_broken_variant", '\u{f02ee}'), // ó°‹® ("md_image_edit", '\u{f11e3}'), // 󱇣 ("md_image_edit_outline", '\u{f11e4}'), // 󱇤 ("md_image_filter_black_white", '\u{f02f0}'), // ó°‹° ("md_image_filter_center_focus", '\u{f02f1}'), // ó°‹± ("md_image_filter_center_focus_strong", '\u{f0eff}'), // ó°»¿ ("md_image_filter_center_focus_strong_outline", '\u{f0f00}'), // ó°¼€ ("md_image_filter_center_focus_weak", '\u{f02f2}'), // ó°‹² ("md_image_filter_drama", '\u{f02f3}'), // ó°‹³ ("md_image_filter_frames", '\u{f02f4}'), // ó°‹´ ("md_image_filter_hdr", '\u{f0509}'), // 󰔉 ("md_image_filter_hdr", '\u{f0509}'), // 󰔉 ("md_image_filter_none", '\u{f02f6}'), // ó°‹¶ ("md_image_filter_tilt_shift", '\u{f02f7}'), // ó°‹· ("md_image_filter_vintage", '\u{f02f8}'), // 󰋸 ("md_image_frame", '\u{f0e49}'), // 󰹉 ("md_image_lock", '\u{f1ab0}'), // 󱪰 ("md_image_lock_outline", '\u{f1ab1}'), // 󱪱 ("md_image_marker", '\u{f177b}'), // ó±» ("md_image_marker_outline", '\u{f177c}'), // ó±¼ ("md_image_minus", '\u{f1419}'), // ó±™ ("md_image_move", '\u{f09f8}'), // 󰧸 ("md_image_multiple", '\u{f02f9}'), // ó°‹¹ ("md_image_multiple_outline", '\u{f02ef}'), // 󰋯 ("md_image_off", '\u{f082b}'), // ó° « ("md_image_off_outline", '\u{f11d1}'), // 󱇑 ("md_image_outline", '\u{f0976}'), // ó°¥¶ ("md_image_plus", '\u{f087c}'), // ó°¡¼ ("md_image_refresh", '\u{f19fe}'), // ó±§¾ ("md_image_refresh_outline", '\u{f19ff}'), // ó±§¿ ("md_image_remove", '\u{f1418}'), // ó±˜ ("md_image_search", '\u{f0977}'), // ó°¥· ("md_image_search_outline", '\u{f0978}'), // 󰥸 ("md_image_size_select_actual", '\u{f0c8d}'), // ó°² ("md_image_size_select_large", '\u{f0c8e}'), // 󰲎 ("md_image_size_select_small", '\u{f0c8f}'), // ó°² ("md_image_sync", '\u{f1a00}'), // 󱨀 ("md_image_sync_outline", '\u{f1a01}'), // ó±¨ ("md_image_text", '\u{f160d}'), // ó±˜ ("md_import", '\u{f02fa}'), // 󰋺 ("md_inbox", '\u{f0687}'), // 󰚇 ("md_inbox_arrow_down", '\u{f02fb}'), // ó°‹» ("md_inbox_arrow_down_outline", '\u{f1270}'), // 󱉰 ("md_inbox_arrow_up", '\u{f03d1}'), // ó°‘ ("md_inbox_arrow_up_outline", '\u{f1271}'), // 󱉱 ("md_inbox_full", '\u{f1272}'), // 󱉲 ("md_inbox_full_outline", '\u{f1273}'), // 󱉳 ("md_inbox_multiple", '\u{f08b0}'), // ó°¢° ("md_inbox_multiple_outline", '\u{f0ba8}'), // 󰮨 ("md_inbox_outline", '\u{f1274}'), // 󱉴 ("md_inbox_remove", '\u{f159f}'), // ó±–Ÿ ("md_inbox_remove_outline", '\u{f15a0}'), // ó±–  ("md_incognito", '\u{f05f9}'), // ó°—¹ ("md_incognito_circle", '\u{f1421}'), // ó±¡ ("md_incognito_circle_off", '\u{f1422}'), // ó±¢ ("md_incognito_off", '\u{f0075}'), // ó°µ ("md_induction", '\u{f184c}'), // 󱡌 ("md_infinity", '\u{f06e4}'), // 󰛤 ("md_information", '\u{f02fc}'), // ó°‹¼ ("md_information_off", '\u{f178c}'), // 󱞌 ("md_information_off_outline", '\u{f178d}'), // ó±ž ("md_information_outline", '\u{f02fd}'), // ó°‹½ ("md_information_variant", '\u{f064e}'), // 󰙎 ("md_instagram", '\u{f02fe}'), // ó°‹¾ ("md_instrument_triangle", '\u{f104e}'), // ó±Ž ("md_integrated_circuit_chip", '\u{f1913}'), // 󱤓 ("md_invert_colors", '\u{f0301}'), // ó°Œ ("md_invert_colors_off", '\u{f0e4a}'), // 󰹊 ("md_iobroker", '\u{f12e8}'), // 󱋨 ("md_ip", '\u{f0a5f}'), // ó°©Ÿ ("md_ip_network", '\u{f0a60}'), // ó°©  ("md_ip_network_outline", '\u{f0c90}'), // ó°² ("md_ip_outline", '\u{f1982}'), // 󱦂 ("md_ipod", '\u{f0c91}'), // 󰲑 ("md_iron", '\u{f1824}'), // ó± ¤ ("md_iron_board", '\u{f1838}'), // ó± ¸ ("md_iron_outline", '\u{f1825}'), // ó± ¥ ("md_island", '\u{f104f}'), // ó± ("md_iv_bag", '\u{f10b9}'), // 󱂹 ("md_jabber", '\u{f0dd5}'), // ó°·• ("md_jeepney", '\u{f0302}'), // 󰌂 ("md_jellyfish", '\u{f0f01}'), // ó°¼ ("md_jellyfish_outline", '\u{f0f02}'), // 󰼂 ("md_jira", '\u{f0303}'), // 󰌃 ("md_jquery", '\u{f087d}'), // ó°¡½ ("md_jsfiddle", '\u{f0304}'), // 󰌄 ("md_jump_rope", '\u{f12ff}'), // 󱋿 ("md_kabaddi", '\u{f0d87}'), // 󰶇 ("md_kangaroo", '\u{f1558}'), // 󱕘 ("md_karate", '\u{f082c}'), // ó° ¬ ("md_kayaking", '\u{f08af}'), // 󰢯 ("md_keg", '\u{f0305}'), // 󰌅 ("md_kettle", '\u{f05fa}'), // ó°—º ("md_kettle_alert", '\u{f1317}'), // 󱌗 ("md_kettle_alert_outline", '\u{f1318}'), // 󱌘 ("md_kettle_off", '\u{f131b}'), // 󱌛 ("md_kettle_off_outline", '\u{f131c}'), // 󱌜 ("md_kettle_outline", '\u{f0f56}'), // ó°½– ("md_kettle_pour_over", '\u{f173c}'), // 󱜼 ("md_kettle_steam", '\u{f1319}'), // 󱌙 ("md_kettle_steam_outline", '\u{f131a}'), // 󱌚 ("md_kettlebell", '\u{f1300}'), // 󱌀 ("md_key", '\u{f0306}'), // 󰌆 ("md_key_alert", '\u{f1983}'), // 󱦃 ("md_key_alert_outline", '\u{f1984}'), // 󱦄 ("md_key_arrow_right", '\u{f1312}'), // 󱌒 ("md_key_chain", '\u{f1574}'), // 󱕴 ("md_key_chain_variant", '\u{f1575}'), // 󱕵 ("md_key_change", '\u{f0307}'), // 󰌇 ("md_key_link", '\u{f119f}'), // 󱆟 ("md_key_minus", '\u{f0308}'), // 󰌈 ("md_key_outline", '\u{f0dd6}'), // ó°·– ("md_key_plus", '\u{f0309}'), // 󰌉 ("md_key_remove", '\u{f030a}'), // 󰌊 ("md_key_star", '\u{f119e}'), // 󱆞 ("md_key_variant", '\u{f030b}'), // 󰌋 ("md_key_wireless", '\u{f0fc2}'), // ó°¿‚ ("md_keyboard", '\u{f030c}'), // 󰌌 ("md_keyboard_backspace", '\u{f030d}'), // ó°Œ ("md_keyboard_caps", '\u{f030e}'), // 󰌎 ("md_keyboard_close", '\u{f030f}'), // ó°Œ ("md_keyboard_esc", '\u{f12b7}'), // 󱊷 ("md_keyboard_f1", '\u{f12ab}'), // 󱊫 ("md_keyboard_f2", '\u{f12ac}'), // 󱊬 ("md_keyboard_f3", '\u{f12ad}'), // 󱊭 ("md_keyboard_f4", '\u{f12ae}'), // 󱊮 ("md_keyboard_f5", '\u{f12af}'), // 󱊯 ("md_keyboard_f6", '\u{f12b0}'), // 󱊰 ("md_keyboard_f7", '\u{f12b1}'), // 󱊱 ("md_keyboard_f8", '\u{f12b2}'), // 󱊲 ("md_keyboard_f9", '\u{f12b3}'), // 󱊳 ("md_keyboard_f10", '\u{f12b4}'), // 󱊴 ("md_keyboard_f11", '\u{f12b5}'), // 󱊵 ("md_keyboard_f12", '\u{f12b6}'), // 󱊶 ("md_keyboard_off", '\u{f0310}'), // ó°Œ ("md_keyboard_off_outline", '\u{f0e4b}'), // 󰹋 ("md_keyboard_outline", '\u{f097b}'), // ó°¥» ("md_keyboard_return", '\u{f0311}'), // 󰌑 ("md_keyboard_settings", '\u{f09f9}'), // ó°§¹ ("md_keyboard_settings_outline", '\u{f09fa}'), // 󰧺 ("md_keyboard_space", '\u{f1050}'), // ó± ("md_keyboard_tab", '\u{f0312}'), // 󰌒 ("md_keyboard_tab_reverse", '\u{f0325}'), // 󰌥 ("md_keyboard_variant", '\u{f0313}'), // 󰌓 ("md_khanda", '\u{f10fd}'), // 󱃽 ("md_kickstarter", '\u{f0745}'), // ó°… ("md_kite", '\u{f1985}'), // 󱦅 ("md_kite_outline", '\u{f1986}'), // 󱦆 ("md_kitesurfing", '\u{f1744}'), // ó±„ ("md_klingon", '\u{f135b}'), // ó±› ("md_knife", '\u{f09fb}'), // ó°§» ("md_knife_military", '\u{f09fc}'), // ó°§¼ ("md_koala", '\u{f173f}'), // 󱜿 ("md_kodi", '\u{f0314}'), // 󰌔 ("md_kubernetes", '\u{f10fe}'), // 󱃾 ("md_label", '\u{f0315}'), // 󰌕 ("md_label_multiple", '\u{f1375}'), // ó±µ ("md_label_multiple_outline", '\u{f1376}'), // ó±¶ ("md_label_off", '\u{f0acb}'), // ó°«‹ ("md_label_off_outline", '\u{f0acc}'), // ó°«Œ ("md_label_outline", '\u{f0316}'), // 󰌖 ("md_label_percent", '\u{f12ea}'), // 󱋪 ("md_label_percent_outline", '\u{f12eb}'), // 󱋫 ("md_label_variant", '\u{f0acd}'), // ó°« ("md_label_variant_outline", '\u{f0ace}'), // ó°«Ž ("md_ladder", '\u{f15a2}'), // ó±–¢ ("md_ladybug", '\u{f082d}'), // ó° ­ ("md_lambda", '\u{f0627}'), // 󰘧 ("md_lamp", '\u{f06b5}'), // ó°šµ ("md_lamp_outline", '\u{f17d0}'), // ó±Ÿ ("md_lamps", '\u{f1576}'), // 󱕶 ("md_lamps_outline", '\u{f17d1}'), // 󱟑 ("md_lan", '\u{f0317}'), // 󰌗 ("md_lan_check", '\u{f12aa}'), // 󱊪 ("md_lan_connect", '\u{f0318}'), // 󰌘 ("md_lan_disconnect", '\u{f0319}'), // 󰌙 ("md_lan_pending", '\u{f031a}'), // 󰌚 ("md_land_fields", '\u{f1ab2}'), // 󱪲 ("md_land_plots", '\u{f1ab3}'), // 󱪳 ("md_land_plots_circle", '\u{f1ab4}'), // 󱪴 ("md_land_plots_circle_variant", '\u{f1ab5}'), // 󱪵 ("md_land_rows_horizontal", '\u{f1ab6}'), // 󱪶 ("md_land_rows_vertical", '\u{f1ab7}'), // 󱪷 ("md_landslide", '\u{f1a48}'), // 󱩈 ("md_landslide_outline", '\u{f1a49}'), // 󱩉 ("md_language_c", '\u{f0671}'), // ó°™± ("md_language_cpp", '\u{f0672}'), // ó°™² ("md_language_csharp", '\u{f031b}'), // 󰌛 ("md_language_css3", '\u{f031c}'), // 󰌜 ("md_language_fortran", '\u{f121a}'), // 󱈚 ("md_language_go", '\u{f07d3}'), // ó°Ÿ“ ("md_language_haskell", '\u{f0c92}'), // ó°²’ ("md_language_html5", '\u{f031d}'), // ó°Œ ("md_language_java", '\u{f0b37}'), // ó°¬· ("md_language_javascript", '\u{f031e}'), // 󰌞 ("md_language_kotlin", '\u{f1219}'), // 󱈙 ("md_language_lua", '\u{f08b1}'), // ó°¢± ("md_language_markdown", '\u{f0354}'), // ó°” ("md_language_markdown_outline", '\u{f0f5b}'), // ó°½› ("md_language_php", '\u{f031f}'), // 󰌟 ("md_language_python", '\u{f0320}'), // 󰌠 ("md_language_r", '\u{f07d4}'), // ó°Ÿ” ("md_language_ruby", '\u{f0d2d}'), // ó°´­ ("md_language_ruby_on_rails", '\u{f0acf}'), // ó°« ("md_language_rust", '\u{f1617}'), // 󱘗 ("md_language_swift", '\u{f06e5}'), // 󰛥 ("md_language_typescript", '\u{f06e6}'), // 󰛦 ("md_language_xaml", '\u{f0673}'), // ó°™³ ("md_laptop", '\u{f0322}'), // 󰌢 ("md_laptop_account", '\u{f1a4a}'), // 󱩊 ("md_laptop_off", '\u{f06e7}'), // ó°›§ ("md_laravel", '\u{f0ad0}'), // ó°« ("md_laser_pointer", '\u{f1484}'), // ó±’„ ("md_lasso", '\u{f0f03}'), // 󰼃 ("md_lastpass", '\u{f0446}'), // 󰑆 ("md_latitude", '\u{f0f57}'), // ó°½— ("md_launch", '\u{f0327}'), // 󰌧 ("md_lava_lamp", '\u{f07d5}'), // ó°Ÿ• ("md_layers", '\u{f0328}'), // 󰌨 ("md_layers_edit", '\u{f1892}'), // ó±¢’ ("md_layers_minus", '\u{f0e4c}'), // 󰹌 ("md_layers_off", '\u{f0329}'), // 󰌩 ("md_layers_off_outline", '\u{f09fd}'), // ó°§½ ("md_layers_outline", '\u{f09fe}'), // ó°§¾ ("md_layers_plus", '\u{f0e4d}'), // ó°¹ ("md_layers_remove", '\u{f0e4e}'), // 󰹎 ("md_layers_search", '\u{f1206}'), // 󱈆 ("md_layers_search_outline", '\u{f1207}'), // 󱈇 ("md_layers_triple", '\u{f0f58}'), // 󰽘 ("md_layers_triple_outline", '\u{f0f59}'), // ó°½™ ("md_lead_pencil", '\u{f064f}'), // ó°™ ("md_leaf", '\u{f032a}'), // 󰌪 ("md_leaf_circle", '\u{f1905}'), // 󱤅 ("md_leaf_circle_outline", '\u{f1906}'), // 󱤆 ("md_leaf_maple", '\u{f0c93}'), // 󰲓 ("md_leaf_maple_off", '\u{f12da}'), // 󱋚 ("md_leaf_off", '\u{f12d9}'), // 󱋙 ("md_leak", '\u{f0dd7}'), // ó°·— ("md_leak_off", '\u{f0dd8}'), // ó°·˜ ("md_lecturn", '\u{f1af0}'), // 󱫰 ("md_led_off", '\u{f032b}'), // 󰌫 ("md_led_on", '\u{f032c}'), // 󰌬 ("md_led_outline", '\u{f032d}'), // 󰌭 ("md_led_strip", '\u{f07d6}'), // ó°Ÿ– ("md_led_strip_variant", '\u{f1051}'), // ó±‘ ("md_led_strip_variant_off", '\u{f1a4b}'), // 󱩋 ("md_led_variant_off", '\u{f032e}'), // 󰌮 ("md_led_variant_on", '\u{f032f}'), // 󰌯 ("md_led_variant_outline", '\u{f0330}'), // 󰌰 ("md_leek", '\u{f117d}'), // ó±…½ ("md_less_than", '\u{f097c}'), // ó°¥¼ ("md_less_than_or_equal", '\u{f097d}'), // ó°¥½ ("md_library", '\u{f0331}'), // 󰌱 ("md_library_outline", '\u{f1a22}'), // 󱨢 ("md_library_shelves", '\u{f0ba9}'), // ó°®© ("md_license", '\u{f0fc3}'), // 󰿃 ("md_lifebuoy", '\u{f087e}'), // ó°¡¾ ("md_light_flood_down", '\u{f1987}'), // 󱦇 ("md_light_flood_up", '\u{f1988}'), // 󱦈 ("md_light_recessed", '\u{f179b}'), // 󱞛 ("md_light_switch", '\u{f097e}'), // ó°¥¾ ("md_light_switch_off", '\u{f1a24}'), // 󱨤 ("md_lightbulb", '\u{f0335}'), // 󰌵 ("md_lightbulb_alert", '\u{f19e1}'), // ó±§¡ ("md_lightbulb_alert_outline", '\u{f19e2}'), // ó±§¢ ("md_lightbulb_auto", '\u{f1800}'), // ó± € ("md_lightbulb_auto_outline", '\u{f1801}'), // ó±  ("md_lightbulb_cfl", '\u{f1208}'), // 󱈈 ("md_lightbulb_cfl_off", '\u{f1209}'), // 󱈉 ("md_lightbulb_cfl_spiral", '\u{f1275}'), // 󱉵 ("md_lightbulb_cfl_spiral_off", '\u{f12c3}'), // 󱋃 ("md_lightbulb_fluorescent_tube", '\u{f1804}'), // ó± „ ("md_lightbulb_fluorescent_tube_outline", '\u{f1805}'), // ó± … ("md_lightbulb_group", '\u{f1253}'), // 󱉓 ("md_lightbulb_group_off", '\u{f12cd}'), // ó±‹ ("md_lightbulb_group_off_outline", '\u{f12ce}'), // 󱋎 ("md_lightbulb_group_outline", '\u{f1254}'), // 󱉔 ("md_lightbulb_multiple", '\u{f1255}'), // 󱉕 ("md_lightbulb_multiple_off", '\u{f12cf}'), // ó±‹ ("md_lightbulb_multiple_off_outline", '\u{f12d0}'), // ó±‹ ("md_lightbulb_multiple_outline", '\u{f1256}'), // 󱉖 ("md_lightbulb_night", '\u{f1a4c}'), // 󱩌 ("md_lightbulb_night_outline", '\u{f1a4d}'), // ó±© ("md_lightbulb_off", '\u{f0e4f}'), // ó°¹ ("md_lightbulb_off_outline", '\u{f0e50}'), // ó°¹ ("md_lightbulb_on", '\u{f06e8}'), // 󰛨 ("md_lightbulb_on_10", '\u{f1a4e}'), // 󱩎 ("md_lightbulb_on_20", '\u{f1a4f}'), // ó±© ("md_lightbulb_on_30", '\u{f1a50}'), // ó±© ("md_lightbulb_on_40", '\u{f1a51}'), // 󱩑 ("md_lightbulb_on_50", '\u{f1a52}'), // 󱩒 ("md_lightbulb_on_60", '\u{f1a53}'), // 󱩓 ("md_lightbulb_on_70", '\u{f1a54}'), // 󱩔 ("md_lightbulb_on_80", '\u{f1a55}'), // 󱩕 ("md_lightbulb_on_90", '\u{f1a56}'), // 󱩖 ("md_lightbulb_on_outline", '\u{f06e9}'), // ó°›© ("md_lightbulb_outline", '\u{f0336}'), // 󰌶 ("md_lightbulb_question", '\u{f19e3}'), // ó±§£ ("md_lightbulb_question_outline", '\u{f19e4}'), // 󱧤 ("md_lightbulb_spot", '\u{f17f4}'), // 󱟴 ("md_lightbulb_spot_off", '\u{f17f5}'), // 󱟵 ("md_lightbulb_variant", '\u{f1802}'), // ó± ‚ ("md_lightbulb_variant_outline", '\u{f1803}'), // ó± ƒ ("md_lighthouse", '\u{f09ff}'), // ó°§¿ ("md_lighthouse_on", '\u{f0a00}'), // 󰨀 ("md_lightning_bolt", '\u{f140b}'), // ó±‹ ("md_lightning_bolt_circle", '\u{f0820}'), // ó°   ("md_lightning_bolt_outline", '\u{f140c}'), // ó±Œ ("md_line_scan", '\u{f0624}'), // 󰘤 ("md_lingerie", '\u{f1476}'), // 󱑶 ("md_link", '\u{f0337}'), // 󰌷 ("md_link_box", '\u{f0d1a}'), // ó°´š ("md_link_box_outline", '\u{f0d1b}'), // ó°´› ("md_link_box_variant", '\u{f0d1c}'), // ó°´œ ("md_link_box_variant_outline", '\u{f0d1d}'), // ó°´ ("md_link_lock", '\u{f10ba}'), // 󱂺 ("md_link_off", '\u{f0338}'), // 󰌸 ("md_link_plus", '\u{f0c94}'), // ó°²” ("md_link_variant", '\u{f0339}'), // 󰌹 ("md_link_variant_minus", '\u{f10ff}'), // 󱃿 ("md_link_variant_off", '\u{f033a}'), // 󰌺 ("md_link_variant_plus", '\u{f1100}'), // 󱄀 ("md_link_variant_remove", '\u{f1101}'), // ó±„ ("md_linkedin", '\u{f033b}'), // 󰌻 ("md_linux", '\u{f033d}'), // 󰌽 ("md_linux_mint", '\u{f08ed}'), // ó°£­ ("md_lipstick", '\u{f13b5}'), // 󱎵 ("md_liquid_spot", '\u{f1826}'), // ó± ¦ ("md_liquor", '\u{f191e}'), // 󱤞 ("md_list_status", '\u{f15ab}'), // ó±–« ("md_litecoin", '\u{f0a61}'), // ó°©¡ ("md_loading", '\u{f0772}'), // ó°² ("md_location_enter", '\u{f0fc4}'), // ó°¿„ ("md_location_exit", '\u{f0fc5}'), // ó°¿… ("md_lock", '\u{f033e}'), // 󰌾 ("md_lock_alert", '\u{f08ee}'), // ó°£® ("md_lock_alert_outline", '\u{f15d1}'), // ó±—‘ ("md_lock_check", '\u{f139a}'), // 󱎚 ("md_lock_check_outline", '\u{f16a8}'), // 󱚨 ("md_lock_clock", '\u{f097f}'), // 󰥿 ("md_lock_minus", '\u{f16a9}'), // 󱚩 ("md_lock_minus_outline", '\u{f16aa}'), // 󱚪 ("md_lock_off", '\u{f1671}'), // ó±™± ("md_lock_off_outline", '\u{f1672}'), // ó±™² ("md_lock_open", '\u{f033f}'), // 󰌿 ("md_lock_open_alert", '\u{f139b}'), // 󱎛 ("md_lock_open_alert_outline", '\u{f15d2}'), // ó±—’ ("md_lock_open_check", '\u{f139c}'), // 󱎜 ("md_lock_open_check_outline", '\u{f16ab}'), // 󱚫 ("md_lock_open_minus", '\u{f16ac}'), // 󱚬 ("md_lock_open_minus_outline", '\u{f16ad}'), // 󱚭 ("md_lock_open_outline", '\u{f0340}'), // ó°€ ("md_lock_open_plus", '\u{f16ae}'), // 󱚮 ("md_lock_open_plus_outline", '\u{f16af}'), // 󱚯 ("md_lock_open_remove", '\u{f16b0}'), // 󱚰 ("md_lock_open_remove_outline", '\u{f16b1}'), // 󱚱 ("md_lock_open_variant", '\u{f0fc6}'), // 󰿆 ("md_lock_open_variant_outline", '\u{f0fc7}'), // 󰿇 ("md_lock_outline", '\u{f0341}'), // ó° ("md_lock_pattern", '\u{f06ea}'), // 󰛪 ("md_lock_plus", '\u{f05fb}'), // ó°—» ("md_lock_plus_outline", '\u{f16b2}'), // 󱚲 ("md_lock_question", '\u{f08ef}'), // 󰣯 ("md_lock_remove", '\u{f16b3}'), // 󱚳 ("md_lock_remove_outline", '\u{f16b4}'), // 󱚴 ("md_lock_reset", '\u{f0773}'), // ó°³ ("md_lock_smart", '\u{f08b2}'), // ó°¢² ("md_locker", '\u{f07d7}'), // ó°Ÿ— ("md_locker_multiple", '\u{f07d8}'), // 󰟘 ("md_login", '\u{f0342}'), // ó°‚ ("md_logout", '\u{f0343}'), // ó°ƒ ("md_logout_variant", '\u{f05fd}'), // ó°—½ ("md_longitude", '\u{f0f5a}'), // 󰽚 ("md_looks", '\u{f0344}'), // ó°„ ("md_lotion", '\u{f1582}'), // ó±–‚ ("md_lotion_outline", '\u{f1583}'), // ó±–ƒ ("md_lotion_plus", '\u{f1584}'), // ó±–„ ("md_lotion_plus_outline", '\u{f1585}'), // ó±–… ("md_loupe", '\u{f0345}'), // ó°… ("md_lumx", '\u{f0346}'), // ó°† ("md_lungs", '\u{f1084}'), // 󱂄 ("md_mace", '\u{f1843}'), // 󱡃 ("md_magazine_pistol", '\u{f0324}'), // 󰌤 ("md_magazine_rifle", '\u{f0323}'), // 󰌣 ("md_magic_staff", '\u{f1844}'), // 󱡄 ("md_magnet", '\u{f0347}'), // ó°‡ ("md_magnet_on", '\u{f0348}'), // ó°ˆ ("md_magnify", '\u{f0349}'), // ó°‰ ("md_magnify_close", '\u{f0980}'), // 󰦀 ("md_magnify_expand", '\u{f1874}'), // 󱡴 ("md_magnify_minus", '\u{f034a}'), // ó°Š ("md_magnify_minus_cursor", '\u{f0a62}'), // ó°©¢ ("md_magnify_minus_outline", '\u{f06ec}'), // 󰛬 ("md_magnify_plus", '\u{f034b}'), // ó°‹ ("md_magnify_plus_cursor", '\u{f0a63}'), // ó°©£ ("md_magnify_plus_outline", '\u{f06ed}'), // ó°›­ ("md_magnify_remove_cursor", '\u{f120c}'), // 󱈌 ("md_magnify_remove_outline", '\u{f120d}'), // ó±ˆ ("md_magnify_scan", '\u{f1276}'), // 󱉶 ("md_mail", '\u{f0ebb}'), // 󰺻 ("md_mailbox", '\u{f06ee}'), // ó°›® ("md_mailbox_open", '\u{f0d88}'), // 󰶈 ("md_mailbox_open_outline", '\u{f0d89}'), // 󰶉 ("md_mailbox_open_up", '\u{f0d8a}'), // ó°¶Š ("md_mailbox_open_up_outline", '\u{f0d8b}'), // ó°¶‹ ("md_mailbox_outline", '\u{f0d8c}'), // ó°¶Œ ("md_mailbox_up", '\u{f0d8d}'), // ó°¶ ("md_mailbox_up_outline", '\u{f0d8e}'), // ó°¶Ž ("md_manjaro", '\u{f160a}'), // 󱘊 ("md_map", '\u{f034d}'), // ó° ("md_map_check", '\u{f0ebc}'), // 󰺼 ("md_map_check_outline", '\u{f0ebd}'), // 󰺽 ("md_map_clock", '\u{f0d1e}'), // ó°´ž ("md_map_clock_outline", '\u{f0d1f}'), // ó°´Ÿ ("md_map_legend", '\u{f0a01}'), // ó°¨ ("md_map_marker", '\u{f034e}'), // ó°Ž ("md_map_marker_account", '\u{f18e3}'), // ó±££ ("md_map_marker_account_outline", '\u{f18e4}'), // 󱣤 ("md_map_marker_alert", '\u{f0f05}'), // ó°¼… ("md_map_marker_alert_outline", '\u{f0f06}'), // 󰼆 ("md_map_marker_check", '\u{f0c95}'), // 󰲕 ("md_map_marker_check_outline", '\u{f12fb}'), // 󱋻 ("md_map_marker_circle", '\u{f034f}'), // ó° ("md_map_marker_distance", '\u{f08f0}'), // ó°£° ("md_map_marker_down", '\u{f1102}'), // 󱄂 ("md_map_marker_left", '\u{f12db}'), // 󱋛 ("md_map_marker_left_outline", '\u{f12dd}'), // ó±‹ ("md_map_marker_minus", '\u{f0650}'), // ó°™ ("md_map_marker_minus_outline", '\u{f12f9}'), // 󱋹 ("md_map_marker_multiple", '\u{f0350}'), // ó° ("md_map_marker_multiple_outline", '\u{f1277}'), // 󱉷 ("md_map_marker_off", '\u{f0351}'), // ó°‘ ("md_map_marker_off_outline", '\u{f12fd}'), // 󱋽 ("md_map_marker_outline", '\u{f07d9}'), // ó°Ÿ™ ("md_map_marker_path", '\u{f0d20}'), // ó°´  ("md_map_marker_plus", '\u{f0651}'), // ó°™‘ ("md_map_marker_plus_outline", '\u{f12f8}'), // 󱋸 ("md_map_marker_question", '\u{f0f07}'), // 󰼇 ("md_map_marker_question_outline", '\u{f0f08}'), // 󰼈 ("md_map_marker_radius", '\u{f0352}'), // ó°’ ("md_map_marker_radius_outline", '\u{f12fc}'), // 󱋼 ("md_map_marker_remove", '\u{f0f09}'), // 󰼉 ("md_map_marker_remove_outline", '\u{f12fa}'), // 󱋺 ("md_map_marker_remove_variant", '\u{f0f0a}'), // 󰼊 ("md_map_marker_right", '\u{f12dc}'), // 󱋜 ("md_map_marker_right_outline", '\u{f12de}'), // 󱋞 ("md_map_marker_star", '\u{f1608}'), // 󱘈 ("md_map_marker_star_outline", '\u{f1609}'), // 󱘉 ("md_map_marker_up", '\u{f1103}'), // 󱄃 ("md_map_minus", '\u{f0981}'), // ó°¦ ("md_map_outline", '\u{f0982}'), // 󰦂 ("md_map_plus", '\u{f0983}'), // 󰦃 ("md_map_search", '\u{f0984}'), // 󰦄 ("md_map_search_outline", '\u{f0985}'), // ó°¦… ("md_mapbox", '\u{f0baa}'), // 󰮪 ("md_margin", '\u{f0353}'), // ó°“ ("md_marker", '\u{f0652}'), // ó°™’ ("md_marker_cancel", '\u{f0dd9}'), // ó°·™ ("md_marker_check", '\u{f0355}'), // ó°• ("md_mastodon", '\u{f0ad1}'), // ó°«‘ ("md_material_design", '\u{f0986}'), // 󰦆 ("md_material_ui", '\u{f0357}'), // ó°— ("md_math_compass", '\u{f0358}'), // ó°˜ ("md_math_cos", '\u{f0c96}'), // ó°²– ("md_math_integral", '\u{f0fc8}'), // 󰿈 ("md_math_integral_box", '\u{f0fc9}'), // 󰿉 ("md_math_log", '\u{f1085}'), // 󱂅 ("md_math_norm", '\u{f0fca}'), // ó°¿Š ("md_math_norm_box", '\u{f0fcb}'), // ó°¿‹ ("md_math_sin", '\u{f0c97}'), // ó°²— ("md_math_tan", '\u{f0c98}'), // 󰲘 ("md_matrix", '\u{f0628}'), // 󰘨 ("md_medal", '\u{f0987}'), // 󰦇 ("md_medal_outline", '\u{f1326}'), // 󱌦 ("md_medical_bag", '\u{f06ef}'), // 󰛯 ("md_medical_cotton_swab", '\u{f1ab8}'), // 󱪸 ("md_meditation", '\u{f117b}'), // ó±…» ("md_memory", '\u{f035b}'), // ó°› ("md_menorah", '\u{f17d4}'), // 󱟔 ("md_menorah_fire", '\u{f17d5}'), // 󱟕 ("md_menu", '\u{f035c}'), // ó°œ ("md_menu_down", '\u{f035d}'), // ó° ("md_menu_down_outline", '\u{f06b6}'), // ó°š¶ ("md_menu_left", '\u{f035e}'), // ó°ž ("md_menu_left_outline", '\u{f0a02}'), // 󰨂 ("md_menu_open", '\u{f0bab}'), // ó°®« ("md_menu_right", '\u{f035f}'), // ó°Ÿ ("md_menu_right_outline", '\u{f0a03}'), // 󰨃 ("md_menu_swap", '\u{f0a64}'), // 󰩤 ("md_menu_swap_outline", '\u{f0a65}'), // ó°©¥ ("md_menu_up", '\u{f0360}'), // ó°  ("md_menu_up_outline", '\u{f06b7}'), // ó°š· ("md_merge", '\u{f0f5c}'), // 󰽜 ("md_message", '\u{f0361}'), // ó°¡ ("md_message_alert", '\u{f0362}'), // ó°¢ ("md_message_alert_outline", '\u{f0a04}'), // 󰨄 ("md_message_arrow_left", '\u{f12f2}'), // 󱋲 ("md_message_arrow_left_outline", '\u{f12f3}'), // 󱋳 ("md_message_arrow_right", '\u{f12f4}'), // 󱋴 ("md_message_arrow_right_outline", '\u{f12f5}'), // 󱋵 ("md_message_badge", '\u{f1941}'), // ó±¥ ("md_message_badge_outline", '\u{f1942}'), // 󱥂 ("md_message_bookmark", '\u{f15ac}'), // ó±–¬ ("md_message_bookmark_outline", '\u{f15ad}'), // ó±–­ ("md_message_bulleted", '\u{f06a2}'), // 󰚢 ("md_message_bulleted_off", '\u{f06a3}'), // 󰚣 ("md_message_cog", '\u{f06f1}'), // ó°›± ("md_message_cog_outline", '\u{f1172}'), // ó±…² ("md_message_draw", '\u{f0363}'), // ó°£ ("md_message_fast", '\u{f19cc}'), // ó±§Œ ("md_message_fast_outline", '\u{f19cd}'), // ó±§ ("md_message_flash", '\u{f15a9}'), // ó±–© ("md_message_flash_outline", '\u{f15aa}'), // ó±–ª ("md_message_image", '\u{f0364}'), // ó°¤ ("md_message_image_outline", '\u{f116c}'), // ó±…¬ ("md_message_lock", '\u{f0fcc}'), // ó°¿Œ ("md_message_lock_outline", '\u{f116d}'), // ó±…­ ("md_message_minus", '\u{f116e}'), // ó±…® ("md_message_minus_outline", '\u{f116f}'), // ó±…¯ ("md_message_off", '\u{f164d}'), // ó±™ ("md_message_off_outline", '\u{f164e}'), // 󱙎 ("md_message_outline", '\u{f0365}'), // ó°¥ ("md_message_plus", '\u{f0653}'), // ó°™“ ("md_message_plus_outline", '\u{f10bb}'), // 󱂻 ("md_message_processing", '\u{f0366}'), // ó°¦ ("md_message_processing_outline", '\u{f1170}'), // ó±…° ("md_message_question", '\u{f173a}'), // 󱜺 ("md_message_question_outline", '\u{f173b}'), // 󱜻 ("md_message_reply", '\u{f0367}'), // ó°§ ("md_message_reply_outline", '\u{f173d}'), // 󱜽 ("md_message_reply_text", '\u{f0368}'), // ó°¨ ("md_message_reply_text_outline", '\u{f173e}'), // 󱜾 ("md_message_settings", '\u{f06f0}'), // ó°›° ("md_message_settings_outline", '\u{f1171}'), // ó±…± ("md_message_star", '\u{f069a}'), // ó°šš ("md_message_star_outline", '\u{f1250}'), // ó±‰ ("md_message_text", '\u{f0369}'), // ó°© ("md_message_text_clock", '\u{f1173}'), // ó±…³ ("md_message_text_clock_outline", '\u{f1174}'), // ó±…´ ("md_message_text_fast", '\u{f19ce}'), // ó±§Ž ("md_message_text_fast_outline", '\u{f19cf}'), // ó±§ ("md_message_text_lock", '\u{f0fcd}'), // ó°¿ ("md_message_text_lock_outline", '\u{f1175}'), // ó±…µ ("md_message_text_outline", '\u{f036a}'), // ó°ª ("md_message_video", '\u{f036b}'), // ó°« ("md_meteor", '\u{f0629}'), // 󰘩 ("md_meter_electric", '\u{f1a57}'), // 󱩗 ("md_meter_electric_outline", '\u{f1a58}'), // 󱩘 ("md_meter_gas", '\u{f1a59}'), // 󱩙 ("md_meter_gas_outline", '\u{f1a5a}'), // 󱩚 ("md_metronome", '\u{f07da}'), // ó°Ÿš ("md_metronome_tick", '\u{f07db}'), // ó°Ÿ› ("md_micro_sd", '\u{f07dc}'), // ó°Ÿœ ("md_microphone", '\u{f036c}'), // ó°¬ ("md_microphone_minus", '\u{f08b3}'), // ó°¢³ ("md_microphone_off", '\u{f036d}'), // ó°­ ("md_microphone_outline", '\u{f036e}'), // ó°® ("md_microphone_plus", '\u{f08b4}'), // ó°¢´ ("md_microphone_question", '\u{f1989}'), // 󱦉 ("md_microphone_question_outline", '\u{f198a}'), // 󱦊 ("md_microphone_settings", '\u{f036f}'), // ó°¯ ("md_microphone_variant", '\u{f0370}'), // ó°° ("md_microphone_variant_off", '\u{f0371}'), // ó°± ("md_microscope", '\u{f0654}'), // ó°™” ("md_microsoft", '\u{f0372}'), // ó°² ("md_microsoft_access", '\u{f138e}'), // 󱎎 ("md_microsoft_azure", '\u{f0805}'), // ó° … ("md_microsoft_azure_devops", '\u{f0fd5}'), // ó°¿• ("md_microsoft_bing", '\u{f00a4}'), // 󰂤 ("md_microsoft_dynamics_365", '\u{f0988}'), // 󰦈 ("md_microsoft_edge", '\u{f01e9}'), // 󰇩 ("md_microsoft_excel", '\u{f138f}'), // ó±Ž ("md_microsoft_internet_explorer", '\u{f0300}'), // 󰌀 ("md_microsoft_office", '\u{f03c6}'), // ó°† ("md_microsoft_onedrive", '\u{f03ca}'), // ó°Š ("md_microsoft_onenote", '\u{f0747}'), // ó°‡ ("md_microsoft_outlook", '\u{f0d22}'), // ó°´¢ ("md_microsoft_powerpoint", '\u{f1390}'), // ó±Ž ("md_microsoft_sharepoint", '\u{f1391}'), // 󱎑 ("md_microsoft_teams", '\u{f02bb}'), // ó°Š» ("md_microsoft_visual_studio", '\u{f0610}'), // ó°˜ ("md_microsoft_visual_studio_code", '\u{f0a1e}'), // 󰨞 ("md_microsoft_windows", '\u{f05b3}'), // ó°–³ ("md_microsoft_windows_classic", '\u{f0a21}'), // 󰨡 ("md_microsoft_word", '\u{f1392}'), // 󱎒 ("md_microsoft_xbox", '\u{f05b9}'), // ó°–¹ ("md_microsoft_xbox_controller", '\u{f05ba}'), // ó°–º ("md_microsoft_xbox_controller_battery_alert", '\u{f074b}'), // ó°‹ ("md_microsoft_xbox_controller_battery_charging", '\u{f0a22}'), // 󰨢 ("md_microsoft_xbox_controller_battery_empty", '\u{f074c}'), // ó°Œ ("md_microsoft_xbox_controller_battery_full", '\u{f074d}'), // ó° ("md_microsoft_xbox_controller_battery_low", '\u{f074e}'), // ó°Ž ("md_microsoft_xbox_controller_battery_medium", '\u{f074f}'), // ó° ("md_microsoft_xbox_controller_battery_unknown", '\u{f0750}'), // ó° ("md_microsoft_xbox_controller_menu", '\u{f0e6f}'), // 󰹯 ("md_microsoft_xbox_controller_off", '\u{f05bb}'), // ó°–» ("md_microsoft_xbox_controller_view", '\u{f0e70}'), // ó°¹° ("md_microwave", '\u{f0c99}'), // ó°²™ ("md_microwave_off", '\u{f1423}'), // ó±£ ("md_middleware", '\u{f0f5d}'), // ó°½ ("md_middleware_outline", '\u{f0f5e}'), // 󰽞 ("md_midi", '\u{f08f1}'), // ó°£± ("md_midi_port", '\u{f08f2}'), // ó°£² ("md_mine", '\u{f0dda}'), // ó°·š ("md_minecraft", '\u{f0373}'), // ó°³ ("md_mini_sd", '\u{f0a05}'), // ó°¨… ("md_minidisc", '\u{f0a06}'), // 󰨆 ("md_minus", '\u{f0374}'), // ó°´ ("md_minus_box", '\u{f0375}'), // ó°µ ("md_minus_box_multiple", '\u{f1141}'), // ó±… ("md_minus_box_multiple_outline", '\u{f1142}'), // ó±…‚ ("md_minus_box_outline", '\u{f06f2}'), // ó°›² ("md_minus_circle", '\u{f0376}'), // ó°¶ ("md_minus_circle_multiple", '\u{f035a}'), // ó°š ("md_minus_circle_multiple_outline", '\u{f0ad3}'), // ó°«“ ("md_minus_circle_off", '\u{f1459}'), // 󱑙 ("md_minus_circle_off_outline", '\u{f145a}'), // 󱑚 ("md_minus_circle_outline", '\u{f0377}'), // ó°· ("md_minus_network", '\u{f0378}'), // ó°¸ ("md_minus_network_outline", '\u{f0c9a}'), // 󰲚 ("md_minus_thick", '\u{f1639}'), // 󱘹 ("md_mirror", '\u{f11fd}'), // 󱇽 ("md_mirror_rectangle", '\u{f179f}'), // 󱞟 ("md_mirror_variant", '\u{f17a0}'), // 󱞠 ("md_mixed_martial_arts", '\u{f0d8f}'), // ó°¶ ("md_mixed_reality", '\u{f087f}'), // ó°¡¿ ("md_molecule", '\u{f0bac}'), // 󰮬 ("md_molecule_co", '\u{f12fe}'), // 󱋾 ("md_molecule_co2", '\u{f07e4}'), // 󰟤 ("md_monitor", '\u{f0379}'), // ó°¹ ("md_monitor_account", '\u{f1a5b}'), // 󱩛 ("md_monitor_arrow_down", '\u{f19d0}'), // ó±§ ("md_monitor_arrow_down_variant", '\u{f19d1}'), // ó±§‘ ("md_monitor_cellphone", '\u{f0989}'), // 󰦉 ("md_monitor_cellphone_star", '\u{f098a}'), // 󰦊 ("md_monitor_dashboard", '\u{f0a07}'), // 󰨇 ("md_monitor_edit", '\u{f12c6}'), // 󱋆 ("md_monitor_eye", '\u{f13b4}'), // 󱎴 ("md_monitor_lock", '\u{f0ddb}'), // ó°·› ("md_monitor_multiple", '\u{f037a}'), // ó°º ("md_monitor_off", '\u{f0d90}'), // ó°¶ ("md_monitor_screenshot", '\u{f0e51}'), // 󰹑 ("md_monitor_share", '\u{f1483}'), // ó±’ƒ ("md_monitor_shimmer", '\u{f1104}'), // 󱄄 ("md_monitor_small", '\u{f1876}'), // 󱡶 ("md_monitor_speaker", '\u{f0f5f}'), // 󰽟 ("md_monitor_speaker_off", '\u{f0f60}'), // ó°½  ("md_monitor_star", '\u{f0ddc}'), // ó°·œ ("md_moon_first_quarter", '\u{f0f61}'), // 󰽡 ("md_moon_full", '\u{f0f62}'), // ó°½¢ ("md_moon_last_quarter", '\u{f0f63}'), // ó°½£ ("md_moon_new", '\u{f0f64}'), // 󰽤 ("md_moon_waning_crescent", '\u{f0f65}'), // ó°½¥ ("md_moon_waning_gibbous", '\u{f0f66}'), // 󰽦 ("md_moon_waxing_crescent", '\u{f0f67}'), // ó°½§ ("md_moon_waxing_gibbous", '\u{f0f68}'), // 󰽨 ("md_moped", '\u{f1086}'), // 󱂆 ("md_moped_electric", '\u{f15b7}'), // ó±–· ("md_moped_electric_outline", '\u{f15b8}'), // ó±–¸ ("md_moped_outline", '\u{f15b9}'), // ó±–¹ ("md_more", '\u{f037b}'), // ó°» ("md_mortar_pestle", '\u{f1748}'), // ó±ˆ ("md_mortar_pestle_plus", '\u{f03f1}'), // ó°± ("md_mosque", '\u{f1827}'), // ó± § ("md_mother_heart", '\u{f1314}'), // 󱌔 ("md_mother_nurse", '\u{f0d21}'), // ó°´¡ ("md_motion", '\u{f15b2}'), // ó±–² ("md_motion_outline", '\u{f15b3}'), // ó±–³ ("md_motion_pause", '\u{f1590}'), // ó±– ("md_motion_pause_outline", '\u{f1592}'), // ó±–’ ("md_motion_play", '\u{f158f}'), // ó±– ("md_motion_play_outline", '\u{f1591}'), // ó±–‘ ("md_motion_sensor", '\u{f0d91}'), // ó°¶‘ ("md_motion_sensor_off", '\u{f1435}'), // ó±µ ("md_motorbike", '\u{f037c}'), // ó°¼ ("md_motorbike_electric", '\u{f15ba}'), // ó±–º ("md_mouse", '\u{f037d}'), // ó°½ ("md_mouse_bluetooth", '\u{f098b}'), // 󰦋 ("md_mouse_move_down", '\u{f1550}'), // ó±• ("md_mouse_move_up", '\u{f1551}'), // 󱕑 ("md_mouse_move_vertical", '\u{f1552}'), // 󱕒 ("md_mouse_off", '\u{f037e}'), // ó°¾ ("md_mouse_variant", '\u{f037f}'), // ó°¿ ("md_mouse_variant_off", '\u{f0380}'), // ó°Ž€ ("md_move_resize", '\u{f0655}'), // ó°™• ("md_move_resize_variant", '\u{f0656}'), // ó°™– ("md_movie", '\u{f0381}'), // ó°Ž ("md_movie_check", '\u{f16f3}'), // ó±›³ ("md_movie_check_outline", '\u{f16f4}'), // ó±›´ ("md_movie_cog", '\u{f16f5}'), // ó±›µ ("md_movie_cog_outline", '\u{f16f6}'), // ó±›¶ ("md_movie_edit", '\u{f1122}'), // 󱄢 ("md_movie_edit_outline", '\u{f1123}'), // 󱄣 ("md_movie_filter", '\u{f1124}'), // 󱄤 ("md_movie_filter_outline", '\u{f1125}'), // 󱄥 ("md_movie_minus", '\u{f16f7}'), // ó±›· ("md_movie_minus_outline", '\u{f16f8}'), // 󱛸 ("md_movie_off", '\u{f16f9}'), // ó±›¹ ("md_movie_off_outline", '\u{f16fa}'), // 󱛺 ("md_movie_open", '\u{f0fce}'), // ó°¿Ž ("md_movie_open_check", '\u{f16fb}'), // ó±›» ("md_movie_open_check_outline", '\u{f16fc}'), // ó±›¼ ("md_movie_open_cog", '\u{f16fd}'), // ó±›½ ("md_movie_open_cog_outline", '\u{f16fe}'), // ó±›¾ ("md_movie_open_edit", '\u{f16ff}'), // 󱛿 ("md_movie_open_edit_outline", '\u{f1700}'), // 󱜀 ("md_movie_open_minus", '\u{f1701}'), // ó±œ ("md_movie_open_minus_outline", '\u{f1702}'), // 󱜂 ("md_movie_open_off", '\u{f1703}'), // 󱜃 ("md_movie_open_off_outline", '\u{f1704}'), // 󱜄 ("md_movie_open_outline", '\u{f0fcf}'), // ó°¿ ("md_movie_open_play", '\u{f1705}'), // 󱜅 ("md_movie_open_play_outline", '\u{f1706}'), // 󱜆 ("md_movie_open_plus", '\u{f1707}'), // 󱜇 ("md_movie_open_plus_outline", '\u{f1708}'), // 󱜈 ("md_movie_open_remove", '\u{f1709}'), // 󱜉 ("md_movie_open_remove_outline", '\u{f170a}'), // 󱜊 ("md_movie_open_settings", '\u{f170b}'), // 󱜋 ("md_movie_open_settings_outline", '\u{f170c}'), // 󱜌 ("md_movie_open_star", '\u{f170d}'), // ó±œ ("md_movie_open_star_outline", '\u{f170e}'), // 󱜎 ("md_movie_outline", '\u{f0ddd}'), // ó°· ("md_movie_play", '\u{f170f}'), // ó±œ ("md_movie_play_outline", '\u{f1710}'), // ó±œ ("md_movie_plus", '\u{f1711}'), // 󱜑 ("md_movie_plus_outline", '\u{f1712}'), // 󱜒 ("md_movie_remove", '\u{f1713}'), // 󱜓 ("md_movie_remove_outline", '\u{f1714}'), // 󱜔 ("md_movie_roll", '\u{f07de}'), // ó°Ÿž ("md_movie_search", '\u{f11d2}'), // 󱇒 ("md_movie_search_outline", '\u{f11d3}'), // 󱇓 ("md_movie_settings", '\u{f1715}'), // 󱜕 ("md_movie_settings_outline", '\u{f1716}'), // 󱜖 ("md_movie_star", '\u{f1717}'), // 󱜗 ("md_movie_star_outline", '\u{f1718}'), // 󱜘 ("md_mower", '\u{f166f}'), // 󱙯 ("md_mower_bag", '\u{f1670}'), // ó±™° ("md_muffin", '\u{f098c}'), // 󰦌 ("md_multicast", '\u{f1893}'), // 󱢓 ("md_multiplication", '\u{f0382}'), // ó°Ž‚ ("md_multiplication_box", '\u{f0383}'), // 󰎃 ("md_mushroom", '\u{f07df}'), // ó°ŸŸ ("md_mushroom_off", '\u{f13fa}'), // ó±º ("md_mushroom_off_outline", '\u{f13fb}'), // ó±» ("md_mushroom_outline", '\u{f07e0}'), // ó°Ÿ  ("md_music", '\u{f075a}'), // ó°š ("md_music_accidental_double_flat", '\u{f0f69}'), // 󰽩 ("md_music_accidental_double_sharp", '\u{f0f6a}'), // 󰽪 ("md_music_accidental_flat", '\u{f0f6b}'), // 󰽫 ("md_music_accidental_natural", '\u{f0f6c}'), // 󰽬 ("md_music_accidental_sharp", '\u{f0f6d}'), // ó°½­ ("md_music_box", '\u{f0384}'), // ó°Ž„ ("md_music_box_multiple", '\u{f0333}'), // 󰌳 ("md_music_box_multiple_outline", '\u{f0f04}'), // 󰼄 ("md_music_box_outline", '\u{f0385}'), // ó°Ž… ("md_music_circle", '\u{f0386}'), // 󰎆 ("md_music_circle_outline", '\u{f0ad4}'), // ó°«” ("md_music_clef_alto", '\u{f0f6e}'), // ó°½® ("md_music_clef_bass", '\u{f0f6f}'), // 󰽯 ("md_music_clef_treble", '\u{f0f70}'), // ó°½° ("md_music_note", '\u{f0388}'), // 󰎈 ("md_music_note", '\u{f0388}'), // 󰎈 ("md_music_note_bluetooth", '\u{f05fe}'), // ó°—¾ ("md_music_note_bluetooth_off", '\u{f05ff}'), // ó°—¿ ("md_music_note_eighth_dotted", '\u{f0f71}'), // ó°½± ("md_music_note_half", '\u{f0389}'), // 󰎉 ("md_music_note_half_dotted", '\u{f0f72}'), // ó°½² ("md_music_note_off", '\u{f038a}'), // ó°ŽŠ ("md_music_note_off_outline", '\u{f0f73}'), // ó°½³ ("md_music_note_outline", '\u{f0f74}'), // ó°½´ ("md_music_note_plus", '\u{f0dde}'), // ó°·ž ("md_music_note_quarter", '\u{f038b}'), // ó°Ž‹ ("md_music_note_quarter_dotted", '\u{f0f75}'), // ó°½µ ("md_music_note_sixteenth", '\u{f038c}'), // ó°ŽŒ ("md_music_note_sixteenth_dotted", '\u{f0f76}'), // ó°½¶ ("md_music_note_whole", '\u{f038d}'), // ó°Ž ("md_music_note_whole_dotted", '\u{f0f77}'), // ó°½· ("md_music_off", '\u{f075b}'), // ó°› ("md_music_rest_eighth", '\u{f0f78}'), // 󰽸 ("md_music_rest_half", '\u{f0f79}'), // ó°½¹ ("md_music_rest_quarter", '\u{f0f7a}'), // 󰽺 ("md_music_rest_sixteenth", '\u{f0f7b}'), // ó°½» ("md_music_rest_whole", '\u{f0f7c}'), // ó°½¼ ("md_mustache", '\u{f15de}'), // ó±—ž ("md_nail", '\u{f0ddf}'), // ó°·Ÿ ("md_nas", '\u{f08f3}'), // ó°£³ ("md_nativescript", '\u{f0880}'), // ó°¢€ ("md_nature", '\u{f038e}'), // ó°ŽŽ ("md_nature_people", '\u{f038f}'), // ó°Ž ("md_navigation", '\u{f0390}'), // ó°Ž ("md_navigation_outline", '\u{f1607}'), // 󱘇 ("md_navigation_variant_outline", '\u{f18f1}'), // ó±£± ("md_near_me", '\u{f18f0}'), // ó±£° ("md_near_me", '\u{f18f0}'), // ó±£° ("md_necklace", '\u{f0f0b}'), // 󰼋 ("md_needle", '\u{f0391}'), // ó°Ž‘ ("md_needle_off", '\u{f19d2}'), // ó±§’ ("md_netflix", '\u{f0746}'), // ó°† ("md_network", '\u{f06f3}'), // ó°›³ ("md_network_off", '\u{f0c9b}'), // ó°²› ("md_network_off_outline", '\u{f0c9c}'), // 󰲜 ("md_network_outline", '\u{f0c9d}'), // ó°² ("md_network_pos", '\u{f1acb}'), // 󱫋 ("md_network_strength_1", '\u{f08f4}'), // ó°£´ ("md_network_strength_1_alert", '\u{f08f5}'), // ó°£µ ("md_network_strength_2", '\u{f08f6}'), // ó°£¶ ("md_network_strength_2_alert", '\u{f08f7}'), // ó°£· ("md_network_strength_3", '\u{f08f8}'), // 󰣸 ("md_network_strength_3_alert", '\u{f08f9}'), // ó°£¹ ("md_network_strength_4", '\u{f08fa}'), // 󰣺 ("md_network_strength_4_alert", '\u{f08fb}'), // ó°£» ("md_network_strength_4_cog", '\u{f191a}'), // 󱤚 ("md_network_strength_off", '\u{f08fc}'), // ó°£¼ ("md_network_strength_off_outline", '\u{f08fd}'), // ó°£½ ("md_network_strength_outline", '\u{f08fe}'), // ó°£¾ ("md_new_box", '\u{f0394}'), // ó°Ž” ("md_newspaper", '\u{f0395}'), // ó°Ž• ("md_newspaper_check", '\u{f1943}'), // 󱥃 ("md_newspaper_minus", '\u{f0f0c}'), // 󰼌 ("md_newspaper_plus", '\u{f0f0d}'), // ó°¼ ("md_newspaper_remove", '\u{f1944}'), // 󱥄 ("md_newspaper_variant", '\u{f1001}'), // ó±€ ("md_newspaper_variant_multiple", '\u{f1002}'), // 󱀂 ("md_newspaper_variant_multiple_outline", '\u{f1003}'), // 󱀃 ("md_newspaper_variant_outline", '\u{f1004}'), // 󱀄 ("md_nfc", '\u{f0396}'), // ó°Ž– ("md_nfc_search_variant", '\u{f0e53}'), // 󰹓 ("md_nfc_tap", '\u{f0397}'), // ó°Ž— ("md_nfc_variant", '\u{f0398}'), // 󰎘 ("md_nfc_variant_off", '\u{f0e54}'), // ó°¹” ("md_ninja", '\u{f0774}'), // ó°´ ("md_nintendo_game_boy", '\u{f1393}'), // 󱎓 ("md_nintendo_switch", '\u{f07e1}'), // ó°Ÿ¡ ("md_nintendo_wii", '\u{f05ab}'), // ó°–« ("md_nintendo_wiiu", '\u{f072d}'), // 󰜭 ("md_nix", '\u{f1105}'), // 󱄅 ("md_nodejs", '\u{f0399}'), // ó°Ž™ ("md_noodles", '\u{f117e}'), // ó±…¾ ("md_not_equal", '\u{f098d}'), // ó°¦ ("md_not_equal_variant", '\u{f098e}'), // 󰦎 ("md_note", '\u{f039a}'), // ó°Žš ("md_note_alert", '\u{f177d}'), // ó±½ ("md_note_alert_outline", '\u{f177e}'), // ó±¾ ("md_note_check", '\u{f177f}'), // ó±¿ ("md_note_check_outline", '\u{f1780}'), // 󱞀 ("md_note_edit", '\u{f1781}'), // ó±ž ("md_note_edit_outline", '\u{f1782}'), // 󱞂 ("md_note_minus", '\u{f164f}'), // ó±™ ("md_note_minus_outline", '\u{f1650}'), // ó±™ ("md_note_multiple", '\u{f06b8}'), // 󰚸 ("md_note_multiple_outline", '\u{f06b9}'), // ó°š¹ ("md_note_off", '\u{f1783}'), // 󱞃 ("md_note_off_outline", '\u{f1784}'), // 󱞄 ("md_note_outline", '\u{f039b}'), // ó°Ž› ("md_note_plus", '\u{f039c}'), // ó°Žœ ("md_note_plus_outline", '\u{f039d}'), // ó°Ž ("md_note_remove", '\u{f1651}'), // 󱙑 ("md_note_remove_outline", '\u{f1652}'), // ó±™’ ("md_note_search", '\u{f1653}'), // 󱙓 ("md_note_search_outline", '\u{f1654}'), // ó±™” ("md_note_text", '\u{f039e}'), // ó°Žž ("md_note_text_outline", '\u{f11d7}'), // 󱇗 ("md_notebook", '\u{f082e}'), // ó° ® ("md_notebook_check", '\u{f14f5}'), // 󱓵 ("md_notebook_check_outline", '\u{f14f6}'), // 󱓶 ("md_notebook_edit", '\u{f14e7}'), // 󱓧 ("md_notebook_edit_outline", '\u{f14e9}'), // 󱓩 ("md_notebook_heart", '\u{f1a0b}'), // 󱨋 ("md_notebook_heart_outline", '\u{f1a0c}'), // 󱨌 ("md_notebook_minus", '\u{f1610}'), // ó±˜ ("md_notebook_minus_outline", '\u{f1611}'), // 󱘑 ("md_notebook_multiple", '\u{f0e55}'), // 󰹕 ("md_notebook_outline", '\u{f0ebf}'), // 󰺿 ("md_notebook_plus", '\u{f1612}'), // 󱘒 ("md_notebook_plus_outline", '\u{f1613}'), // 󱘓 ("md_notebook_remove", '\u{f1614}'), // 󱘔 ("md_notebook_remove_outline", '\u{f1615}'), // 󱘕 ("md_notification_clear_all", '\u{f039f}'), // ó°ŽŸ ("md_npm", '\u{f06f7}'), // ó°›· ("md_nuke", '\u{f06a4}'), // 󰚤 ("md_null", '\u{f07e2}'), // ó°Ÿ¢ ("md_numeric", '\u{f03a0}'), // ó°Ž  ("md_numeric_0_box", '\u{f03a1}'), // ó°Ž¡ ("md_numeric_0_box_multiple", '\u{f0f0e}'), // 󰼎 ("md_numeric_0_box_multiple_outline", '\u{f03a2}'), // ó°Ž¢ ("md_numeric_0_box_outline", '\u{f03a3}'), // ó°Ž£ ("md_numeric_1", '\u{f0b3a}'), // 󰬺 ("md_numeric_1_box", '\u{f03a4}'), // 󰎤 ("md_numeric_1_box_multiple", '\u{f0f0f}'), // ó°¼ ("md_numeric_1_box_multiple_outline", '\u{f03a5}'), // ó°Ž¥ ("md_numeric_1_box_outline", '\u{f03a6}'), // 󰎦 ("md_numeric_1_circle", '\u{f0ca0}'), // ó°²  ("md_numeric_1_circle_outline", '\u{f0ca1}'), // 󰲡 ("md_numeric_2", '\u{f0b3b}'), // 󰬻 ("md_numeric_2_box", '\u{f03a7}'), // 󰎧 ("md_numeric_2_box_multiple", '\u{f0f10}'), // ó°¼ ("md_numeric_2_box_multiple_outline", '\u{f03a8}'), // 󰎨 ("md_numeric_2_box_outline", '\u{f03a9}'), // ó°Ž© ("md_numeric_2_circle", '\u{f0ca2}'), // ó°²¢ ("md_numeric_2_circle_outline", '\u{f0ca3}'), // ó°²£ ("md_numeric_3", '\u{f0b3c}'), // 󰬼 ("md_numeric_3_box", '\u{f03aa}'), // 󰎪 ("md_numeric_3_box_multiple", '\u{f0f11}'), // 󰼑 ("md_numeric_3_box_multiple_outline", '\u{f03ab}'), // ó°Ž« ("md_numeric_3_box_outline", '\u{f03ac}'), // 󰎬 ("md_numeric_3_circle", '\u{f0ca4}'), // 󰲤 ("md_numeric_3_circle_outline", '\u{f0ca5}'), // ó°²¥ ("md_numeric_4", '\u{f0b3d}'), // 󰬽 ("md_numeric_4_box", '\u{f03ad}'), // ó°Ž­ ("md_numeric_4_box_multiple", '\u{f0f12}'), // ó°¼’ ("md_numeric_4_box_multiple_outline", '\u{f03b2}'), // 󰎲 ("md_numeric_4_box_outline", '\u{f03ae}'), // ó°Ž® ("md_numeric_4_circle", '\u{f0ca6}'), // 󰲦 ("md_numeric_4_circle_outline", '\u{f0ca7}'), // ó°²§ ("md_numeric_5", '\u{f0b3e}'), // 󰬾 ("md_numeric_5_box", '\u{f03b1}'), // 󰎱 ("md_numeric_5_box_multiple", '\u{f0f13}'), // 󰼓 ("md_numeric_5_box_multiple_outline", '\u{f03af}'), // 󰎯 ("md_numeric_5_box_outline", '\u{f03b0}'), // 󰎰 ("md_numeric_5_circle", '\u{f0ca8}'), // 󰲨 ("md_numeric_5_circle_outline", '\u{f0ca9}'), // 󰲩 ("md_numeric_6", '\u{f0b3f}'), // 󰬿 ("md_numeric_6_box", '\u{f03b3}'), // 󰎳 ("md_numeric_6_box_multiple", '\u{f0f14}'), // ó°¼” ("md_numeric_6_box_multiple_outline", '\u{f03b4}'), // ó°Ž´ ("md_numeric_6_box_outline", '\u{f03b5}'), // 󰎵 ("md_numeric_6_circle", '\u{f0caa}'), // 󰲪 ("md_numeric_6_circle_outline", '\u{f0cab}'), // 󰲫 ("md_numeric_7", '\u{f0b40}'), // ó°­€ ("md_numeric_7_box", '\u{f03b6}'), // 󰎶 ("md_numeric_7_box_multiple", '\u{f0f15}'), // 󰼕 ("md_numeric_7_box_multiple_outline", '\u{f03b7}'), // ó°Ž· ("md_numeric_7_box_outline", '\u{f03b8}'), // 󰎸 ("md_numeric_7_circle", '\u{f0cac}'), // 󰲬 ("md_numeric_7_circle_outline", '\u{f0cad}'), // ó°²­ ("md_numeric_8", '\u{f0b41}'), // ó°­ ("md_numeric_8_box", '\u{f03b9}'), // 󰎹 ("md_numeric_8_box_multiple", '\u{f0f16}'), // ó°¼– ("md_numeric_8_box_multiple_outline", '\u{f03ba}'), // 󰎺 ("md_numeric_8_box_outline", '\u{f03bb}'), // ó°Ž» ("md_numeric_8_circle", '\u{f0cae}'), // ó°²® ("md_numeric_8_circle_outline", '\u{f0caf}'), // 󰲯 ("md_numeric_9", '\u{f0b42}'), // ó°­‚ ("md_numeric_9_box", '\u{f03bc}'), // 󰎼 ("md_numeric_9_box_multiple", '\u{f0f17}'), // ó°¼— ("md_numeric_9_box_multiple_outline", '\u{f03bd}'), // 󰎽 ("md_numeric_9_box_outline", '\u{f03be}'), // 󰎾 ("md_numeric_9_circle", '\u{f0cb0}'), // ó°²° ("md_numeric_9_circle_outline", '\u{f0cb1}'), // ó°²± ("md_numeric_9_plus", '\u{f0fee}'), // ó°¿® ("md_numeric_9_plus_box", '\u{f03bf}'), // ó°Ž¿ ("md_numeric_9_plus_box_multiple", '\u{f0f18}'), // 󰼘 ("md_numeric_9_plus_box_multiple_outline", '\u{f03c0}'), // ó°€ ("md_numeric_9_plus_box_outline", '\u{f03c1}'), // ó° ("md_numeric_9_plus_circle", '\u{f0cb2}'), // ó°²² ("md_numeric_9_plus_circle_outline", '\u{f0cb3}'), // ó°²³ ("md_numeric_10", '\u{f0fe9}'), // ó°¿© ("md_numeric_10_box", '\u{f0f7d}'), // ó°½½ ("md_numeric_10_box_multiple", '\u{f0fea}'), // 󰿪 ("md_numeric_10_box_multiple_outline", '\u{f0feb}'), // ó°¿« ("md_numeric_10_box_outline", '\u{f0f7e}'), // ó°½¾ ("md_numeric_10_circle", '\u{f0fec}'), // 󰿬 ("md_numeric_10_circle_outline", '\u{f0fed}'), // ó°¿­ ("md_numeric_negative_1", '\u{f1052}'), // ó±’ ("md_numeric_off", '\u{f19d3}'), // ó±§“ ("md_numeric_positive_1", '\u{f15cb}'), // ó±—‹ ("md_nut", '\u{f06f8}'), // 󰛸 ("md_nutrition", '\u{f03c2}'), // ó°‚ ("md_nuxt", '\u{f1106}'), // 󱄆 ("md_oar", '\u{f067c}'), // ó°™¼ ("md_ocarina", '\u{f0de0}'), // ó°·  ("md_oci", '\u{f12e9}'), // 󱋩 ("md_ocr", '\u{f113a}'), // 󱄺 ("md_octagon", '\u{f03c3}'), // ó°ƒ ("md_octagon_outline", '\u{f03c4}'), // ó°„ ("md_octagram", '\u{f06f9}'), // ó°›¹ ("md_octagram_outline", '\u{f0775}'), // ó°µ ("md_octahedron", '\u{f1950}'), // ó±¥ ("md_octahedron_off", '\u{f1951}'), // 󱥑 ("md_odnoklassniki", '\u{f03c5}'), // ó°… ("md_offer", '\u{f121b}'), // 󱈛 ("md_office_building", '\u{f0991}'), // 󰦑 ("md_office_building_cog", '\u{f1949}'), // 󱥉 ("md_office_building_cog_outline", '\u{f194a}'), // 󱥊 ("md_office_building_marker", '\u{f1520}'), // ó±”  ("md_office_building_marker_outline", '\u{f1521}'), // 󱔡 ("md_office_building_outline", '\u{f151f}'), // 󱔟 ("md_oil", '\u{f03c7}'), // ó°‡ ("md_oil_lamp", '\u{f0f19}'), // ó°¼™ ("md_oil_level", '\u{f1053}'), // ó±“ ("md_oil_temperature", '\u{f0ff8}'), // 󰿸 ("md_om", '\u{f0973}'), // ó°¥³ ("md_omega", '\u{f03c9}'), // ó°‰ ("md_one_up", '\u{f0bad}'), // ó°®­ ("md_onepassword", '\u{f0881}'), // ó°¢ ("md_opacity", '\u{f05cc}'), // ó°—Œ ("md_open_in_app", '\u{f03cb}'), // ó°‹ ("md_open_in_new", '\u{f03cc}'), // ó°Œ ("md_open_source_initiative", '\u{f0bae}'), // ó°®® ("md_openid", '\u{f03cd}'), // ó° ("md_opera", '\u{f03ce}'), // ó°Ž ("md_orbit", '\u{f0018}'), // 󰀘 ("md_orbit_variant", '\u{f15db}'), // ó±—› ("md_order_alphabetical_ascending", '\u{f020d}'), // ó°ˆ ("md_order_alphabetical_descending", '\u{f0d07}'), // ó°´‡ ("md_order_bool_ascending", '\u{f02be}'), // 󰊾 ("md_order_bool_ascending_variant", '\u{f098f}'), // ó°¦ ("md_order_bool_descending", '\u{f1384}'), // 󱎄 ("md_order_bool_descending_variant", '\u{f0990}'), // ó°¦ ("md_order_numeric_ascending", '\u{f0545}'), // ó°•… ("md_order_numeric_descending", '\u{f0546}'), // 󰕆 ("md_origin", '\u{f0b43}'), // ó°­ƒ ("md_ornament", '\u{f03cf}'), // ó° ("md_ornament_variant", '\u{f03d0}'), // ó° ("md_outdoor_lamp", '\u{f1054}'), // ó±” ("md_overscan", '\u{f1005}'), // ó±€… ("md_owl", '\u{f03d2}'), // ó°’ ("md_pac_man", '\u{f0baf}'), // 󰮯 ("md_package", '\u{f03d3}'), // ó°“ ("md_package_down", '\u{f03d4}'), // ó°” ("md_package_up", '\u{f03d5}'), // ó°• ("md_package_variant", '\u{f03d6}'), // ó°– ("md_package_variant_closed", '\u{f03d7}'), // ó°— ("md_package_variant_closed_minus", '\u{f19d4}'), // ó±§” ("md_package_variant_closed_plus", '\u{f19d5}'), // ó±§• ("md_package_variant_closed_remove", '\u{f19d6}'), // ó±§– ("md_package_variant_minus", '\u{f19d7}'), // ó±§— ("md_package_variant_plus", '\u{f19d8}'), // 󱧘 ("md_package_variant_remove", '\u{f19d9}'), // ó±§™ ("md_page_first", '\u{f0600}'), // 󰘀 ("md_page_last", '\u{f0601}'), // ó°˜ ("md_page_layout_body", '\u{f06fa}'), // 󰛺 ("md_page_layout_footer", '\u{f06fb}'), // ó°›» ("md_page_layout_header", '\u{f06fc}'), // ó°›¼ ("md_page_layout_header_footer", '\u{f0f7f}'), // 󰽿 ("md_page_layout_sidebar_left", '\u{f06fd}'), // ó°›½ ("md_page_layout_sidebar_right", '\u{f06fe}'), // ó°›¾ ("md_page_next", '\u{f0bb0}'), // ó°®° ("md_page_next_outline", '\u{f0bb1}'), // ó°®± ("md_page_previous", '\u{f0bb2}'), // ó°®² ("md_page_previous_outline", '\u{f0bb3}'), // ó°®³ ("md_pail", '\u{f1417}'), // ó±— ("md_pail_minus", '\u{f1437}'), // ó±· ("md_pail_minus_outline", '\u{f143c}'), // ó±¼ ("md_pail_off", '\u{f1439}'), // ó±¹ ("md_pail_off_outline", '\u{f143e}'), // ó±¾ ("md_pail_outline", '\u{f143a}'), // ó±º ("md_pail_plus", '\u{f1436}'), // ó±¶ ("md_pail_plus_outline", '\u{f143b}'), // ó±» ("md_pail_remove", '\u{f1438}'), // ó±¸ ("md_pail_remove_outline", '\u{f143d}'), // ó±½ ("md_palette", '\u{f03d8}'), // ó°˜ ("md_palette_advanced", '\u{f03d9}'), // ó°™ ("md_palette_outline", '\u{f0e0c}'), // 󰸌 ("md_palette_swatch", '\u{f08b5}'), // ó°¢µ ("md_palette_swatch_outline", '\u{f135c}'), // ó±œ ("md_palette_swatch_variant", '\u{f195a}'), // 󱥚 ("md_palm_tree", '\u{f1055}'), // ó±• ("md_pan", '\u{f0bb4}'), // ó°®´ ("md_pan_bottom_left", '\u{f0bb5}'), // ó°®µ ("md_pan_bottom_right", '\u{f0bb6}'), // ó°®¶ ("md_pan_down", '\u{f0bb7}'), // ó°®· ("md_pan_horizontal", '\u{f0bb8}'), // 󰮸 ("md_pan_left", '\u{f0bb9}'), // ó°®¹ ("md_pan_right", '\u{f0bba}'), // 󰮺 ("md_pan_top_left", '\u{f0bbb}'), // ó°®» ("md_pan_top_right", '\u{f0bbc}'), // ó°®¼ ("md_pan_up", '\u{f0bbd}'), // ó°®½ ("md_pan_vertical", '\u{f0bbe}'), // ó°®¾ ("md_panda", '\u{f03da}'), // ó°š ("md_pandora", '\u{f03db}'), // ó°› ("md_panorama", '\u{f03dc}'), // ó°œ ("md_panorama_fisheye", '\u{f03dd}'), // ó° ("md_panorama_horizontal", '\u{f1928}'), // 󱤨 ("md_panorama_horizontal_outline", '\u{f03de}'), // ó°ž ("md_panorama_outline", '\u{f198c}'), // 󱦌 ("md_panorama_sphere", '\u{f198d}'), // ó±¦ ("md_panorama_sphere_outline", '\u{f198e}'), // 󱦎 ("md_panorama_variant", '\u{f198f}'), // ó±¦ ("md_panorama_variant_outline", '\u{f1990}'), // ó±¦ ("md_panorama_vertical", '\u{f1929}'), // 󱤩 ("md_panorama_vertical_outline", '\u{f03df}'), // ó°Ÿ ("md_panorama_wide_angle", '\u{f195f}'), // 󱥟 ("md_panorama_wide_angle_outline", '\u{f03e0}'), // ó°  ("md_paper_cut_vertical", '\u{f03e1}'), // ó°¡ ("md_paper_roll", '\u{f1157}'), // ó±…— ("md_paper_roll_outline", '\u{f1158}'), // ó±…˜ ("md_paperclip", '\u{f03e2}'), // ó°¢ ("md_paperclip_check", '\u{f1ac6}'), // 󱫆 ("md_paperclip_lock", '\u{f19da}'), // ó±§š ("md_paperclip_minus", '\u{f1ac7}'), // 󱫇 ("md_paperclip_off", '\u{f1ac8}'), // 󱫈 ("md_paperclip_plus", '\u{f1ac9}'), // 󱫉 ("md_paperclip_remove", '\u{f1aca}'), // 󱫊 ("md_parachute", '\u{f0cb4}'), // ó°²´ ("md_parachute_outline", '\u{f0cb5}'), // ó°²µ ("md_paragliding", '\u{f1745}'), // ó±… ("md_parking", '\u{f03e3}'), // ó°£ ("md_party_popper", '\u{f1056}'), // ó±– ("md_passport", '\u{f07e3}'), // ó°Ÿ£ ("md_passport_biometric", '\u{f0de1}'), // ó°·¡ ("md_pasta", '\u{f1160}'), // ó±…  ("md_patio_heater", '\u{f0f80}'), // ó°¾€ ("md_patreon", '\u{f0882}'), // 󰢂 ("md_pause", '\u{f03e4}'), // ó°¤ ("md_pause_circle", '\u{f03e5}'), // ó°¥ ("md_pause_circle_outline", '\u{f03e6}'), // ó°¦ ("md_pause_octagon", '\u{f03e7}'), // ó°§ ("md_pause_octagon_outline", '\u{f03e8}'), // ó°¨ ("md_paw", '\u{f03e9}'), // ó°© ("md_paw_off", '\u{f0657}'), // ó°™— ("md_paw_off_outline", '\u{f1676}'), // ó±™¶ ("md_paw_outline", '\u{f1675}'), // ó±™µ ("md_peace", '\u{f0884}'), // 󰢄 ("md_peanut", '\u{f0ffc}'), // ó°¿¼ ("md_peanut_off", '\u{f0ffd}'), // ó°¿½ ("md_peanut_off_outline", '\u{f0fff}'), // ó°¿¿ ("md_peanut_outline", '\u{f0ffe}'), // ó°¿¾ ("md_pen", '\u{f03ea}'), // ó°ª ("md_pen_lock", '\u{f0de2}'), // ó°·¢ ("md_pen_minus", '\u{f0de3}'), // ó°·£ ("md_pen_off", '\u{f0de4}'), // ó°·¤ ("md_pen_plus", '\u{f0de5}'), // ó°·¥ ("md_pen_remove", '\u{f0de6}'), // ó°·¦ ("md_pencil", '\u{f03eb}'), // ó°« ("md_pencil_box", '\u{f03ec}'), // ó°¬ ("md_pencil_box_multiple", '\u{f1144}'), // ó±…„ ("md_pencil_box_multiple_outline", '\u{f1145}'), // ó±…… ("md_pencil_box_outline", '\u{f03ed}'), // ó°­ ("md_pencil_circle", '\u{f06ff}'), // ó°›¿ ("md_pencil_circle_outline", '\u{f0776}'), // ó°¶ ("md_pencil_lock", '\u{f03ee}'), // ó°® ("md_pencil_lock_outline", '\u{f0de7}'), // ó°·§ ("md_pencil_minus", '\u{f0de8}'), // ó°·¨ ("md_pencil_minus_outline", '\u{f0de9}'), // ó°·© ("md_pencil_off", '\u{f03ef}'), // ó°¯ ("md_pencil_off_outline", '\u{f0dea}'), // ó°·ª ("md_pencil_outline", '\u{f0cb6}'), // ó°²¶ ("md_pencil_plus", '\u{f0deb}'), // ó°·« ("md_pencil_plus_outline", '\u{f0dec}'), // ó°·¬ ("md_pencil_remove", '\u{f0ded}'), // ó°·­ ("md_pencil_remove_outline", '\u{f0dee}'), // ó°·® ("md_pencil_ruler", '\u{f1353}'), // ó±“ ("md_penguin", '\u{f0ec0}'), // 󰻀 ("md_pentagon", '\u{f0701}'), // ó°œ ("md_pentagon_outline", '\u{f0700}'), // 󰜀 ("md_pentagram", '\u{f1667}'), // ó±™§ ("md_percent", '\u{f03f0}'), // ó°° ("md_percent_box", '\u{f1a02}'), // 󱨂 ("md_percent_box_outline", '\u{f1a03}'), // 󱨃 ("md_percent_circle", '\u{f1a04}'), // 󱨄 ("md_percent_circle_outline", '\u{f1a05}'), // 󱨅 ("md_percent_outline", '\u{f1278}'), // 󱉸 ("md_periodic_table", '\u{f08b6}'), // ó°¢¶ ("md_perspective_less", '\u{f0d23}'), // ó°´£ ("md_perspective_more", '\u{f0d24}'), // ó°´¤ ("md_ph", '\u{f17c5}'), // 󱟅 ("md_phone", '\u{f03f2}'), // ó°² ("md_phone_alert", '\u{f0f1a}'), // 󰼚 ("md_phone_alert_outline", '\u{f118e}'), // 󱆎 ("md_phone_bluetooth", '\u{f03f3}'), // ó°³ ("md_phone_bluetooth_outline", '\u{f118f}'), // ó±† ("md_phone_cancel", '\u{f10bc}'), // 󱂼 ("md_phone_cancel_outline", '\u{f1190}'), // ó±† ("md_phone_check", '\u{f11a9}'), // 󱆩 ("md_phone_check_outline", '\u{f11aa}'), // 󱆪 ("md_phone_classic", '\u{f0602}'), // 󰘂 ("md_phone_classic_off", '\u{f1279}'), // 󱉹 ("md_phone_clock", '\u{f19db}'), // ó±§› ("md_phone_dial", '\u{f1559}'), // 󱕙 ("md_phone_dial_outline", '\u{f155a}'), // 󱕚 ("md_phone_forward", '\u{f03f4}'), // ó°´ ("md_phone_forward_outline", '\u{f1191}'), // 󱆑 ("md_phone_hangup", '\u{f03f5}'), // ó°µ ("md_phone_hangup_outline", '\u{f1192}'), // 󱆒 ("md_phone_in_talk", '\u{f03f6}'), // ó°¶ ("md_phone_in_talk_outline", '\u{f1182}'), // 󱆂 ("md_phone_incoming", '\u{f03f7}'), // ó°· ("md_phone_incoming_outline", '\u{f1193}'), // 󱆓 ("md_phone_lock", '\u{f03f8}'), // ó°¸ ("md_phone_lock_outline", '\u{f1194}'), // 󱆔 ("md_phone_log", '\u{f03f9}'), // ó°¹ ("md_phone_log_outline", '\u{f1195}'), // 󱆕 ("md_phone_message", '\u{f1196}'), // 󱆖 ("md_phone_message_outline", '\u{f1197}'), // 󱆗 ("md_phone_minus", '\u{f0658}'), // 󰙘 ("md_phone_minus_outline", '\u{f1198}'), // 󱆘 ("md_phone_missed", '\u{f03fa}'), // ó°º ("md_phone_missed_outline", '\u{f11a5}'), // 󱆥 ("md_phone_off", '\u{f0def}'), // ó°·¯ ("md_phone_off_outline", '\u{f11a6}'), // 󱆦 ("md_phone_outgoing", '\u{f03fb}'), // ó°» ("md_phone_outgoing_outline", '\u{f1199}'), // 󱆙 ("md_phone_outline", '\u{f0df0}'), // ó°·° ("md_phone_paused", '\u{f03fc}'), // ó°¼ ("md_phone_paused_outline", '\u{f119a}'), // 󱆚 ("md_phone_plus", '\u{f0659}'), // ó°™™ ("md_phone_plus_outline", '\u{f119b}'), // 󱆛 ("md_phone_refresh", '\u{f1993}'), // 󱦓 ("md_phone_refresh_outline", '\u{f1994}'), // 󱦔 ("md_phone_remove", '\u{f152f}'), // 󱔯 ("md_phone_remove_outline", '\u{f1530}'), // ó±”° ("md_phone_return", '\u{f082f}'), // ó° ¯ ("md_phone_return_outline", '\u{f119c}'), // 󱆜 ("md_phone_ring", '\u{f11ab}'), // 󱆫 ("md_phone_ring_outline", '\u{f11ac}'), // 󱆬 ("md_phone_rotate_landscape", '\u{f0885}'), // ó°¢… ("md_phone_rotate_portrait", '\u{f0886}'), // 󰢆 ("md_phone_settings", '\u{f03fd}'), // ó°½ ("md_phone_settings_outline", '\u{f119d}'), // ó±† ("md_phone_sync", '\u{f1995}'), // 󱦕 ("md_phone_sync_outline", '\u{f1996}'), // 󱦖 ("md_phone_voip", '\u{f03fe}'), // ó°¾ ("md_pi", '\u{f03ff}'), // ó°¿ ("md_pi_box", '\u{f0400}'), // ó°€ ("md_pi_hole", '\u{f0df1}'), // ó°·± ("md_piano", '\u{f067d}'), // ó°™½ ("md_piano_off", '\u{f0698}'), // 󰚘 ("md_pickaxe", '\u{f08b7}'), // ó°¢· ("md_picture_in_picture_bottom_right", '\u{f0e57}'), // ó°¹— ("md_picture_in_picture_bottom_right_outline", '\u{f0e58}'), // 󰹘 ("md_picture_in_picture_top_right", '\u{f0e59}'), // ó°¹™ ("md_picture_in_picture_top_right_outline", '\u{f0e5a}'), // 󰹚 ("md_pier", '\u{f0887}'), // 󰢇 ("md_pier_crane", '\u{f0888}'), // 󰢈 ("md_pig", '\u{f0401}'), // ó° ("md_pig_variant", '\u{f1006}'), // 󱀆 ("md_pig_variant_outline", '\u{f1678}'), // 󱙸 ("md_piggy_bank", '\u{f1007}'), // 󱀇 ("md_piggy_bank_outline", '\u{f1679}'), // ó±™¹ ("md_pill", '\u{f0402}'), // ó°‚ ("md_pill_off", '\u{f1a5c}'), // 󱩜 ("md_pillar", '\u{f0702}'), // 󰜂 ("md_pin", '\u{f0403}'), // ó°ƒ ("md_pin_off", '\u{f0404}'), // ó°„ ("md_pin_off_outline", '\u{f0930}'), // ó°¤° ("md_pin_outline", '\u{f0931}'), // 󰤱 ("md_pine_tree", '\u{f0405}'), // ó°… ("md_pine_tree_box", '\u{f0406}'), // ó°† ("md_pine_tree_fire", '\u{f141a}'), // ó±š ("md_pinterest", '\u{f0407}'), // ó°‡ ("md_pinwheel", '\u{f0ad5}'), // ó°«• ("md_pinwheel_outline", '\u{f0ad6}'), // ó°«– ("md_pipe", '\u{f07e5}'), // ó°Ÿ¥ ("md_pipe_disconnected", '\u{f07e6}'), // 󰟦 ("md_pipe_leak", '\u{f0889}'), // 󰢉 ("md_pipe_valve", '\u{f184d}'), // ó±¡ ("md_pipe_wrench", '\u{f1354}'), // ó±” ("md_pirate", '\u{f0a08}'), // 󰨈 ("md_pistol", '\u{f0703}'), // 󰜃 ("md_piston", '\u{f088a}'), // 󰢊 ("md_pitchfork", '\u{f1553}'), // 󱕓 ("md_pizza", '\u{f0409}'), // ó°‰ ("md_play", '\u{f040a}'), // ó°Š ("md_play_box", '\u{f127a}'), // 󱉺 ("md_play_box_lock", '\u{f1a16}'), // 󱨖 ("md_play_box_lock_open", '\u{f1a17}'), // 󱨗 ("md_play_box_lock_open_outline", '\u{f1a18}'), // 󱨘 ("md_play_box_lock_outline", '\u{f1a19}'), // 󱨙 ("md_play_box_multiple", '\u{f0d19}'), // ó°´™ ("md_play_box_multiple_outline", '\u{f13e6}'), // ó±¦ ("md_play_box_outline", '\u{f040b}'), // ó°‹ ("md_play_circle", '\u{f040c}'), // ó°Œ ("md_play_circle_outline", '\u{f040d}'), // ó° ("md_play_network", '\u{f088b}'), // 󰢋 ("md_play_network_outline", '\u{f0cb7}'), // ó°²· ("md_play_outline", '\u{f0f1b}'), // ó°¼› ("md_play_pause", '\u{f040e}'), // ó°Ž ("md_play_protected_content", '\u{f040f}'), // ó° ("md_play_speed", '\u{f08ff}'), // 󰣿 ("md_playlist_check", '\u{f05c7}'), // ó°—‡ ("md_playlist_edit", '\u{f0900}'), // 󰤀 ("md_playlist_minus", '\u{f0410}'), // ó° ("md_playlist_music", '\u{f0cb8}'), // 󰲸 ("md_playlist_music_outline", '\u{f0cb9}'), // ó°²¹ ("md_playlist_play", '\u{f0411}'), // ó°‘ ("md_playlist_plus", '\u{f0412}'), // ó°’ ("md_playlist_remove", '\u{f0413}'), // ó°“ ("md_playlist_star", '\u{f0df2}'), // ó°·² ("md_plex", '\u{f06ba}'), // 󰚺 ("md_pliers", '\u{f19a4}'), // 󱦤 ("md_plus", '\u{f0415}'), // ó°• ("md_plus_box", '\u{f0416}'), // ó°– ("md_plus_box_multiple", '\u{f0334}'), // 󰌴 ("md_plus_box_multiple_outline", '\u{f1143}'), // ó±…ƒ ("md_plus_box_outline", '\u{f0704}'), // 󰜄 ("md_plus_circle", '\u{f0417}'), // ó°— ("md_plus_circle_multiple", '\u{f034c}'), // ó°Œ ("md_plus_circle_multiple_outline", '\u{f0418}'), // ó°˜ ("md_plus_circle_outline", '\u{f0419}'), // ó°™ ("md_plus_lock", '\u{f1a5d}'), // ó±© ("md_plus_lock_open", '\u{f1a5e}'), // 󱩞 ("md_plus_minus", '\u{f0992}'), // ó°¦’ ("md_plus_minus_box", '\u{f0993}'), // 󰦓 ("md_plus_minus_variant", '\u{f14c9}'), // 󱓉 ("md_plus_network", '\u{f041a}'), // ó°š ("md_plus_network_outline", '\u{f0cba}'), // 󰲺 ("md_plus_outline", '\u{f0705}'), // 󰜅 ("md_plus_thick", '\u{f11ec}'), // 󱇬 ("md_podcast", '\u{f0994}'), // 󰦔 ("md_podium", '\u{f0d25}'), // ó°´¥ ("md_podium_bronze", '\u{f0d26}'), // ó°´¦ ("md_podium_gold", '\u{f0d27}'), // ó°´§ ("md_podium_silver", '\u{f0d28}'), // ó°´¨ ("md_point_of_sale", '\u{f0d92}'), // ó°¶’ ("md_pokeball", '\u{f041d}'), // ó° ("md_pokemon_go", '\u{f0a09}'), // 󰨉 ("md_poker_chip", '\u{f0830}'), // ó° ° ("md_polaroid", '\u{f041e}'), // ó°ž ("md_police_badge", '\u{f1167}'), // ó±…§ ("md_police_badge_outline", '\u{f1168}'), // ó±…¨ ("md_police_station", '\u{f1839}'), // ó± ¹ ("md_poll", '\u{f041f}'), // ó°Ÿ ("md_polo", '\u{f14c3}'), // 󱓃 ("md_polymer", '\u{f0421}'), // ó°¡ ("md_pool", '\u{f0606}'), // 󰘆 ("md_pool_thermometer", '\u{f1a5f}'), // 󱩟 ("md_popcorn", '\u{f0422}'), // ó°¢ ("md_post", '\u{f1008}'), // 󱀈 ("md_post_lamp", '\u{f1a60}'), // 󱩠 ("md_post_outline", '\u{f1009}'), // 󱀉 ("md_postage_stamp", '\u{f0cbb}'), // ó°²» ("md_pot", '\u{f02e5}'), // ó°‹¥ ("md_pot_mix", '\u{f065b}'), // ó°™› ("md_pot_mix_outline", '\u{f0677}'), // ó°™· ("md_pot_outline", '\u{f02ff}'), // ó°‹¿ ("md_pot_steam", '\u{f065a}'), // 󰙚 ("md_pot_steam_outline", '\u{f0326}'), // 󰌦 ("md_pound", '\u{f0423}'), // ó°£ ("md_pound_box", '\u{f0424}'), // ó°¤ ("md_pound_box_outline", '\u{f117f}'), // ó±…¿ ("md_power", '\u{f0425}'), // ó°¥ ("md_power_cycle", '\u{f0901}'), // ó°¤ ("md_power_off", '\u{f0902}'), // 󰤂 ("md_power_on", '\u{f0903}'), // 󰤃 ("md_power_plug", '\u{f06a5}'), // 󰚥 ("md_power_plug_off", '\u{f06a6}'), // 󰚦 ("md_power_plug_off_outline", '\u{f1424}'), // ó±¤ ("md_power_plug_outline", '\u{f1425}'), // ó±¥ ("md_power_settings", '\u{f0426}'), // ó°¦ ("md_power_sleep", '\u{f0904}'), // 󰤄 ("md_power_socket", '\u{f0427}'), // ó°§ ("md_power_socket_au", '\u{f0905}'), // ó°¤… ("md_power_socket_ch", '\u{f0fb3}'), // ó°¾³ ("md_power_socket_de", '\u{f1107}'), // 󱄇 ("md_power_socket_eu", '\u{f07e7}'), // 󰟧 ("md_power_socket_fr", '\u{f1108}'), // 󱄈 ("md_power_socket_it", '\u{f14ff}'), // 󱓿 ("md_power_socket_jp", '\u{f1109}'), // 󱄉 ("md_power_socket_uk", '\u{f07e8}'), // 󰟨 ("md_power_socket_us", '\u{f07e9}'), // ó°Ÿ© ("md_power_standby", '\u{f0906}'), // 󰤆 ("md_powershell", '\u{f0a0a}'), // 󰨊 ("md_prescription", '\u{f0706}'), // 󰜆 ("md_presentation", '\u{f0428}'), // ó°¨ ("md_presentation_play", '\u{f0429}'), // ó°© ("md_pretzel", '\u{f1562}'), // 󱕢 ("md_printer", '\u{f042a}'), // ó°ª ("md_printer_3d", '\u{f042b}'), // ó°« ("md_printer_3d_nozzle", '\u{f0e5b}'), // ó°¹› ("md_printer_3d_nozzle_alert", '\u{f11c0}'), // 󱇀 ("md_printer_3d_nozzle_alert_outline", '\u{f11c1}'), // ó±‡ ("md_printer_3d_nozzle_heat", '\u{f18b8}'), // 󱢸 ("md_printer_3d_nozzle_heat_outline", '\u{f18b9}'), // ó±¢¹ ("md_printer_3d_nozzle_outline", '\u{f0e5c}'), // 󰹜 ("md_printer_alert", '\u{f042c}'), // ó°¬ ("md_printer_check", '\u{f1146}'), // ó±…† ("md_printer_eye", '\u{f1458}'), // 󱑘 ("md_printer_off", '\u{f0e5d}'), // ó°¹ ("md_printer_off_outline", '\u{f1785}'), // 󱞅 ("md_printer_outline", '\u{f1786}'), // 󱞆 ("md_printer_pos", '\u{f1057}'), // ó±— ("md_printer_search", '\u{f1457}'), // 󱑗 ("md_printer_settings", '\u{f0707}'), // 󰜇 ("md_printer_wireless", '\u{f0a0b}'), // 󰨋 ("md_priority_high", '\u{f0603}'), // 󰘃 ("md_priority_low", '\u{f0604}'), // 󰘄 ("md_professional_hexagon", '\u{f042d}'), // ó°­ ("md_progress_alert", '\u{f0cbc}'), // ó°²¼ ("md_progress_check", '\u{f0995}'), // 󰦕 ("md_progress_clock", '\u{f0996}'), // ó°¦– ("md_progress_close", '\u{f110a}'), // 󱄊 ("md_progress_download", '\u{f0997}'), // ó°¦— ("md_progress_pencil", '\u{f1787}'), // 󱞇 ("md_progress_question", '\u{f1522}'), // 󱔢 ("md_progress_star", '\u{f1788}'), // 󱞈 ("md_progress_upload", '\u{f0998}'), // 󰦘 ("md_progress_wrench", '\u{f0cbd}'), // ó°²½ ("md_projector", '\u{f042e}'), // ó°® ("md_projector_off", '\u{f1a23}'), // 󱨣 ("md_projector_screen", '\u{f042f}'), // ó°¯ ("md_projector_screen_off", '\u{f180d}'), // ó±  ("md_projector_screen_off_outline", '\u{f180e}'), // ó± Ž ("md_projector_screen_outline", '\u{f1724}'), // 󱜤 ("md_projector_screen_variant", '\u{f180f}'), // ó±  ("md_projector_screen_variant_off", '\u{f1810}'), // ó±  ("md_projector_screen_variant_off_outline", '\u{f1811}'), // ó± ‘ ("md_projector_screen_variant_outline", '\u{f1812}'), // ó± ’ ("md_propane_tank", '\u{f1357}'), // ó±— ("md_propane_tank_outline", '\u{f1358}'), // ó±˜ ("md_protocol", '\u{f0fd8}'), // 󰿘 ("md_publish", '\u{f06a7}'), // ó°š§ ("md_publish_off", '\u{f1945}'), // ó±¥… ("md_pulse", '\u{f0430}'), // ó°° ("md_pump", '\u{f1402}'), // ó±‚ ("md_pumpkin", '\u{f0bbf}'), // ó°®¿ ("md_purse", '\u{f0f1c}'), // 󰼜 ("md_purse_outline", '\u{f0f1d}'), // ó°¼ ("md_puzzle", '\u{f0431}'), // ó°± ("md_puzzle_check", '\u{f1426}'), // ó±¦ ("md_puzzle_check_outline", '\u{f1427}'), // ó±§ ("md_puzzle_edit", '\u{f14d3}'), // 󱓓 ("md_puzzle_edit_outline", '\u{f14d9}'), // 󱓙 ("md_puzzle_heart", '\u{f14d4}'), // 󱓔 ("md_puzzle_heart_outline", '\u{f14da}'), // 󱓚 ("md_puzzle_minus", '\u{f14d1}'), // 󱓑 ("md_puzzle_minus_outline", '\u{f14d7}'), // 󱓗 ("md_puzzle_outline", '\u{f0a66}'), // 󰩦 ("md_puzzle_plus", '\u{f14d0}'), // ó±“ ("md_puzzle_plus_outline", '\u{f14d6}'), // 󱓖 ("md_puzzle_remove", '\u{f14d2}'), // 󱓒 ("md_puzzle_remove_outline", '\u{f14d8}'), // 󱓘 ("md_puzzle_star", '\u{f14d5}'), // 󱓕 ("md_puzzle_star_outline", '\u{f14db}'), // 󱓛 ("md_pyramid", '\u{f1952}'), // ó±¥’ ("md_pyramid_off", '\u{f1953}'), // 󱥓 ("md_qi", '\u{f0999}'), // 󰦙 ("md_qqchat", '\u{f0605}'), // ó°˜… ("md_qrcode", '\u{f0432}'), // ó°² ("md_qrcode_edit", '\u{f08b8}'), // 󰢸 ("md_qrcode_minus", '\u{f118c}'), // 󱆌 ("md_qrcode_plus", '\u{f118b}'), // 󱆋 ("md_qrcode_remove", '\u{f118d}'), // ó±† ("md_qrcode_scan", '\u{f0433}'), // ó°³ ("md_quadcopter", '\u{f0434}'), // ó°´ ("md_quality_high", '\u{f0435}'), // ó°µ ("md_quality_low", '\u{f0a0c}'), // 󰨌 ("md_quality_medium", '\u{f0a0d}'), // ó°¨ ("md_quora", '\u{f0d29}'), // ó°´© ("md_rabbit", '\u{f0907}'), // 󰤇 ("md_rabbit_variant", '\u{f1a61}'), // 󱩡 ("md_rabbit_variant_outline", '\u{f1a62}'), // 󱩢 ("md_racing_helmet", '\u{f0d93}'), // ó°¶“ ("md_racquetball", '\u{f0d94}'), // ó°¶” ("md_radar", '\u{f0437}'), // ó°· ("md_radiator", '\u{f0438}'), // ó°¸ ("md_radiator_disabled", '\u{f0ad7}'), // ó°«— ("md_radiator_off", '\u{f0ad8}'), // 󰫘 ("md_radio", '\u{f0439}'), // ó°¹ ("md_radio_am", '\u{f0cbe}'), // ó°²¾ ("md_radio_fm", '\u{f0cbf}'), // 󰲿 ("md_radio_handheld", '\u{f043a}'), // ó°º ("md_radio_off", '\u{f121c}'), // 󱈜 ("md_radio_tower", '\u{f043b}'), // ó°» ("md_radioactive", '\u{f043c}'), // ó°¼ ("md_radioactive_circle", '\u{f185d}'), // ó±¡ ("md_radioactive_circle_outline", '\u{f185e}'), // 󱡞 ("md_radioactive_off", '\u{f0ec1}'), // ó°» ("md_radiobox_marked", '\u{f043e}'), // ó°¾ ("md_radiology_box", '\u{f14c5}'), // 󱓅 ("md_radiology_box_outline", '\u{f14c6}'), // 󱓆 ("md_radius", '\u{f0cc0}'), // ó°³€ ("md_radius_outline", '\u{f0cc1}'), // ó°³ ("md_railroad_light", '\u{f0f1e}'), // 󰼞 ("md_rake", '\u{f1544}'), // 󱕄 ("md_raspberry_pi", '\u{f043f}'), // ó°¿ ("md_raw", '\u{f1a0f}'), // ó±¨ ("md_raw_off", '\u{f1a10}'), // ó±¨ ("md_ray_end", '\u{f0440}'), // ó°‘€ ("md_ray_end_arrow", '\u{f0441}'), // ó°‘ ("md_ray_start", '\u{f0442}'), // ó°‘‚ ("md_ray_start_arrow", '\u{f0443}'), // 󰑃 ("md_ray_start_end", '\u{f0444}'), // ó°‘„ ("md_ray_start_vertex_end", '\u{f15d8}'), // ó±—˜ ("md_ray_vertex", '\u{f0445}'), // ó°‘… ("md_razor_double_edge", '\u{f1997}'), // 󱦗 ("md_razor_single_edge", '\u{f1998}'), // 󱦘 ("md_react", '\u{f0708}'), // 󰜈 ("md_read", '\u{f0447}'), // 󰑇 ("md_receipt", '\u{f0449}'), // 󰑉 ("md_receipt_outline", '\u{f19dc}'), // ó±§œ ("md_receipt_text_check", '\u{f1a63}'), // 󱩣 ("md_receipt_text_check_outline", '\u{f1a64}'), // 󱩤 ("md_receipt_text_minus", '\u{f1a65}'), // 󱩥 ("md_receipt_text_minus_outline", '\u{f1a66}'), // 󱩦 ("md_receipt_text_plus", '\u{f1a67}'), // 󱩧 ("md_receipt_text_plus_outline", '\u{f1a68}'), // 󱩨 ("md_receipt_text_remove", '\u{f1a69}'), // 󱩩 ("md_receipt_text_remove_outline", '\u{f1a6a}'), // 󱩪 ("md_record", '\u{f044a}'), // ó°‘Š ("md_record_circle", '\u{f0ec2}'), // ó°»‚ ("md_record_circle_outline", '\u{f0ec3}'), // 󰻃 ("md_record_player", '\u{f099a}'), // 󰦚 ("md_record_rec", '\u{f044b}'), // ó°‘‹ ("md_rectangle", '\u{f0e5e}'), // 󰹞 ("md_rectangle_outline", '\u{f0e5f}'), // 󰹟 ("md_recycle", '\u{f044c}'), // ó°‘Œ ("md_recycle_variant", '\u{f139d}'), // ó±Ž ("md_reddit", '\u{f044d}'), // ó°‘ ("md_redhat", '\u{f111b}'), // 󱄛 ("md_redo", '\u{f044e}'), // ó°‘Ž ("md_redo_variant", '\u{f044f}'), // ó°‘ ("md_reflect_horizontal", '\u{f0a0e}'), // 󰨎 ("md_reflect_vertical", '\u{f0a0f}'), // ó°¨ ("md_refresh", '\u{f0450}'), // ó°‘ ("md_refresh_auto", '\u{f18f2}'), // ó±£² ("md_refresh_circle", '\u{f1377}'), // ó±· ("md_regex", '\u{f0451}'), // ó°‘‘ ("md_registered_trademark", '\u{f0a67}'), // ó°©§ ("md_reiterate", '\u{f1588}'), // ó±–ˆ ("md_relation_many_to_many", '\u{f1496}'), // ó±’– ("md_relation_many_to_one", '\u{f1497}'), // ó±’— ("md_relation_many_to_one_or_many", '\u{f1498}'), // ó±’˜ ("md_relation_many_to_only_one", '\u{f1499}'), // ó±’™ ("md_relation_many_to_zero_or_many", '\u{f149a}'), // ó±’š ("md_relation_many_to_zero_or_one", '\u{f149b}'), // ó±’› ("md_relation_one_or_many_to_many", '\u{f149c}'), // ó±’œ ("md_relation_one_or_many_to_one", '\u{f149d}'), // ó±’ ("md_relation_one_or_many_to_one_or_many", '\u{f149e}'), // ó±’ž ("md_relation_one_or_many_to_only_one", '\u{f149f}'), // ó±’Ÿ ("md_relation_one_or_many_to_zero_or_many", '\u{f14a0}'), // ó±’  ("md_relation_one_or_many_to_zero_or_one", '\u{f14a1}'), // ó±’¡ ("md_relation_one_to_many", '\u{f14a2}'), // ó±’¢ ("md_relation_one_to_one", '\u{f14a3}'), // ó±’£ ("md_relation_one_to_one_or_many", '\u{f14a4}'), // ó±’¤ ("md_relation_one_to_only_one", '\u{f14a5}'), // ó±’¥ ("md_relation_one_to_zero_or_many", '\u{f14a6}'), // ó±’¦ ("md_relation_one_to_zero_or_one", '\u{f14a7}'), // ó±’§ ("md_relation_only_one_to_many", '\u{f14a8}'), // ó±’¨ ("md_relation_only_one_to_one", '\u{f14a9}'), // ó±’© ("md_relation_only_one_to_one_or_many", '\u{f14aa}'), // ó±’ª ("md_relation_only_one_to_only_one", '\u{f14ab}'), // ó±’« ("md_relation_only_one_to_zero_or_many", '\u{f14ac}'), // ó±’¬ ("md_relation_only_one_to_zero_or_one", '\u{f14ad}'), // ó±’­ ("md_relation_zero_or_many_to_many", '\u{f14ae}'), // ó±’® ("md_relation_zero_or_many_to_one", '\u{f14af}'), // ó±’¯ ("md_relation_zero_or_many_to_one_or_many", '\u{f14b0}'), // ó±’° ("md_relation_zero_or_many_to_only_one", '\u{f14b1}'), // ó±’± ("md_relation_zero_or_many_to_zero_or_many", '\u{f14b2}'), // ó±’² ("md_relation_zero_or_many_to_zero_or_one", '\u{f14b3}'), // ó±’³ ("md_relation_zero_or_one_to_many", '\u{f14b4}'), // ó±’´ ("md_relation_zero_or_one_to_one", '\u{f14b5}'), // ó±’µ ("md_relation_zero_or_one_to_one_or_many", '\u{f14b6}'), // ó±’¶ ("md_relation_zero_or_one_to_only_one", '\u{f14b7}'), // ó±’· ("md_relation_zero_or_one_to_zero_or_many", '\u{f14b8}'), // ó±’¸ ("md_relation_zero_or_one_to_zero_or_one", '\u{f14b9}'), // ó±’¹ ("md_relative_scale", '\u{f0452}'), // ó°‘’ ("md_reload", '\u{f0453}'), // ó°‘“ ("md_reload_alert", '\u{f110b}'), // 󱄋 ("md_reminder", '\u{f088c}'), // 󰢌 ("md_remote", '\u{f0454}'), // ó°‘” ("md_remote_desktop", '\u{f08b9}'), // ó°¢¹ ("md_remote_off", '\u{f0ec4}'), // ó°»„ ("md_remote_tv", '\u{f0ec5}'), // ó°»… ("md_remote_tv_off", '\u{f0ec6}'), // 󰻆 ("md_rename_box", '\u{f0455}'), // ó°‘• ("md_reorder_horizontal", '\u{f0688}'), // 󰚈 ("md_reorder_vertical", '\u{f0689}'), // 󰚉 ("md_repeat", '\u{f0456}'), // ó°‘– ("md_repeat_off", '\u{f0457}'), // ó°‘— ("md_repeat_once", '\u{f0458}'), // 󰑘 ("md_repeat_variant", '\u{f0547}'), // 󰕇 ("md_replay", '\u{f0459}'), // ó°‘™ ("md_reply", '\u{f045a}'), // ó°‘š ("md_reply_all", '\u{f045b}'), // ó°‘› ("md_reply_all_outline", '\u{f0f1f}'), // 󰼟 ("md_reply_circle", '\u{f11ae}'), // 󱆮 ("md_reply_outline", '\u{f0f20}'), // ó°¼  ("md_reproduction", '\u{f045c}'), // ó°‘œ ("md_resistor", '\u{f0b44}'), // ó°­„ ("md_resistor_nodes", '\u{f0b45}'), // ó°­… ("md_resize", '\u{f0a68}'), // 󰩨 ("md_resize_bottom_right", '\u{f045d}'), // ó°‘ ("md_responsive", '\u{f045e}'), // ó°‘ž ("md_restart", '\u{f0709}'), // 󰜉 ("md_restart_alert", '\u{f110c}'), // 󱄌 ("md_restart_off", '\u{f0d95}'), // ó°¶• ("md_restore", '\u{f099b}'), // 󰦛 ("md_restore_alert", '\u{f110d}'), // ó±„ ("md_rewind", '\u{f045f}'), // ó°‘Ÿ ("md_rewind_5", '\u{f11f9}'), // 󱇹 ("md_rewind_10", '\u{f0d2a}'), // ó°´ª ("md_rewind_15", '\u{f1946}'), // 󱥆 ("md_rewind_30", '\u{f0d96}'), // ó°¶– ("md_rewind_60", '\u{f160c}'), // 󱘌 ("md_rewind_outline", '\u{f070a}'), // 󰜊 ("md_rhombus", '\u{f070b}'), // 󰜋 ("md_rhombus_medium", '\u{f0a10}'), // ó°¨ ("md_rhombus_medium_outline", '\u{f14dc}'), // 󱓜 ("md_rhombus_outline", '\u{f070c}'), // 󰜌 ("md_rhombus_split", '\u{f0a11}'), // 󰨑 ("md_rhombus_split_outline", '\u{f14dd}'), // ó±“ ("md_ribbon", '\u{f0460}'), // ó°‘  ("md_rice", '\u{f07ea}'), // 󰟪 ("md_rickshaw", '\u{f15bb}'), // ó±–» ("md_rickshaw_electric", '\u{f15bc}'), // ó±–¼ ("md_ring", '\u{f07eb}'), // ó°Ÿ« ("md_rivet", '\u{f0e60}'), // ó°¹  ("md_road", '\u{f0461}'), // ó°‘¡ ("md_road_variant", '\u{f0462}'), // ó°‘¢ ("md_robber", '\u{f1058}'), // ó±˜ ("md_robot", '\u{f06a9}'), // ó°š© ("md_robot_angry", '\u{f169d}'), // ó±š ("md_robot_angry_outline", '\u{f169e}'), // 󱚞 ("md_robot_confused", '\u{f169f}'), // 󱚟 ("md_robot_confused_outline", '\u{f16a0}'), // 󱚠 ("md_robot_dead", '\u{f16a1}'), // 󱚡 ("md_robot_dead_outline", '\u{f16a2}'), // 󱚢 ("md_robot_excited", '\u{f16a3}'), // 󱚣 ("md_robot_excited_outline", '\u{f16a4}'), // 󱚤 ("md_robot_happy", '\u{f1719}'), // 󱜙 ("md_robot_happy_outline", '\u{f171a}'), // 󱜚 ("md_robot_industrial", '\u{f0b46}'), // ó°­† ("md_robot_industrial_outline", '\u{f1a1a}'), // 󱨚 ("md_robot_love", '\u{f16a5}'), // 󱚥 ("md_robot_love_outline", '\u{f16a6}'), // 󱚦 ("md_robot_mower", '\u{f11f7}'), // 󱇷 ("md_robot_mower_outline", '\u{f11f3}'), // 󱇳 ("md_robot_off", '\u{f16a7}'), // 󱚧 ("md_robot_off_outline", '\u{f167b}'), // ó±™» ("md_robot_outline", '\u{f167a}'), // 󱙺 ("md_robot_vacuum", '\u{f070d}'), // ó°œ ("md_robot_vacuum_variant", '\u{f0908}'), // 󰤈 ("md_rocket", '\u{f0463}'), // ó°‘£ ("md_rocket_launch", '\u{f14de}'), // 󱓞 ("md_rocket_launch_outline", '\u{f14df}'), // 󱓟 ("md_rocket_outline", '\u{f13af}'), // 󱎯 ("md_rodent", '\u{f1327}'), // 󱌧 ("md_roller_shade", '\u{f1a6b}'), // 󱩫 ("md_roller_shade_closed", '\u{f1a6c}'), // 󱩬 ("md_roller_skate", '\u{f0d2b}'), // ó°´« ("md_roller_skate_off", '\u{f0145}'), // ó°…… ("md_rollerblade", '\u{f0d2c}'), // ó°´¬ ("md_rollerblade_off", '\u{f002e}'), // ó°€® ("md_rollupjs", '\u{f0bc0}'), // 󰯀 ("md_rolodex", '\u{f1ab9}'), // 󱪹 ("md_rolodex_outline", '\u{f1aba}'), // 󱪺 ("md_roman_numeral_2", '\u{f1089}'), // 󱂉 ("md_roman_numeral_3", '\u{f108a}'), // 󱂊 ("md_roman_numeral_4", '\u{f108b}'), // 󱂋 ("md_roman_numeral_6", '\u{f108d}'), // ó±‚ ("md_roman_numeral_7", '\u{f108e}'), // 󱂎 ("md_roman_numeral_8", '\u{f108f}'), // ó±‚ ("md_roman_numeral_9", '\u{f1090}'), // ó±‚ ("md_room_service", '\u{f088d}'), // ó°¢ ("md_room_service_outline", '\u{f0d97}'), // ó°¶— ("md_rotate_360", '\u{f1999}'), // 󱦙 ("md_rotate_3d", '\u{f0ec7}'), // 󰻇 ("md_rotate_3d_variant", '\u{f0464}'), // 󰑤 ("md_rotate_left", '\u{f0465}'), // ó°‘¥ ("md_rotate_left_variant", '\u{f0466}'), // 󰑦 ("md_rotate_orbit", '\u{f0d98}'), // 󰶘 ("md_rotate_right", '\u{f0467}'), // ó°‘§ ("md_rotate_right_variant", '\u{f0468}'), // 󰑨 ("md_rounded_corner", '\u{f0607}'), // 󰘇 ("md_router", '\u{f11e2}'), // 󱇢 ("md_router_network", '\u{f1087}'), // 󱂇 ("md_router_wireless", '\u{f0469}'), // ó°‘© ("md_router_wireless_off", '\u{f15a3}'), // ó±–£ ("md_router_wireless_settings", '\u{f0a69}'), // ó°©© ("md_routes", '\u{f046a}'), // 󰑪 ("md_routes_clock", '\u{f1059}'), // ó±™ ("md_rowing", '\u{f0608}'), // 󰘈 ("md_rss", '\u{f046b}'), // ó°‘« ("md_rss_box", '\u{f046c}'), // 󰑬 ("md_rss_off", '\u{f0f21}'), // 󰼡 ("md_rug", '\u{f1475}'), // 󱑵 ("md_rugby", '\u{f0d99}'), // ó°¶™ ("md_ruler", '\u{f046d}'), // ó°‘­ ("md_ruler_square", '\u{f0cc2}'), // 󰳂 ("md_ruler_square_compass", '\u{f0ebe}'), // 󰺾 ("md_run", '\u{f070e}'), // 󰜎 ("md_run_fast", '\u{f046e}'), // ó°‘® ("md_rv_truck", '\u{f11d4}'), // 󱇔 ("md_sack", '\u{f0d2e}'), // ó°´® ("md_sack_percent", '\u{f0d2f}'), // ó°´¯ ("md_safe", '\u{f0a6a}'), // 󰩪 ("md_safe_square", '\u{f127c}'), // 󱉼 ("md_safe_square_outline", '\u{f127d}'), // 󱉽 ("md_safety_goggles", '\u{f0d30}'), // ó°´° ("md_sail_boat", '\u{f0ec8}'), // 󰻈 ("md_sail_boat_sink", '\u{f1aef}'), // 󱫯 ("md_sale", '\u{f046f}'), // 󰑯 ("md_sale_outline", '\u{f1a06}'), // 󱨆 ("md_salesforce", '\u{f088e}'), // 󰢎 ("md_sass", '\u{f07ec}'), // 󰟬 ("md_satellite", '\u{f0470}'), // ó°‘° ("md_satellite_uplink", '\u{f0909}'), // 󰤉 ("md_satellite_variant", '\u{f0471}'), // ó°‘± ("md_sausage", '\u{f08ba}'), // 󰢺 ("md_sausage_off", '\u{f1789}'), // 󱞉 ("md_saw_blade", '\u{f0e61}'), // 󰹡 ("md_sawtooth_wave", '\u{f147a}'), // 󱑺 ("md_saxophone", '\u{f0609}'), // 󰘉 ("md_scale", '\u{f0472}'), // ó°‘² ("md_scale_balance", '\u{f05d1}'), // ó°—‘ ("md_scale_bathroom", '\u{f0473}'), // ó°‘³ ("md_scale_off", '\u{f105a}'), // ó±š ("md_scale_unbalanced", '\u{f19b8}'), // 󱦸 ("md_scan_helper", '\u{f13d8}'), // ó±˜ ("md_scanner", '\u{f06ab}'), // ó°š« ("md_scanner_off", '\u{f090a}'), // 󰤊 ("md_scatter_plot", '\u{f0ec9}'), // 󰻉 ("md_scatter_plot_outline", '\u{f0eca}'), // 󰻊 ("md_scent", '\u{f1958}'), // 󱥘 ("md_scent_off", '\u{f1959}'), // ó±¥™ ("md_school", '\u{f0474}'), // ó°‘´ ("md_school_outline", '\u{f1180}'), // 󱆀 ("md_scissors_cutting", '\u{f0a6b}'), // ó°©« ("md_scooter", '\u{f15bd}'), // ó±–½ ("md_scooter_electric", '\u{f15be}'), // ó±–¾ ("md_scoreboard", '\u{f127e}'), // 󱉾 ("md_scoreboard_outline", '\u{f127f}'), // 󱉿 ("md_screen_rotation", '\u{f0475}'), // ó°‘µ ("md_screen_rotation_lock", '\u{f0478}'), // 󰑸 ("md_screw_flat_top", '\u{f0df3}'), // ó°·³ ("md_screw_lag", '\u{f0df4}'), // ó°·´ ("md_screw_machine_flat_top", '\u{f0df5}'), // ó°·µ ("md_screw_machine_round_top", '\u{f0df6}'), // ó°·¶ ("md_screw_round_top", '\u{f0df7}'), // ó°·· ("md_screwdriver", '\u{f0476}'), // ó°‘¶ ("md_script", '\u{f0bc1}'), // ó°¯ ("md_script_outline", '\u{f0477}'), // ó°‘· ("md_script_text", '\u{f0bc2}'), // 󰯂 ("md_script_text_key", '\u{f1725}'), // 󱜥 ("md_script_text_key_outline", '\u{f1726}'), // 󱜦 ("md_script_text_outline", '\u{f0bc3}'), // 󰯃 ("md_script_text_play", '\u{f1727}'), // 󱜧 ("md_script_text_play_outline", '\u{f1728}'), // 󱜨 ("md_sd", '\u{f0479}'), // ó°‘¹ ("md_seal", '\u{f047a}'), // 󰑺 ("md_seal_variant", '\u{f0fd9}'), // ó°¿™ ("md_search_web", '\u{f070f}'), // ó°œ ("md_seat", '\u{f0cc3}'), // 󰳃 ("md_seat_flat", '\u{f047b}'), // ó°‘» ("md_seat_flat_angled", '\u{f047c}'), // ó°‘¼ ("md_seat_individual_suite", '\u{f047d}'), // ó°‘½ ("md_seat_legroom_extra", '\u{f047e}'), // ó°‘¾ ("md_seat_legroom_normal", '\u{f047f}'), // ó°‘¿ ("md_seat_legroom_reduced", '\u{f0480}'), // ó°’€ ("md_seat_outline", '\u{f0cc4}'), // 󰳄 ("md_seat_passenger", '\u{f1249}'), // 󱉉 ("md_seat_recline_extra", '\u{f0481}'), // ó°’ ("md_seat_recline_normal", '\u{f0482}'), // ó°’‚ ("md_seatbelt", '\u{f0cc5}'), // ó°³… ("md_security", '\u{f0483}'), // ó°’ƒ ("md_security_network", '\u{f0484}'), // ó°’„ ("md_seed", '\u{f0e62}'), // ó°¹¢ ("md_seed_off", '\u{f13fd}'), // ó±½ ("md_seed_off_outline", '\u{f13fe}'), // ó±¾ ("md_seed_outline", '\u{f0e63}'), // ó°¹£ ("md_seed_plus", '\u{f1a6d}'), // 󱩭 ("md_seed_plus_outline", '\u{f1a6e}'), // 󱩮 ("md_seesaw", '\u{f15a4}'), // ó±–¤ ("md_segment", '\u{f0ecb}'), // ó°»‹ ("md_select", '\u{f0485}'), // ó°’… ("md_select_all", '\u{f0486}'), // ó°’† ("md_select_color", '\u{f0d31}'), // ó°´± ("md_select_compare", '\u{f0ad9}'), // ó°«™ ("md_select_drag", '\u{f0a6c}'), // 󰩬 ("md_select_group", '\u{f0f82}'), // 󰾂 ("md_select_inverse", '\u{f0487}'), // ó°’‡ ("md_select_marker", '\u{f1280}'), // 󱊀 ("md_select_multiple", '\u{f1281}'), // ó±Š ("md_select_multiple_marker", '\u{f1282}'), // 󱊂 ("md_select_off", '\u{f0488}'), // ó°’ˆ ("md_select_place", '\u{f0fda}'), // ó°¿š ("md_select_remove", '\u{f17c1}'), // ó±Ÿ ("md_select_search", '\u{f1204}'), // 󱈄 ("md_selection", '\u{f0489}'), // ó°’‰ ("md_selection_drag", '\u{f0a6d}'), // ó°©­ ("md_selection_ellipse", '\u{f0d32}'), // ó°´² ("md_selection_ellipse_arrow_inside", '\u{f0f22}'), // ó°¼¢ ("md_selection_ellipse_remove", '\u{f17c2}'), // 󱟂 ("md_selection_marker", '\u{f1283}'), // 󱊃 ("md_selection_multiple", '\u{f1285}'), // 󱊅 ("md_selection_multiple_marker", '\u{f1284}'), // 󱊄 ("md_selection_off", '\u{f0777}'), // ó°· ("md_selection_remove", '\u{f17c3}'), // 󱟃 ("md_selection_search", '\u{f1205}'), // 󱈅 ("md_semantic_web", '\u{f1316}'), // 󱌖 ("md_send", '\u{f048a}'), // ó°’Š ("md_send_check", '\u{f1161}'), // ó±…¡ ("md_send_check_outline", '\u{f1162}'), // ó±…¢ ("md_send_circle", '\u{f0df8}'), // ó°·¸ ("md_send_circle_outline", '\u{f0df9}'), // ó°·¹ ("md_send_clock", '\u{f1163}'), // ó±…£ ("md_send_clock_outline", '\u{f1164}'), // ó±…¤ ("md_send_lock", '\u{f07ed}'), // ó°Ÿ­ ("md_send_lock_outline", '\u{f1166}'), // ó±…¦ ("md_send_outline", '\u{f1165}'), // ó±…¥ ("md_serial_port", '\u{f065c}'), // 󰙜 ("md_server", '\u{f048b}'), // ó°’‹ ("md_server_minus", '\u{f048c}'), // ó°’Œ ("md_server_network", '\u{f048d}'), // ó°’ ("md_server_network_off", '\u{f048e}'), // ó°’Ž ("md_server_off", '\u{f048f}'), // ó°’ ("md_server_plus", '\u{f0490}'), // ó°’ ("md_server_remove", '\u{f0491}'), // ó°’‘ ("md_server_security", '\u{f0492}'), // ó°’’ ("md_set_all", '\u{f0778}'), // ó°¸ ("md_set_center", '\u{f0779}'), // ó°¹ ("md_set_center_right", '\u{f077a}'), // ó°º ("md_set_left", '\u{f077b}'), // ó°» ("md_set_left_center", '\u{f077c}'), // ó°¼ ("md_set_left_right", '\u{f077d}'), // ó°½ ("md_set_merge", '\u{f14e0}'), // 󱓠 ("md_set_none", '\u{f077e}'), // ó°¾ ("md_set_right", '\u{f077f}'), // ó°¿ ("md_set_split", '\u{f14e1}'), // 󱓡 ("md_set_square", '\u{f145d}'), // ó±‘ ("md_set_top_box", '\u{f099f}'), // 󰦟 ("md_settings_helper", '\u{f0a6e}'), // ó°©® ("md_shaker", '\u{f110e}'), // 󱄎 ("md_shaker_outline", '\u{f110f}'), // ó±„ ("md_shape", '\u{f0831}'), // ó° ± ("md_shape_circle_plus", '\u{f065d}'), // ó°™ ("md_shape_outline", '\u{f0832}'), // ó° ² ("md_shape_oval_plus", '\u{f11fa}'), // 󱇺 ("md_shape_plus", '\u{f0495}'), // ó°’• ("md_shape_polygon_plus", '\u{f065e}'), // 󰙞 ("md_shape_rectangle_plus", '\u{f065f}'), // 󰙟 ("md_shape_square_plus", '\u{f0660}'), // ó°™  ("md_shape_square_rounded_plus", '\u{f14fa}'), // 󱓺 ("md_share", '\u{f0496}'), // ó°’– ("md_share_all", '\u{f11f4}'), // 󱇴 ("md_share_all_outline", '\u{f11f5}'), // 󱇵 ("md_share_circle", '\u{f11ad}'), // 󱆭 ("md_share_off", '\u{f0f23}'), // ó°¼£ ("md_share_off_outline", '\u{f0f24}'), // 󰼤 ("md_share_outline", '\u{f0932}'), // 󰤲 ("md_share_variant", '\u{f0497}'), // ó°’— ("md_share_variant_outline", '\u{f1514}'), // ó±”” ("md_shark", '\u{f18ba}'), // 󱢺 ("md_shark_fin", '\u{f1673}'), // ó±™³ ("md_shark_fin_outline", '\u{f1674}'), // ó±™´ ("md_shark_off", '\u{f18bb}'), // ó±¢» ("md_sheep", '\u{f0cc6}'), // 󰳆 ("md_shield", '\u{f0498}'), // ó°’˜ ("md_shield_account", '\u{f088f}'), // ó°¢ ("md_shield_account_outline", '\u{f0a12}'), // ó°¨’ ("md_shield_account_variant", '\u{f15a7}'), // ó±–§ ("md_shield_account_variant_outline", '\u{f15a8}'), // ó±–¨ ("md_shield_airplane", '\u{f06bb}'), // ó°š» ("md_shield_airplane_outline", '\u{f0cc7}'), // 󰳇 ("md_shield_alert", '\u{f0ecc}'), // 󰻌 ("md_shield_alert_outline", '\u{f0ecd}'), // ó°» ("md_shield_bug", '\u{f13da}'), // ó±š ("md_shield_bug_outline", '\u{f13db}'), // ó±› ("md_shield_car", '\u{f0f83}'), // 󰾃 ("md_shield_check", '\u{f0565}'), // ó°•¥ ("md_shield_check_outline", '\u{f0cc8}'), // 󰳈 ("md_shield_cross", '\u{f0cc9}'), // 󰳉 ("md_shield_cross_outline", '\u{f0cca}'), // 󰳊 ("md_shield_crown", '\u{f18bc}'), // ó±¢¼ ("md_shield_crown_outline", '\u{f18bd}'), // ó±¢½ ("md_shield_edit", '\u{f11a0}'), // 󱆠 ("md_shield_edit_outline", '\u{f11a1}'), // 󱆡 ("md_shield_half", '\u{f1360}'), // ó±  ("md_shield_half_full", '\u{f0780}'), // 󰞀 ("md_shield_home", '\u{f068a}'), // 󰚊 ("md_shield_home_outline", '\u{f0ccb}'), // 󰳋 ("md_shield_key", '\u{f0bc4}'), // 󰯄 ("md_shield_key_outline", '\u{f0bc5}'), // ó°¯… ("md_shield_link_variant", '\u{f0d33}'), // ó°´³ ("md_shield_link_variant_outline", '\u{f0d34}'), // ó°´´ ("md_shield_lock", '\u{f099d}'), // ó°¦ ("md_shield_lock_open", '\u{f199a}'), // 󱦚 ("md_shield_lock_open_outline", '\u{f199b}'), // 󱦛 ("md_shield_lock_outline", '\u{f0ccc}'), // 󰳌 ("md_shield_moon", '\u{f1828}'), // ó± ¨ ("md_shield_moon_outline", '\u{f1829}'), // ó± © ("md_shield_off", '\u{f099e}'), // 󰦞 ("md_shield_off_outline", '\u{f099c}'), // 󰦜 ("md_shield_outline", '\u{f0499}'), // ó°’™ ("md_shield_plus", '\u{f0ada}'), // ó°«š ("md_shield_plus_outline", '\u{f0adb}'), // ó°«› ("md_shield_refresh", '\u{f00aa}'), // 󰂪 ("md_shield_refresh_outline", '\u{f01e0}'), // ó°‡  ("md_shield_remove", '\u{f0adc}'), // ó°«œ ("md_shield_remove_outline", '\u{f0add}'), // ó°« ("md_shield_search", '\u{f0d9a}'), // ó°¶š ("md_shield_star", '\u{f113b}'), // 󱄻 ("md_shield_star_outline", '\u{f113c}'), // 󱄼 ("md_shield_sun", '\u{f105d}'), // ó± ("md_shield_sun_outline", '\u{f105e}'), // ó±ž ("md_shield_sword", '\u{f18be}'), // ó±¢¾ ("md_shield_sword_outline", '\u{f18bf}'), // 󱢿 ("md_shield_sync", '\u{f11a2}'), // 󱆢 ("md_shield_sync_outline", '\u{f11a3}'), // 󱆣 ("md_shimmer", '\u{f1545}'), // 󱕅 ("md_ship_wheel", '\u{f0833}'), // ó° ³ ("md_shipping_pallet", '\u{f184e}'), // 󱡎 ("md_shoe_ballet", '\u{f15ca}'), // ó±—Š ("md_shoe_cleat", '\u{f15c7}'), // ó±—‡ ("md_shoe_formal", '\u{f0b47}'), // ó°­‡ ("md_shoe_heel", '\u{f0b48}'), // ó°­ˆ ("md_shoe_print", '\u{f0dfa}'), // ó°·º ("md_shoe_sneaker", '\u{f15c8}'), // ó±—ˆ ("md_shopping", '\u{f049a}'), // ó°’š ("md_shopping_music", '\u{f049b}'), // ó°’› ("md_shopping_outline", '\u{f11d5}'), // 󱇕 ("md_shopping_search", '\u{f0f84}'), // 󰾄 ("md_shopping_search_outline", '\u{f1a6f}'), // 󱩯 ("md_shore", '\u{f14f9}'), // 󱓹 ("md_shovel", '\u{f0710}'), // ó°œ ("md_shovel_off", '\u{f0711}'), // 󰜑 ("md_shower", '\u{f09a0}'), // ó°¦  ("md_shower_head", '\u{f09a1}'), // 󰦡 ("md_shredder", '\u{f049c}'), // ó°’œ ("md_shuffle", '\u{f049d}'), // ó°’ ("md_shuffle_disabled", '\u{f049e}'), // ó°’ž ("md_shuffle_variant", '\u{f049f}'), // ó°’Ÿ ("md_shuriken", '\u{f137f}'), // ó±¿ ("md_sickle", '\u{f18c0}'), // ó±£€ ("md_sigma", '\u{f04a0}'), // ó°’  ("md_sigma_lower", '\u{f062b}'), // 󰘫 ("md_sign_caution", '\u{f04a1}'), // ó°’¡ ("md_sign_direction", '\u{f0781}'), // ó°ž ("md_sign_direction_minus", '\u{f1000}'), // ó±€€ ("md_sign_direction_plus", '\u{f0fdc}'), // ó°¿œ ("md_sign_direction_remove", '\u{f0fdd}'), // ó°¿ ("md_sign_pole", '\u{f14f8}'), // 󱓸 ("md_sign_real_estate", '\u{f1118}'), // 󱄘 ("md_sign_text", '\u{f0782}'), // ó°ž‚ ("md_signal", '\u{f04a2}'), // ó°’¢ ("md_signal_2g", '\u{f0712}'), // 󰜒 ("md_signal_3g", '\u{f0713}'), // 󰜓 ("md_signal_4g", '\u{f0714}'), // 󰜔 ("md_signal_5g", '\u{f0a6f}'), // 󰩯 ("md_signal_cellular_1", '\u{f08bc}'), // ó°¢¼ ("md_signal_cellular_2", '\u{f08bd}'), // ó°¢½ ("md_signal_cellular_3", '\u{f08be}'), // ó°¢¾ ("md_signal_cellular_outline", '\u{f08bf}'), // 󰢿 ("md_signal_distance_variant", '\u{f0e64}'), // 󰹤 ("md_signal_hspa", '\u{f0715}'), // 󰜕 ("md_signal_hspa_plus", '\u{f0716}'), // 󰜖 ("md_signal_off", '\u{f0783}'), // 󰞃 ("md_signal_variant", '\u{f060a}'), // 󰘊 ("md_signature", '\u{f0dfb}'), // ó°·» ("md_signature_freehand", '\u{f0dfc}'), // ó°·¼ ("md_signature_image", '\u{f0dfd}'), // ó°·½ ("md_signature_text", '\u{f0dfe}'), // ó°·¾ ("md_silo", '\u{f0b49}'), // ó°­‰ ("md_silverware", '\u{f04a3}'), // ó°’£ ("md_silverware_clean", '\u{f0fde}'), // ó°¿ž ("md_silverware_fork", '\u{f04a4}'), // ó°’¤ ("md_silverware_fork_knife", '\u{f0a70}'), // ó°©° ("md_silverware_spoon", '\u{f04a5}'), // ó°’¥ ("md_silverware_variant", '\u{f04a6}'), // ó°’¦ ("md_sim", '\u{f04a7}'), // ó°’§ ("md_sim_alert", '\u{f04a8}'), // ó°’¨ ("md_sim_alert_outline", '\u{f15d3}'), // ó±—“ ("md_sim_off", '\u{f04a9}'), // ó°’© ("md_sim_off_outline", '\u{f15d4}'), // ó±—” ("md_sim_outline", '\u{f15d5}'), // ó±—• ("md_simple_icons", '\u{f131d}'), // ó±Œ ("md_sina_weibo", '\u{f0adf}'), // ó°«Ÿ ("md_sine_wave", '\u{f095b}'), // ó°¥› ("md_sitemap", '\u{f04aa}'), // ó°’ª ("md_sitemap_outline", '\u{f199c}'), // 󱦜 ("md_size_m", '\u{f13a5}'), // 󱎥 ("md_size_s", '\u{f13a4}'), // 󱎤 ("md_size_xl", '\u{f13a7}'), // 󱎧 ("md_size_xs", '\u{f13a3}'), // 󱎣 ("md_size_xxl", '\u{f13a8}'), // 󱎨 ("md_size_xxs", '\u{f13a2}'), // 󱎢 ("md_size_xxxl", '\u{f13a9}'), // 󱎩 ("md_skate", '\u{f0d35}'), // ó°´µ ("md_skate_off", '\u{f0699}'), // ó°š™ ("md_skateboard", '\u{f14c2}'), // 󱓂 ("md_skateboarding", '\u{f0501}'), // ó°” ("md_skew_less", '\u{f0d36}'), // ó°´¶ ("md_skew_more", '\u{f0d37}'), // ó°´· ("md_ski", '\u{f1304}'), // 󱌄 ("md_ski_cross_country", '\u{f1305}'), // 󱌅 ("md_ski_water", '\u{f1306}'), // 󱌆 ("md_skip_backward", '\u{f04ab}'), // ó°’« ("md_skip_backward_outline", '\u{f0f25}'), // ó°¼¥ ("md_skip_forward", '\u{f04ac}'), // ó°’¬ ("md_skip_forward_outline", '\u{f0f26}'), // 󰼦 ("md_skip_next", '\u{f04ad}'), // ó°’­ ("md_skip_next_circle", '\u{f0661}'), // ó°™¡ ("md_skip_next_circle_outline", '\u{f0662}'), // 󰙢 ("md_skip_next_outline", '\u{f0f27}'), // ó°¼§ ("md_skip_previous", '\u{f04ae}'), // ó°’® ("md_skip_previous_circle", '\u{f0663}'), // 󰙣 ("md_skip_previous_circle_outline", '\u{f0664}'), // 󰙤 ("md_skip_previous_outline", '\u{f0f28}'), // 󰼨 ("md_skull", '\u{f068c}'), // 󰚌 ("md_skull_crossbones", '\u{f0bc6}'), // 󰯆 ("md_skull_crossbones_outline", '\u{f0bc7}'), // 󰯇 ("md_skull_outline", '\u{f0bc8}'), // 󰯈 ("md_skull_scan", '\u{f14c7}'), // 󱓇 ("md_skull_scan_outline", '\u{f14c8}'), // 󱓈 ("md_skype", '\u{f04af}'), // ó°’¯ ("md_skype_business", '\u{f04b0}'), // ó°’° ("md_slack", '\u{f04b1}'), // ó°’± ("md_slash_forward", '\u{f0fdf}'), // ó°¿Ÿ ("md_slash_forward_box", '\u{f0fe0}'), // ó°¿  ("md_sledding", '\u{f041b}'), // ó°› ("md_sleep", '\u{f04b2}'), // ó°’² ("md_sleep_off", '\u{f04b3}'), // ó°’³ ("md_slide", '\u{f15a5}'), // ó±–¥ ("md_slope_downhill", '\u{f0dff}'), // ó°·¿ ("md_slope_uphill", '\u{f0e00}'), // 󰸀 ("md_slot_machine", '\u{f1114}'), // 󱄔 ("md_slot_machine_outline", '\u{f1115}'), // 󱄕 ("md_smart_card", '\u{f10bd}'), // 󱂽 ("md_smart_card_off", '\u{f18f7}'), // ó±£· ("md_smart_card_off_outline", '\u{f18f8}'), // 󱣸 ("md_smart_card_outline", '\u{f10be}'), // 󱂾 ("md_smart_card_reader", '\u{f10bf}'), // 󱂿 ("md_smart_card_reader_outline", '\u{f10c0}'), // 󱃀 ("md_smog", '\u{f0a71}'), // ó°©± ("md_smoke", '\u{f1799}'), // 󱞙 ("md_smoke_detector", '\u{f0392}'), // ó°Ž’ ("md_smoke_detector_alert", '\u{f192e}'), // 󱤮 ("md_smoke_detector_alert_outline", '\u{f192f}'), // 󱤯 ("md_smoke_detector_off", '\u{f1809}'), // ó± ‰ ("md_smoke_detector_off_outline", '\u{f180a}'), // ó± Š ("md_smoke_detector_outline", '\u{f1808}'), // ó± ˆ ("md_smoke_detector_variant", '\u{f180b}'), // ó± ‹ ("md_smoke_detector_variant_alert", '\u{f1930}'), // 󱤰 ("md_smoke_detector_variant_off", '\u{f180c}'), // ó± Œ ("md_smoking", '\u{f04b4}'), // ó°’´ ("md_smoking_off", '\u{f04b5}'), // ó°’µ ("md_smoking_pipe", '\u{f140d}'), // ó± ("md_smoking_pipe_off", '\u{f1428}'), // ó±¨ ("md_snail", '\u{f1677}'), // ó±™· ("md_snake", '\u{f150e}'), // 󱔎 ("md_snapchat", '\u{f04b6}'), // ó°’¶ ("md_snowboard", '\u{f1307}'), // 󱌇 ("md_snowflake", '\u{f0717}'), // 󰜗 ("md_snowflake_alert", '\u{f0f29}'), // 󰼩 ("md_snowflake_check", '\u{f1a70}'), // 󱩰 ("md_snowflake_melt", '\u{f12cb}'), // 󱋋 ("md_snowflake_off", '\u{f14e3}'), // 󱓣 ("md_snowflake_thermometer", '\u{f1a71}'), // 󱩱 ("md_snowflake_variant", '\u{f0f2a}'), // 󰼪 ("md_snowman", '\u{f04b7}'), // ó°’· ("md_snowmobile", '\u{f06dd}'), // ó°› ("md_snowshoeing", '\u{f1a72}'), // 󱩲 ("md_soccer", '\u{f04b8}'), // ó°’¸ ("md_soccer_field", '\u{f0834}'), // ó° ´ ("md_social_distance_2_meters", '\u{f1579}'), // 󱕹 ("md_social_distance_6_feet", '\u{f157a}'), // 󱕺 ("md_sofa", '\u{f04b9}'), // ó°’¹ ("md_sofa_outline", '\u{f156d}'), // 󱕭 ("md_sofa_single", '\u{f156e}'), // 󱕮 ("md_sofa_single_outline", '\u{f156f}'), // 󱕯 ("md_solar_panel", '\u{f0d9b}'), // ó°¶› ("md_solar_panel_large", '\u{f0d9c}'), // ó°¶œ ("md_solar_power", '\u{f0a72}'), // ó°©² ("md_solar_power_variant", '\u{f1a73}'), // 󱩳 ("md_solar_power_variant_outline", '\u{f1a74}'), // 󱩴 ("md_soldering_iron", '\u{f1092}'), // 󱂒 ("md_solid", '\u{f068d}'), // ó°š ("md_sony_playstation", '\u{f0414}'), // ó°” ("md_sort", '\u{f04ba}'), // ó°’º ("md_sort_alphabetical_ascending", '\u{f05bd}'), // ó°–½ ("md_sort_alphabetical_ascending_variant", '\u{f1148}'), // ó±…ˆ ("md_sort_alphabetical_descending", '\u{f05bf}'), // ó°–¿ ("md_sort_alphabetical_descending_variant", '\u{f1149}'), // ó±…‰ ("md_sort_alphabetical_variant", '\u{f04bb}'), // ó°’» ("md_sort_ascending", '\u{f04bc}'), // ó°’¼ ("md_sort_bool_ascending", '\u{f1385}'), // 󱎅 ("md_sort_bool_ascending_variant", '\u{f1386}'), // 󱎆 ("md_sort_bool_descending", '\u{f1387}'), // 󱎇 ("md_sort_bool_descending_variant", '\u{f1388}'), // 󱎈 ("md_sort_calendar_ascending", '\u{f1547}'), // 󱕇 ("md_sort_calendar_descending", '\u{f1548}'), // 󱕈 ("md_sort_clock_ascending", '\u{f1549}'), // 󱕉 ("md_sort_clock_ascending_outline", '\u{f154a}'), // 󱕊 ("md_sort_clock_descending", '\u{f154b}'), // 󱕋 ("md_sort_clock_descending_outline", '\u{f154c}'), // 󱕌 ("md_sort_descending", '\u{f04bd}'), // ó°’½ ("md_sort_numeric_ascending", '\u{f1389}'), // 󱎉 ("md_sort_numeric_ascending_variant", '\u{f090d}'), // ó°¤ ("md_sort_numeric_descending", '\u{f138a}'), // 󱎊 ("md_sort_numeric_descending_variant", '\u{f0ad2}'), // ó°«’ ("md_sort_numeric_variant", '\u{f04be}'), // ó°’¾ ("md_sort_reverse_variant", '\u{f033c}'), // 󰌼 ("md_sort_variant", '\u{f04bf}'), // ó°’¿ ("md_sort_variant_lock", '\u{f0ccd}'), // ó°³ ("md_sort_variant_lock_open", '\u{f0cce}'), // 󰳎 ("md_sort_variant_off", '\u{f1abb}'), // 󱪻 ("md_sort_variant_remove", '\u{f1147}'), // ó±…‡ ("md_soundbar", '\u{f17db}'), // 󱟛 ("md_soundcloud", '\u{f04c0}'), // ó°“€ ("md_source_branch", '\u{f062c}'), // 󰘬 ("md_source_branch_check", '\u{f14cf}'), // ó±“ ("md_source_branch_minus", '\u{f14cb}'), // 󱓋 ("md_source_branch_plus", '\u{f14ca}'), // 󱓊 ("md_source_branch_refresh", '\u{f14cd}'), // ó±“ ("md_source_branch_remove", '\u{f14cc}'), // 󱓌 ("md_source_branch_sync", '\u{f14ce}'), // 󱓎 ("md_source_commit", '\u{f0718}'), // 󰜘 ("md_source_commit_end", '\u{f0719}'), // 󰜙 ("md_source_commit_end_local", '\u{f071a}'), // 󰜚 ("md_source_commit_local", '\u{f071b}'), // 󰜛 ("md_source_commit_next_local", '\u{f071c}'), // 󰜜 ("md_source_commit_start", '\u{f071d}'), // ó°œ ("md_source_commit_start_next_local", '\u{f071e}'), // 󰜞 ("md_source_fork", '\u{f04c1}'), // ó°“ ("md_source_merge", '\u{f062d}'), // ó°˜­ ("md_source_pull", '\u{f04c2}'), // ó°“‚ ("md_source_repository", '\u{f0ccf}'), // ó°³ ("md_source_repository_multiple", '\u{f0cd0}'), // ó°³ ("md_soy_sauce", '\u{f07ee}'), // ó°Ÿ® ("md_soy_sauce_off", '\u{f13fc}'), // ó±¼ ("md_spa", '\u{f0cd1}'), // 󰳑 ("md_spa_outline", '\u{f0cd2}'), // ó°³’ ("md_space_invaders", '\u{f0bc9}'), // 󰯉 ("md_space_station", '\u{f1383}'), // 󱎃 ("md_spade", '\u{f0e65}'), // ó°¹¥ ("md_speaker", '\u{f04c3}'), // 󰓃 ("md_speaker_bluetooth", '\u{f09a2}'), // 󰦢 ("md_speaker_multiple", '\u{f0d38}'), // ó°´¸ ("md_speaker_off", '\u{f04c4}'), // ó°“„ ("md_speaker_wireless", '\u{f071f}'), // 󰜟 ("md_spear", '\u{f1845}'), // 󱡅 ("md_speedometer", '\u{f04c5}'), // ó°“… ("md_speedometer_medium", '\u{f0f85}'), // ó°¾… ("md_speedometer_slow", '\u{f0f86}'), // 󰾆 ("md_spellcheck", '\u{f04c6}'), // 󰓆 ("md_sphere", '\u{f1954}'), // ó±¥” ("md_sphere_off", '\u{f1955}'), // 󱥕 ("md_spider", '\u{f11ea}'), // 󱇪 ("md_spider_thread", '\u{f11eb}'), // 󱇫 ("md_spider_web", '\u{f0bca}'), // 󰯊 ("md_spirit_level", '\u{f14f1}'), // 󱓱 ("md_spoon_sugar", '\u{f1429}'), // ó±© ("md_spotify", '\u{f04c7}'), // 󰓇 ("md_spotlight", '\u{f04c8}'), // 󰓈 ("md_spotlight_beam", '\u{f04c9}'), // 󰓉 ("md_spray", '\u{f0665}'), // 󰙥 ("md_spray_bottle", '\u{f0ae0}'), // ó°«  ("md_sprinkler", '\u{f105f}'), // ó±Ÿ ("md_sprinkler_fire", '\u{f199d}'), // ó±¦ ("md_sprinkler_variant", '\u{f1060}'), // ó±  ("md_sprout", '\u{f0e66}'), // 󰹦 ("md_sprout_outline", '\u{f0e67}'), // ó°¹§ ("md_square", '\u{f0764}'), // ó°¤ ("md_square_circle", '\u{f1500}'), // 󱔀 ("md_square_edit_outline", '\u{f090c}'), // 󰤌 ("md_square_medium", '\u{f0a13}'), // 󰨓 ("md_square_medium_outline", '\u{f0a14}'), // 󰨔 ("md_square_off", '\u{f12ee}'), // 󱋮 ("md_square_off_outline", '\u{f12ef}'), // 󱋯 ("md_square_opacity", '\u{f1854}'), // 󱡔 ("md_square_outline", '\u{f0763}'), // ó°£ ("md_square_root", '\u{f0784}'), // ó°ž„ ("md_square_root_box", '\u{f09a3}'), // 󰦣 ("md_square_rounded", '\u{f14fb}'), // 󱓻 ("md_square_rounded_badge", '\u{f1a07}'), // 󱨇 ("md_square_rounded_badge_outline", '\u{f1a08}'), // 󱨈 ("md_square_rounded_outline", '\u{f14fc}'), // 󱓼 ("md_square_small", '\u{f0a15}'), // 󰨕 ("md_square_wave", '\u{f147b}'), // 󱑻 ("md_squeegee", '\u{f0ae1}'), // ó°«¡ ("md_ssh", '\u{f08c0}'), // ó°£€ ("md_stack_exchange", '\u{f060b}'), // 󰘋 ("md_stack_overflow", '\u{f04cc}'), // ó°“Œ ("md_stackpath", '\u{f0359}'), // ó°™ ("md_stadium", '\u{f0ff9}'), // ó°¿¹ ("md_stadium_variant", '\u{f0720}'), // 󰜠 ("md_stairs", '\u{f04cd}'), // ó°“ ("md_stairs_box", '\u{f139e}'), // 󱎞 ("md_stairs_down", '\u{f12be}'), // 󱊾 ("md_stairs_up", '\u{f12bd}'), // 󱊽 ("md_stamper", '\u{f0d39}'), // ó°´¹ ("md_standard_definition", '\u{f07ef}'), // 󰟯 ("md_star", '\u{f04ce}'), // ó°“Ž ("md_star_box", '\u{f0a73}'), // ó°©³ ("md_star_box_multiple", '\u{f1286}'), // 󱊆 ("md_star_box_multiple_outline", '\u{f1287}'), // 󱊇 ("md_star_box_outline", '\u{f0a74}'), // ó°©´ ("md_star_check", '\u{f1566}'), // 󱕦 ("md_star_check_outline", '\u{f156a}'), // 󱕪 ("md_star_circle", '\u{f04cf}'), // ó°“ ("md_star_circle_outline", '\u{f09a4}'), // 󰦤 ("md_star_cog", '\u{f1668}'), // 󱙨 ("md_star_cog_outline", '\u{f1669}'), // 󱙩 ("md_star_crescent", '\u{f0979}'), // ó°¥¹ ("md_star_david", '\u{f097a}'), // 󰥺 ("md_star_face", '\u{f09a5}'), // 󰦥 ("md_star_four_points", '\u{f0ae2}'), // ó°«¢ ("md_star_four_points_outline", '\u{f0ae3}'), // ó°«£ ("md_star_half", '\u{f0246}'), // 󰉆 ("md_star_half_full", '\u{f04d0}'), // ó°“ ("md_star_minus", '\u{f1564}'), // 󱕤 ("md_star_minus_outline", '\u{f1568}'), // 󱕨 ("md_star_off", '\u{f04d1}'), // ó°“‘ ("md_star_off_outline", '\u{f155b}'), // 󱕛 ("md_star_outline", '\u{f04d2}'), // ó°“’ ("md_star_plus", '\u{f1563}'), // 󱕣 ("md_star_plus_outline", '\u{f1567}'), // 󱕧 ("md_star_remove", '\u{f1565}'), // 󱕥 ("md_star_remove_outline", '\u{f1569}'), // 󱕩 ("md_star_settings", '\u{f166a}'), // 󱙪 ("md_star_settings_outline", '\u{f166b}'), // 󱙫 ("md_star_shooting", '\u{f1741}'), // ó± ("md_star_shooting_outline", '\u{f1742}'), // ó±‚ ("md_star_three_points", '\u{f0ae4}'), // 󰫤 ("md_star_three_points_outline", '\u{f0ae5}'), // ó°«¥ ("md_state_machine", '\u{f11ef}'), // 󱇯 ("md_steam", '\u{f04d3}'), // ó°““ ("md_steering", '\u{f04d4}'), // ó°“” ("md_steering_off", '\u{f090e}'), // 󰤎 ("md_step_backward", '\u{f04d5}'), // ó°“• ("md_step_backward_2", '\u{f04d6}'), // ó°“– ("md_step_forward", '\u{f04d7}'), // ó°“— ("md_step_forward_2", '\u{f04d8}'), // 󰓘 ("md_stethoscope", '\u{f04d9}'), // ó°“™ ("md_sticker", '\u{f1364}'), // ó±¤ ("md_sticker_alert", '\u{f1365}'), // ó±¥ ("md_sticker_alert_outline", '\u{f1366}'), // ó±¦ ("md_sticker_check", '\u{f1367}'), // ó±§ ("md_sticker_check_outline", '\u{f1368}'), // ó±¨ ("md_sticker_circle_outline", '\u{f05d0}'), // ó°— ("md_sticker_emoji", '\u{f0785}'), // ó°ž… ("md_sticker_minus", '\u{f1369}'), // ó±© ("md_sticker_minus_outline", '\u{f136a}'), // ó±ª ("md_sticker_outline", '\u{f136b}'), // ó±« ("md_sticker_plus", '\u{f136c}'), // ó±¬ ("md_sticker_plus_outline", '\u{f136d}'), // ó±­ ("md_sticker_remove", '\u{f136e}'), // ó±® ("md_sticker_remove_outline", '\u{f136f}'), // ó±¯ ("md_sticker_text", '\u{f178e}'), // 󱞎 ("md_sticker_text_outline", '\u{f178f}'), // ó±ž ("md_stocking", '\u{f04da}'), // ó°“š ("md_stomach", '\u{f1093}'), // 󱂓 ("md_stool", '\u{f195d}'), // ó±¥ ("md_stool_outline", '\u{f195e}'), // 󱥞 ("md_stop", '\u{f04db}'), // ó°“› ("md_stop_circle", '\u{f0666}'), // 󰙦 ("md_stop_circle_outline", '\u{f0667}'), // ó°™§ ("md_storage_tank", '\u{f1a75}'), // 󱩵 ("md_storage_tank_outline", '\u{f1a76}'), // 󱩶 ("md_store", '\u{f04dc}'), // ó°“œ ("md_store_24_hour", '\u{f04dd}'), // ó°“ ("md_store_alert", '\u{f18c1}'), // ó±£ ("md_store_alert_outline", '\u{f18c2}'), // 󱣂 ("md_store_check", '\u{f18c3}'), // 󱣃 ("md_store_check_outline", '\u{f18c4}'), // 󱣄 ("md_store_clock", '\u{f18c5}'), // ó±£… ("md_store_clock_outline", '\u{f18c6}'), // 󱣆 ("md_store_cog", '\u{f18c7}'), // 󱣇 ("md_store_cog_outline", '\u{f18c8}'), // 󱣈 ("md_store_edit", '\u{f18c9}'), // 󱣉 ("md_store_edit_outline", '\u{f18ca}'), // 󱣊 ("md_store_marker", '\u{f18cb}'), // 󱣋 ("md_store_marker_outline", '\u{f18cc}'), // 󱣌 ("md_store_minus", '\u{f165e}'), // 󱙞 ("md_store_minus_outline", '\u{f18cd}'), // ó±£ ("md_store_off", '\u{f18ce}'), // 󱣎 ("md_store_off_outline", '\u{f18cf}'), // ó±£ ("md_store_outline", '\u{f1361}'), // ó±¡ ("md_store_plus", '\u{f165f}'), // 󱙟 ("md_store_plus_outline", '\u{f18d0}'), // ó±£ ("md_store_remove", '\u{f1660}'), // ó±™  ("md_store_remove_outline", '\u{f18d1}'), // 󱣑 ("md_store_search", '\u{f18d2}'), // ó±£’ ("md_store_search_outline", '\u{f18d3}'), // 󱣓 ("md_store_settings", '\u{f18d4}'), // ó±£” ("md_store_settings_outline", '\u{f18d5}'), // 󱣕 ("md_storefront", '\u{f07c7}'), // 󰟇 ("md_storefront_outline", '\u{f10c1}'), // ó±ƒ ("md_stove", '\u{f04de}'), // ó°“ž ("md_strategy", '\u{f11d6}'), // 󱇖 ("md_stretch_to_page", '\u{f0f2b}'), // 󰼫 ("md_stretch_to_page_outline", '\u{f0f2c}'), // 󰼬 ("md_string_lights", '\u{f12ba}'), // 󱊺 ("md_string_lights_off", '\u{f12bb}'), // 󱊻 ("md_subdirectory_arrow_left", '\u{f060c}'), // 󰘌 ("md_subdirectory_arrow_right", '\u{f060d}'), // ó°˜ ("md_submarine", '\u{f156c}'), // 󱕬 ("md_subtitles", '\u{f0a16}'), // ó°¨– ("md_subtitles_outline", '\u{f0a17}'), // ó°¨— ("md_subway", '\u{f06ac}'), // 󰚬 ("md_subway_alert_variant", '\u{f0d9d}'), // ó°¶ ("md_subway_variant", '\u{f04df}'), // ó°“Ÿ ("md_summit", '\u{f0786}'), // 󰞆 ("md_sun_clock", '\u{f1a77}'), // 󱩷 ("md_sun_clock_outline", '\u{f1a78}'), // 󱩸 ("md_sun_compass", '\u{f19a5}'), // 󱦥 ("md_sun_snowflake", '\u{f1796}'), // 󱞖 ("md_sun_snowflake_variant", '\u{f1a79}'), // 󱩹 ("md_sun_thermometer", '\u{f18d6}'), // ó±£– ("md_sun_thermometer_outline", '\u{f18d7}'), // ó±£— ("md_sun_wireless", '\u{f17fe}'), // 󱟾 ("md_sun_wireless_outline", '\u{f17ff}'), // 󱟿 ("md_sunglasses", '\u{f04e0}'), // ó°“  ("md_surfing", '\u{f1746}'), // ó±† ("md_surround_sound", '\u{f05c5}'), // ó°—… ("md_surround_sound_2_0", '\u{f07f0}'), // 󰟰 ("md_surround_sound_2_1", '\u{f1729}'), // 󱜩 ("md_surround_sound_3_1", '\u{f07f1}'), // 󰟱 ("md_surround_sound_5_1", '\u{f07f2}'), // 󰟲 ("md_surround_sound_5_1_2", '\u{f172a}'), // 󱜪 ("md_surround_sound_7_1", '\u{f07f3}'), // 󰟳 ("md_svg", '\u{f0721}'), // 󰜡 ("md_swap_horizontal", '\u{f04e1}'), // ó°“¡ ("md_swap_horizontal_bold", '\u{f0bcd}'), // ó°¯ ("md_swap_horizontal_circle", '\u{f0fe1}'), // ó°¿¡ ("md_swap_horizontal_circle_outline", '\u{f0fe2}'), // ó°¿¢ ("md_swap_horizontal_variant", '\u{f08c1}'), // ó°£ ("md_swap_vertical", '\u{f04e2}'), // ó°“¢ ("md_swap_vertical_bold", '\u{f0bce}'), // 󰯎 ("md_swap_vertical_circle", '\u{f0fe3}'), // ó°¿£ ("md_swap_vertical_circle_outline", '\u{f0fe4}'), // 󰿤 ("md_swap_vertical_variant", '\u{f08c2}'), // 󰣂 ("md_swim", '\u{f04e3}'), // ó°“£ ("md_switch", '\u{f04e4}'), // 󰓤 ("md_sword", '\u{f04e5}'), // ó°“¥ ("md_sword_cross", '\u{f0787}'), // 󰞇 ("md_syllabary_hangul", '\u{f1333}'), // 󱌳 ("md_syllabary_hiragana", '\u{f1334}'), // 󱌴 ("md_syllabary_katakana", '\u{f1335}'), // 󱌵 ("md_syllabary_katakana_halfwidth", '\u{f1336}'), // 󱌶 ("md_symbol", '\u{f1501}'), // ó±” ("md_symfony", '\u{f0ae6}'), // 󰫦 ("md_sync", '\u{f04e6}'), // 󰓦 ("md_sync_alert", '\u{f04e7}'), // ó°“§ ("md_sync_circle", '\u{f1378}'), // ó±¸ ("md_sync_off", '\u{f04e8}'), // 󰓨 ("md_tab", '\u{f04e9}'), // ó°“© ("md_tab_minus", '\u{f0b4b}'), // ó°­‹ ("md_tab_plus", '\u{f075c}'), // ó°œ ("md_tab_remove", '\u{f0b4c}'), // ó°­Œ ("md_tab_search", '\u{f199e}'), // 󱦞 ("md_tab_unselected", '\u{f04ea}'), // 󰓪 ("md_table", '\u{f04eb}'), // ó°“« ("md_table_account", '\u{f13b9}'), // 󱎹 ("md_table_alert", '\u{f13ba}'), // 󱎺 ("md_table_arrow_down", '\u{f13bb}'), // 󱎻 ("md_table_arrow_left", '\u{f13bc}'), // 󱎼 ("md_table_arrow_right", '\u{f13bd}'), // 󱎽 ("md_table_arrow_up", '\u{f13be}'), // 󱎾 ("md_table_border", '\u{f0a18}'), // 󰨘 ("md_table_cancel", '\u{f13bf}'), // 󱎿 ("md_table_chair", '\u{f1061}'), // ó±¡ ("md_table_check", '\u{f13c0}'), // ó±€ ("md_table_clock", '\u{f13c1}'), // ó± ("md_table_cog", '\u{f13c2}'), // ó±‚ ("md_table_column", '\u{f0835}'), // ó° µ ("md_table_column_plus_after", '\u{f04ec}'), // 󰓬 ("md_table_column_plus_before", '\u{f04ed}'), // ó°“­ ("md_table_column_remove", '\u{f04ee}'), // ó°“® ("md_table_column_width", '\u{f04ef}'), // 󰓯 ("md_table_edit", '\u{f04f0}'), // ó°“° ("md_table_eye", '\u{f1094}'), // 󱂔 ("md_table_eye_off", '\u{f13c3}'), // ó±ƒ ("md_table_furniture", '\u{f05bc}'), // ó°–¼ ("md_table_headers_eye", '\u{f121d}'), // ó±ˆ ("md_table_headers_eye_off", '\u{f121e}'), // 󱈞 ("md_table_heart", '\u{f13c4}'), // ó±„ ("md_table_key", '\u{f13c5}'), // ó±… ("md_table_large", '\u{f04f1}'), // ó°“± ("md_table_large_plus", '\u{f0f87}'), // 󰾇 ("md_table_large_remove", '\u{f0f88}'), // 󰾈 ("md_table_lock", '\u{f13c6}'), // ó±† ("md_table_merge_cells", '\u{f09a6}'), // 󰦦 ("md_table_minus", '\u{f13c7}'), // ó±‡ ("md_table_multiple", '\u{f13c8}'), // ó±ˆ ("md_table_network", '\u{f13c9}'), // ó±‰ ("md_table_of_contents", '\u{f0836}'), // ó° ¶ ("md_table_off", '\u{f13ca}'), // ó±Š ("md_table_picnic", '\u{f1743}'), // ó±ƒ ("md_table_pivot", '\u{f183c}'), // ó± ¼ ("md_table_plus", '\u{f0a75}'), // ó°©µ ("md_table_refresh", '\u{f13a0}'), // 󱎠 ("md_table_remove", '\u{f0a76}'), // ó°©¶ ("md_table_row", '\u{f0837}'), // ó° · ("md_table_row_height", '\u{f04f2}'), // ó°“² ("md_table_row_plus_after", '\u{f04f3}'), // ó°“³ ("md_table_row_plus_before", '\u{f04f4}'), // ó°“´ ("md_table_row_remove", '\u{f04f5}'), // ó°“µ ("md_table_search", '\u{f090f}'), // ó°¤ ("md_table_settings", '\u{f0838}'), // ó° ¸ ("md_table_split_cell", '\u{f142a}'), // ó±ª ("md_table_star", '\u{f13cb}'), // ó±‹ ("md_table_sync", '\u{f13a1}'), // 󱎡 ("md_table_tennis", '\u{f0e68}'), // 󰹨 ("md_tablet", '\u{f04f6}'), // ó°“¶ ("md_tablet_android", '\u{f04f7}'), // ó°“· ("md_tablet_cellphone", '\u{f09a7}'), // 󰦧 ("md_tablet_dashboard", '\u{f0ece}'), // 󰻎 ("md_taco", '\u{f0762}'), // ó°¢ ("md_tag", '\u{f04f9}'), // ó°“¹ ("md_tag_arrow_down", '\u{f172b}'), // 󱜫 ("md_tag_arrow_down_outline", '\u{f172c}'), // 󱜬 ("md_tag_arrow_left", '\u{f172d}'), // 󱜭 ("md_tag_arrow_left_outline", '\u{f172e}'), // 󱜮 ("md_tag_arrow_right", '\u{f172f}'), // 󱜯 ("md_tag_arrow_right_outline", '\u{f1730}'), // 󱜰 ("md_tag_arrow_up", '\u{f1731}'), // 󱜱 ("md_tag_arrow_up_outline", '\u{f1732}'), // 󱜲 ("md_tag_check", '\u{f1a7a}'), // 󱩺 ("md_tag_check_outline", '\u{f1a7b}'), // 󱩻 ("md_tag_faces", '\u{f04fa}'), // 󰓺 ("md_tag_heart", '\u{f068b}'), // ó°š‹ ("md_tag_heart_outline", '\u{f0bcf}'), // ó°¯ ("md_tag_minus", '\u{f0910}'), // ó°¤ ("md_tag_minus_outline", '\u{f121f}'), // 󱈟 ("md_tag_multiple", '\u{f04fb}'), // ó°“» ("md_tag_multiple_outline", '\u{f12f7}'), // 󱋷 ("md_tag_off", '\u{f1220}'), // 󱈠 ("md_tag_off_outline", '\u{f1221}'), // 󱈡 ("md_tag_outline", '\u{f04fc}'), // ó°“¼ ("md_tag_plus", '\u{f0722}'), // 󰜢 ("md_tag_plus_outline", '\u{f1222}'), // 󱈢 ("md_tag_remove", '\u{f0723}'), // 󰜣 ("md_tag_remove_outline", '\u{f1223}'), // 󱈣 ("md_tag_search", '\u{f1907}'), // 󱤇 ("md_tag_search_outline", '\u{f1908}'), // 󱤈 ("md_tag_text", '\u{f1224}'), // 󱈤 ("md_tag_text_outline", '\u{f04fd}'), // ó°“½ ("md_tailwind", '\u{f13ff}'), // ó±¿ ("md_tally_mark_1", '\u{f1abc}'), // 󱪼 ("md_tally_mark_2", '\u{f1abd}'), // 󱪽 ("md_tally_mark_3", '\u{f1abe}'), // 󱪾 ("md_tally_mark_4", '\u{f1abf}'), // 󱪿 ("md_tally_mark_5", '\u{f1ac0}'), // 󱫀 ("md_tangram", '\u{f04f8}'), // 󰓸 ("md_tank", '\u{f0d3a}'), // ó°´º ("md_tanker_truck", '\u{f0fe5}'), // ó°¿¥ ("md_tape_drive", '\u{f16df}'), // 󱛟 ("md_tape_measure", '\u{f0b4d}'), // ó°­ ("md_target", '\u{f04fe}'), // ó°“¾ ("md_target_account", '\u{f0bd0}'), // ó°¯ ("md_target_variant", '\u{f0a77}'), // ó°©· ("md_taxi", '\u{f04ff}'), // ó°“¿ ("md_tea", '\u{f0d9e}'), // ó°¶ž ("md_tea_outline", '\u{f0d9f}'), // ó°¶Ÿ ("md_teamviewer", '\u{f0500}'), // 󰔀 ("md_teddy_bear", '\u{f18fb}'), // ó±£» ("md_telescope", '\u{f0b4e}'), // ó°­Ž ("md_television", '\u{f0502}'), // ó°”‚ ("md_television_ambient_light", '\u{f1356}'), // ó±– ("md_television_box", '\u{f0839}'), // ó° ¹ ("md_television_classic", '\u{f07f4}'), // ó°Ÿ´ ("md_television_classic_off", '\u{f083a}'), // ó° º ("md_television_guide", '\u{f0503}'), // 󰔃 ("md_television_off", '\u{f083b}'), // ó° » ("md_television_pause", '\u{f0f89}'), // 󰾉 ("md_television_play", '\u{f0ecf}'), // ó°» ("md_television_shimmer", '\u{f1110}'), // ó±„ ("md_television_stop", '\u{f0f8a}'), // 󰾊 ("md_temperature_celsius", '\u{f0504}'), // ó°”„ ("md_temperature_fahrenheit", '\u{f0505}'), // ó°”… ("md_temperature_kelvin", '\u{f0506}'), // 󰔆 ("md_tennis", '\u{f0da0}'), // ó°¶  ("md_tennis_ball", '\u{f0507}'), // 󰔇 ("md_tent", '\u{f0508}'), // 󰔈 ("md_terraform", '\u{f1062}'), // ó±¢ ("md_test_tube", '\u{f0668}'), // 󰙨 ("md_test_tube_empty", '\u{f0911}'), // 󰤑 ("md_test_tube_off", '\u{f0912}'), // ó°¤’ ("md_text", '\u{f09a8}'), // 󰦨 ("md_text_account", '\u{f1570}'), // 󱕰 ("md_text_box", '\u{f021a}'), // 󰈚 ("md_text_box_check", '\u{f0ea6}'), // 󰺦 ("md_text_box_check_outline", '\u{f0ea7}'), // 󰺧 ("md_text_box_edit", '\u{f1a7c}'), // 󱩼 ("md_text_box_edit_outline", '\u{f1a7d}'), // 󱩽 ("md_text_box_minus", '\u{f0ea8}'), // 󰺨 ("md_text_box_minus_outline", '\u{f0ea9}'), // 󰺩 ("md_text_box_multiple", '\u{f0ab7}'), // ó°ª· ("md_text_box_multiple_outline", '\u{f0ab8}'), // 󰪸 ("md_text_box_outline", '\u{f09ed}'), // ó°§­ ("md_text_box_plus", '\u{f0eaa}'), // 󰺪 ("md_text_box_plus_outline", '\u{f0eab}'), // 󰺫 ("md_text_box_remove", '\u{f0eac}'), // 󰺬 ("md_text_box_remove_outline", '\u{f0ead}'), // ó°º­ ("md_text_box_search", '\u{f0eae}'), // 󰺮 ("md_text_box_search_outline", '\u{f0eaf}'), // 󰺯 ("md_text_long", '\u{f09aa}'), // 󰦪 ("md_text_recognition", '\u{f113d}'), // 󱄽 ("md_text_search", '\u{f13b8}'), // 󱎸 ("md_text_search_variant", '\u{f1a7e}'), // 󱩾 ("md_text_shadow", '\u{f0669}'), // ó°™© ("md_text_short", '\u{f09a9}'), // 󰦩 ("md_text_to_speech", '\u{f050a}'), // 󰔊 ("md_text_to_speech_off", '\u{f050b}'), // ó°”‹ ("md_texture", '\u{f050c}'), // 󰔌 ("md_texture_box", '\u{f0fe6}'), // 󰿦 ("md_theater", '\u{f050d}'), // ó°” ("md_theme_light_dark", '\u{f050e}'), // 󰔎 ("md_thermometer", '\u{f050f}'), // ó°” ("md_thermometer_alert", '\u{f0e01}'), // ó°¸ ("md_thermometer_bluetooth", '\u{f1895}'), // 󱢕 ("md_thermometer_check", '\u{f1a7f}'), // 󱩿 ("md_thermometer_chevron_down", '\u{f0e02}'), // 󰸂 ("md_thermometer_chevron_up", '\u{f0e03}'), // 󰸃 ("md_thermometer_high", '\u{f10c2}'), // 󱃂 ("md_thermometer_lines", '\u{f0510}'), // ó°” ("md_thermometer_low", '\u{f10c3}'), // 󱃃 ("md_thermometer_minus", '\u{f0e04}'), // 󰸄 ("md_thermometer_off", '\u{f1531}'), // ó±”± ("md_thermometer_plus", '\u{f0e05}'), // ó°¸… ("md_thermometer_water", '\u{f1a80}'), // 󱪀 ("md_thermostat", '\u{f0393}'), // ó°Ž“ ("md_thermostat_box", '\u{f0891}'), // 󰢑 ("md_thought_bubble", '\u{f07f6}'), // 󰟶 ("md_thought_bubble_outline", '\u{f07f7}'), // ó°Ÿ· ("md_thumb_down", '\u{f0511}'), // ó°”‘ ("md_thumb_down_outline", '\u{f0512}'), // ó°”’ ("md_thumb_up", '\u{f0513}'), // ó°”“ ("md_thumb_up_outline", '\u{f0514}'), // ó°”” ("md_thumbs_up_down", '\u{f0515}'), // ó°”• ("md_thumbs_up_down_outline", '\u{f1914}'), // 󱤔 ("md_ticket", '\u{f0516}'), // ó°”– ("md_ticket_account", '\u{f0517}'), // ó°”— ("md_ticket_confirmation", '\u{f0518}'), // 󰔘 ("md_ticket_confirmation_outline", '\u{f13aa}'), // 󱎪 ("md_ticket_outline", '\u{f0913}'), // 󰤓 ("md_ticket_percent", '\u{f0724}'), // 󰜤 ("md_ticket_percent_outline", '\u{f142b}'), // ó±« ("md_tie", '\u{f0519}'), // ó°”™ ("md_tilde", '\u{f0725}'), // 󰜥 ("md_tilde_off", '\u{f18f3}'), // ó±£³ ("md_timelapse", '\u{f051a}'), // 󰔚 ("md_timeline", '\u{f0bd1}'), // 󰯑 ("md_timeline_alert", '\u{f0f95}'), // 󰾕 ("md_timeline_alert_outline", '\u{f0f98}'), // 󰾘 ("md_timeline_check", '\u{f1532}'), // ó±”² ("md_timeline_check_outline", '\u{f1533}'), // ó±”³ ("md_timeline_clock", '\u{f11fb}'), // 󱇻 ("md_timeline_clock_outline", '\u{f11fc}'), // 󱇼 ("md_timeline_help", '\u{f0f99}'), // ó°¾™ ("md_timeline_help_outline", '\u{f0f9a}'), // 󰾚 ("md_timeline_minus", '\u{f1534}'), // ó±”´ ("md_timeline_minus_outline", '\u{f1535}'), // ó±”µ ("md_timeline_outline", '\u{f0bd2}'), // ó°¯’ ("md_timeline_plus", '\u{f0f96}'), // ó°¾– ("md_timeline_plus_outline", '\u{f0f97}'), // ó°¾— ("md_timeline_remove", '\u{f1536}'), // ó±”¶ ("md_timeline_remove_outline", '\u{f1537}'), // ó±”· ("md_timeline_text", '\u{f0bd3}'), // 󰯓 ("md_timeline_text_outline", '\u{f0bd4}'), // 󰯔 ("md_timer", '\u{f13ab}'), // 󱎫 ("md_timer_3", '\u{f051d}'), // ó°” ("md_timer_10", '\u{f051c}'), // 󰔜 ("md_timer_alert", '\u{f1acc}'), // 󱫌 ("md_timer_alert_outline", '\u{f1acd}'), // ó±« ("md_timer_cancel", '\u{f1ace}'), // 󱫎 ("md_timer_cancel_outline", '\u{f1acf}'), // ó±« ("md_timer_check", '\u{f1ad0}'), // ó±« ("md_timer_check_outline", '\u{f1ad1}'), // 󱫑 ("md_timer_cog", '\u{f1925}'), // 󱤥 ("md_timer_cog_outline", '\u{f1926}'), // 󱤦 ("md_timer_edit", '\u{f1ad2}'), // 󱫒 ("md_timer_edit_outline", '\u{f1ad3}'), // 󱫓 ("md_timer_lock", '\u{f1ad4}'), // 󱫔 ("md_timer_lock_open", '\u{f1ad5}'), // 󱫕 ("md_timer_lock_open_outline", '\u{f1ad6}'), // 󱫖 ("md_timer_lock_outline", '\u{f1ad7}'), // 󱫗 ("md_timer_marker", '\u{f1ad8}'), // 󱫘 ("md_timer_marker_outline", '\u{f1ad9}'), // 󱫙 ("md_timer_minus", '\u{f1ada}'), // 󱫚 ("md_timer_minus_outline", '\u{f1adb}'), // 󱫛 ("md_timer_music", '\u{f1adc}'), // 󱫜 ("md_timer_music_outline", '\u{f1add}'), // ó±« ("md_timer_off", '\u{f13ac}'), // 󱎬 ("md_timer_off_outline", '\u{f051e}'), // 󰔞 ("md_timer_outline", '\u{f051b}'), // ó°”› ("md_timer_pause", '\u{f1ade}'), // 󱫞 ("md_timer_pause_outline", '\u{f1adf}'), // 󱫟 ("md_timer_play", '\u{f1ae0}'), // 󱫠 ("md_timer_play_outline", '\u{f1ae1}'), // 󱫡 ("md_timer_plus", '\u{f1ae2}'), // 󱫢 ("md_timer_plus_outline", '\u{f1ae3}'), // 󱫣 ("md_timer_refresh", '\u{f1ae4}'), // 󱫤 ("md_timer_refresh_outline", '\u{f1ae5}'), // 󱫥 ("md_timer_remove", '\u{f1ae6}'), // 󱫦 ("md_timer_remove_outline", '\u{f1ae7}'), // 󱫧 ("md_timer_sand", '\u{f051f}'), // 󰔟 ("md_timer_sand_complete", '\u{f199f}'), // 󱦟 ("md_timer_sand_empty", '\u{f06ad}'), // ó°š­ ("md_timer_sand_full", '\u{f078c}'), // 󰞌 ("md_timer_sand_paused", '\u{f19a0}'), // 󱦠 ("md_timer_settings", '\u{f1923}'), // 󱤣 ("md_timer_settings_outline", '\u{f1924}'), // 󱤤 ("md_timer_star", '\u{f1ae8}'), // 󱫨 ("md_timer_star_outline", '\u{f1ae9}'), // 󱫩 ("md_timer_stop", '\u{f1aea}'), // 󱫪 ("md_timer_stop_outline", '\u{f1aeb}'), // 󱫫 ("md_timer_sync", '\u{f1aec}'), // 󱫬 ("md_timer_sync_outline", '\u{f1aed}'), // 󱫭 ("md_timetable", '\u{f0520}'), // ó°”  ("md_tire", '\u{f1896}'), // ó±¢– ("md_toaster", '\u{f1063}'), // ó±£ ("md_toaster_off", '\u{f11b7}'), // 󱆷 ("md_toaster_oven", '\u{f0cd3}'), // 󰳓 ("md_toggle_switch", '\u{f0521}'), // ó°”¡ ("md_toggle_switch_off", '\u{f0522}'), // 󰔢 ("md_toggle_switch_off_outline", '\u{f0a19}'), // 󰨙 ("md_toggle_switch_outline", '\u{f0a1a}'), // 󰨚 ("md_toggle_switch_variant", '\u{f1a25}'), // 󱨥 ("md_toggle_switch_variant_off", '\u{f1a26}'), // 󱨦 ("md_toilet", '\u{f09ab}'), // 󰦫 ("md_toolbox", '\u{f09ac}'), // 󰦬 ("md_toolbox_outline", '\u{f09ad}'), // ó°¦­ ("md_tools", '\u{f1064}'), // ó±¤ ("md_tooltip", '\u{f0523}'), // 󰔣 ("md_tooltip_account", '\u{f000c}'), // 󰀌 ("md_tooltip_cellphone", '\u{f183b}'), // ó± » ("md_tooltip_check", '\u{f155c}'), // 󱕜 ("md_tooltip_check_outline", '\u{f155d}'), // ó±• ("md_tooltip_edit", '\u{f0524}'), // 󰔤 ("md_tooltip_edit_outline", '\u{f12c5}'), // 󱋅 ("md_tooltip_image", '\u{f0525}'), // 󰔥 ("md_tooltip_image_outline", '\u{f0bd5}'), // 󰯕 ("md_tooltip_minus", '\u{f155e}'), // 󱕞 ("md_tooltip_minus_outline", '\u{f155f}'), // 󱕟 ("md_tooltip_outline", '\u{f0526}'), // 󰔦 ("md_tooltip_plus", '\u{f0bd6}'), // ó°¯– ("md_tooltip_plus_outline", '\u{f0527}'), // ó°”§ ("md_tooltip_remove", '\u{f1560}'), // 󱕠 ("md_tooltip_remove_outline", '\u{f1561}'), // 󱕡 ("md_tooltip_text", '\u{f0528}'), // 󰔨 ("md_tooltip_text_outline", '\u{f0bd7}'), // ó°¯— ("md_tooth", '\u{f08c3}'), // 󰣃 ("md_tooth_outline", '\u{f0529}'), // ó°”© ("md_toothbrush", '\u{f1129}'), // 󱄩 ("md_toothbrush_electric", '\u{f112c}'), // 󱄬 ("md_toothbrush_paste", '\u{f112a}'), // 󱄪 ("md_torch", '\u{f1606}'), // 󱘆 ("md_tortoise", '\u{f0d3b}'), // ó°´» ("md_toslink", '\u{f12b8}'), // 󱊸 ("md_tournament", '\u{f09ae}'), // 󰦮 ("md_tow_truck", '\u{f083c}'), // ó° ¼ ("md_tower_beach", '\u{f0681}'), // ó°š ("md_tower_fire", '\u{f0682}'), // ó°š‚ ("md_town_hall", '\u{f1875}'), // 󱡵 ("md_toy_brick", '\u{f1288}'), // 󱊈 ("md_toy_brick_marker", '\u{f1289}'), // 󱊉 ("md_toy_brick_marker_outline", '\u{f128a}'), // 󱊊 ("md_toy_brick_minus", '\u{f128b}'), // 󱊋 ("md_toy_brick_minus_outline", '\u{f128c}'), // 󱊌 ("md_toy_brick_outline", '\u{f128d}'), // ó±Š ("md_toy_brick_plus", '\u{f128e}'), // 󱊎 ("md_toy_brick_plus_outline", '\u{f128f}'), // ó±Š ("md_toy_brick_remove", '\u{f1290}'), // ó±Š ("md_toy_brick_remove_outline", '\u{f1291}'), // 󱊑 ("md_toy_brick_search", '\u{f1292}'), // 󱊒 ("md_toy_brick_search_outline", '\u{f1293}'), // 󱊓 ("md_track_light", '\u{f0914}'), // 󰤔 ("md_trackpad", '\u{f07f8}'), // 󰟸 ("md_trackpad_lock", '\u{f0933}'), // 󰤳 ("md_tractor", '\u{f0892}'), // ó°¢’ ("md_tractor_variant", '\u{f14c4}'), // 󱓄 ("md_trademark", '\u{f0a78}'), // 󰩸 ("md_traffic_cone", '\u{f137c}'), // ó±¼ ("md_traffic_light", '\u{f052b}'), // ó°”« ("md_traffic_light_outline", '\u{f182a}'), // ó± ª ("md_train", '\u{f052c}'), // 󰔬 ("md_train_car", '\u{f0bd8}'), // 󰯘 ("md_train_car_passenger", '\u{f1733}'), // 󱜳 ("md_train_car_passenger_door", '\u{f1734}'), // 󱜴 ("md_train_car_passenger_door_open", '\u{f1735}'), // 󱜵 ("md_train_car_passenger_variant", '\u{f1736}'), // 󱜶 ("md_train_variant", '\u{f08c4}'), // 󰣄 ("md_tram", '\u{f052d}'), // ó°”­ ("md_tram_side", '\u{f0fe7}'), // ó°¿§ ("md_transcribe", '\u{f052e}'), // ó°”® ("md_transcribe_close", '\u{f052f}'), // 󰔯 ("md_transfer", '\u{f1065}'), // ó±¥ ("md_transfer_down", '\u{f0da1}'), // ó°¶¡ ("md_transfer_left", '\u{f0da2}'), // ó°¶¢ ("md_transfer_right", '\u{f0530}'), // ó°”° ("md_transfer_up", '\u{f0da3}'), // ó°¶£ ("md_transit_connection", '\u{f0d3c}'), // ó°´¼ ("md_transit_connection_horizontal", '\u{f1546}'), // 󱕆 ("md_transit_connection_variant", '\u{f0d3d}'), // ó°´½ ("md_transit_detour", '\u{f0f8b}'), // 󰾋 ("md_transit_skip", '\u{f1515}'), // 󱔕 ("md_transit_transfer", '\u{f06ae}'), // ó°š® ("md_transition", '\u{f0915}'), // 󰤕 ("md_transition_masked", '\u{f0916}'), // ó°¤– ("md_translate", '\u{f05ca}'), // ó°—Š ("md_translate_off", '\u{f0e06}'), // 󰸆 ("md_transmission_tower", '\u{f0d3e}'), // ó°´¾ ("md_transmission_tower_export", '\u{f192c}'), // 󱤬 ("md_transmission_tower_import", '\u{f192d}'), // 󱤭 ("md_transmission_tower_off", '\u{f19dd}'), // ó±§ ("md_trash_can", '\u{f0a79}'), // ó°©¹ ("md_trash_can_outline", '\u{f0a7a}'), // 󰩺 ("md_tray", '\u{f1294}'), // 󱊔 ("md_tray_alert", '\u{f1295}'), // 󱊕 ("md_tray_arrow_down", '\u{f0120}'), // ó°„  ("md_tray_arrow_up", '\u{f011d}'), // ó°„ ("md_tray_full", '\u{f1296}'), // 󱊖 ("md_tray_minus", '\u{f1297}'), // 󱊗 ("md_tray_plus", '\u{f1298}'), // 󱊘 ("md_tray_remove", '\u{f1299}'), // 󱊙 ("md_treasure_chest", '\u{f0726}'), // 󰜦 ("md_tree", '\u{f0531}'), // ó°”± ("md_tree_outline", '\u{f0e69}'), // 󰹩 ("md_trello", '\u{f0532}'), // ó°”² ("md_trending_down", '\u{f0533}'), // ó°”³ ("md_trending_neutral", '\u{f0534}'), // ó°”´ ("md_trending_up", '\u{f0535}'), // ó°”µ ("md_triangle", '\u{f0536}'), // ó°”¶ ("md_triangle_outline", '\u{f0537}'), // ó°”· ("md_triangle_small_down", '\u{f1a09}'), // 󱨉 ("md_triangle_small_up", '\u{f1a0a}'), // 󱨊 ("md_triangle_wave", '\u{f147c}'), // 󱑼 ("md_triforce", '\u{f0bd9}'), // 󰯙 ("md_trophy", '\u{f0538}'), // 󰔸 ("md_trophy_award", '\u{f0539}'), // ó°”¹ ("md_trophy_broken", '\u{f0da4}'), // 󰶤 ("md_trophy_outline", '\u{f053a}'), // 󰔺 ("md_trophy_variant", '\u{f053b}'), // ó°”» ("md_trophy_variant_outline", '\u{f053c}'), // ó°”¼ ("md_truck", '\u{f053d}'), // ó°”½ ("md_truck_alert", '\u{f19de}'), // ó±§ž ("md_truck_alert_outline", '\u{f19df}'), // ó±§Ÿ ("md_truck_cargo_container", '\u{f18d8}'), // 󱣘 ("md_truck_check", '\u{f0cd4}'), // ó°³” ("md_truck_check_outline", '\u{f129a}'), // 󱊚 ("md_truck_delivery", '\u{f053e}'), // ó°”¾ ("md_truck_delivery_outline", '\u{f129b}'), // 󱊛 ("md_truck_fast", '\u{f0788}'), // 󰞈 ("md_truck_fast_outline", '\u{f129c}'), // 󱊜 ("md_truck_flatbed", '\u{f1891}'), // 󱢑 ("md_truck_minus", '\u{f19ae}'), // 󱦮 ("md_truck_minus_outline", '\u{f19bd}'), // 󱦽 ("md_truck_outline", '\u{f129d}'), // ó±Š ("md_truck_plus", '\u{f19ad}'), // 󱦭 ("md_truck_plus_outline", '\u{f19bc}'), // 󱦼 ("md_truck_remove", '\u{f19af}'), // 󱦯 ("md_truck_remove_outline", '\u{f19be}'), // 󱦾 ("md_truck_snowflake", '\u{f19a6}'), // 󱦦 ("md_truck_trailer", '\u{f0727}'), // 󰜧 ("md_trumpet", '\u{f1096}'), // 󱂖 ("md_tshirt_crew", '\u{f0a7b}'), // ó°©» ("md_tshirt_crew_outline", '\u{f053f}'), // ó°”¿ ("md_tshirt_v", '\u{f0a7c}'), // ó°©¼ ("md_tshirt_v_outline", '\u{f0540}'), // ó°•€ ("md_tsunami", '\u{f1a81}'), // ó±ª ("md_tumble_dryer", '\u{f0917}'), // ó°¤— ("md_tumble_dryer_alert", '\u{f11ba}'), // 󱆺 ("md_tumble_dryer_off", '\u{f11bb}'), // 󱆻 ("md_tune", '\u{f062e}'), // 󰘮 ("md_tune_variant", '\u{f1542}'), // 󱕂 ("md_tune_vertical", '\u{f066a}'), // 󰙪 ("md_tune_vertical_variant", '\u{f1543}'), // 󱕃 ("md_tunnel", '\u{f183d}'), // ó± ½ ("md_tunnel_outline", '\u{f183e}'), // ó± ¾ ("md_turbine", '\u{f1a82}'), // 󱪂 ("md_turkey", '\u{f171b}'), // 󱜛 ("md_turnstile", '\u{f0cd5}'), // 󰳕 ("md_turnstile_outline", '\u{f0cd6}'), // ó°³– ("md_turtle", '\u{f0cd7}'), // ó°³— ("md_twitch", '\u{f0543}'), // 󰕃 ("md_twitter", '\u{f0544}'), // ó°•„ ("md_two_factor_authentication", '\u{f09af}'), // 󰦯 ("md_typewriter", '\u{f0f2d}'), // ó°¼­ ("md_ubisoft", '\u{f0bda}'), // 󰯚 ("md_ubuntu", '\u{f0548}'), // 󰕈 ("md_ufo", '\u{f10c4}'), // 󱃄 ("md_ufo_outline", '\u{f10c5}'), // 󱃅 ("md_ultra_high_definition", '\u{f07f9}'), // 󰟹 ("md_umbraco", '\u{f0549}'), // 󰕉 ("md_umbrella", '\u{f054a}'), // ó°•Š ("md_umbrella_beach", '\u{f188a}'), // 󱢊 ("md_umbrella_beach_outline", '\u{f188b}'), // 󱢋 ("md_umbrella_closed", '\u{f09b0}'), // ó°¦° ("md_umbrella_closed_outline", '\u{f13e2}'), // ó±¢ ("md_umbrella_closed_variant", '\u{f13e1}'), // ó±¡ ("md_umbrella_outline", '\u{f054b}'), // ó°•‹ ("md_undo", '\u{f054c}'), // ó°•Œ ("md_undo_variant", '\u{f054d}'), // ó°• ("md_unfold_less_horizontal", '\u{f054e}'), // ó°•Ž ("md_unfold_less_vertical", '\u{f0760}'), // ó°  ("md_unfold_more_horizontal", '\u{f054f}'), // ó°• ("md_unfold_more_vertical", '\u{f0761}'), // ó°¡ ("md_ungroup", '\u{f0550}'), // ó°• ("md_unicode", '\u{f0ed0}'), // ó°» ("md_unicorn", '\u{f15c2}'), // ó±—‚ ("md_unicorn_variant", '\u{f15c3}'), // ó±—ƒ ("md_unicycle", '\u{f15e5}'), // ó±—¥ ("md_unity", '\u{f06af}'), // 󰚯 ("md_unreal", '\u{f09b1}'), // 󰦱 ("md_update", '\u{f06b0}'), // ó°š° ("md_upload", '\u{f0552}'), // ó°•’ ("md_upload_lock", '\u{f1373}'), // ó±³ ("md_upload_lock_outline", '\u{f1374}'), // ó±´ ("md_upload_multiple", '\u{f083d}'), // ó° ½ ("md_upload_network", '\u{f06f6}'), // ó°›¶ ("md_upload_network_outline", '\u{f0cd8}'), // 󰳘 ("md_upload_off", '\u{f10c6}'), // 󱃆 ("md_upload_off_outline", '\u{f10c7}'), // 󱃇 ("md_upload_outline", '\u{f0e07}'), // 󰸇 ("md_usb", '\u{f0553}'), // ó°•“ ("md_usb_flash_drive", '\u{f129e}'), // 󱊞 ("md_usb_flash_drive_outline", '\u{f129f}'), // 󱊟 ("md_usb_port", '\u{f11f0}'), // 󱇰 ("md_vacuum", '\u{f19a1}'), // 󱦡 ("md_vacuum_outline", '\u{f19a2}'), // 󱦢 ("md_valve", '\u{f1066}'), // ó±¦ ("md_valve_closed", '\u{f1067}'), // ó±§ ("md_valve_open", '\u{f1068}'), // ó±¨ ("md_van_passenger", '\u{f07fa}'), // 󰟺 ("md_van_utility", '\u{f07fb}'), // ó°Ÿ» ("md_vanish", '\u{f07fc}'), // 󰟼 ("md_vanish_quarter", '\u{f1554}'), // 󱕔 ("md_vanity_light", '\u{f11e1}'), // 󱇡 ("md_variable", '\u{f0ae7}'), // ó°«§ ("md_variable_box", '\u{f1111}'), // 󱄑 ("md_vector_arrange_above", '\u{f0554}'), // ó°•” ("md_vector_arrange_below", '\u{f0555}'), // ó°•• ("md_vector_bezier", '\u{f0ae8}'), // 󰫨 ("md_vector_circle", '\u{f0556}'), // ó°•– ("md_vector_circle_variant", '\u{f0557}'), // ó°•— ("md_vector_combine", '\u{f0558}'), // 󰕘 ("md_vector_curve", '\u{f0559}'), // ó°•™ ("md_vector_difference", '\u{f055a}'), // ó°•š ("md_vector_difference_ab", '\u{f055b}'), // ó°•› ("md_vector_difference_ba", '\u{f055c}'), // ó°•œ ("md_vector_ellipse", '\u{f0893}'), // 󰢓 ("md_vector_intersection", '\u{f055d}'), // ó°• ("md_vector_line", '\u{f055e}'), // ó°•ž ("md_vector_link", '\u{f0fe8}'), // 󰿨 ("md_vector_point", '\u{f055f}'), // ó°•Ÿ ("md_vector_polygon", '\u{f0560}'), // ó°•  ("md_vector_polygon_variant", '\u{f1856}'), // 󱡖 ("md_vector_polyline", '\u{f0561}'), // ó°•¡ ("md_vector_polyline_edit", '\u{f1225}'), // 󱈥 ("md_vector_polyline_minus", '\u{f1226}'), // 󱈦 ("md_vector_polyline_plus", '\u{f1227}'), // 󱈧 ("md_vector_polyline_remove", '\u{f1228}'), // 󱈨 ("md_vector_radius", '\u{f074a}'), // ó°Š ("md_vector_rectangle", '\u{f05c6}'), // ó°—† ("md_vector_selection", '\u{f0562}'), // ó°•¢ ("md_vector_square", '\u{f0001}'), // ó°€ ("md_vector_square_close", '\u{f1857}'), // 󱡗 ("md_vector_square_edit", '\u{f18d9}'), // ó±£™ ("md_vector_square_minus", '\u{f18da}'), // 󱣚 ("md_vector_square_open", '\u{f1858}'), // 󱡘 ("md_vector_square_plus", '\u{f18db}'), // ó±£› ("md_vector_square_remove", '\u{f18dc}'), // 󱣜 ("md_vector_triangle", '\u{f0563}'), // ó°•£ ("md_vector_union", '\u{f0564}'), // 󰕤 ("md_vhs", '\u{f0a1b}'), // 󰨛 ("md_vibrate", '\u{f0566}'), // 󰕦 ("md_vibrate_off", '\u{f0cd9}'), // ó°³™ ("md_video", '\u{f0567}'), // ó°•§ ("md_video_2d", '\u{f1a1c}'), // 󱨜 ("md_video_3d", '\u{f07fd}'), // 󰟽 ("md_video_3d_off", '\u{f13d9}'), // ó±™ ("md_video_3d_variant", '\u{f0ed1}'), // ó°»‘ ("md_video_4k_box", '\u{f083e}'), // ó° ¾ ("md_video_account", '\u{f0919}'), // 󰤙 ("md_video_box", '\u{f00fd}'), // 󰃽 ("md_video_box_off", '\u{f00fe}'), // 󰃾 ("md_video_check", '\u{f1069}'), // ó±© ("md_video_check_outline", '\u{f106a}'), // ó±ª ("md_video_high_definition", '\u{f152e}'), // ó±”® ("md_video_image", '\u{f091a}'), // 󰤚 ("md_video_input_antenna", '\u{f083f}'), // ó° ¿ ("md_video_input_component", '\u{f0840}'), // ó°¡€ ("md_video_input_hdmi", '\u{f0841}'), // ó°¡ ("md_video_input_scart", '\u{f0f8c}'), // 󰾌 ("md_video_input_svideo", '\u{f0842}'), // ó°¡‚ ("md_video_marker", '\u{f19a9}'), // 󱦩 ("md_video_marker_outline", '\u{f19aa}'), // 󱦪 ("md_video_minus", '\u{f09b2}'), // 󰦲 ("md_video_minus_outline", '\u{f02ba}'), // 󰊺 ("md_video_off", '\u{f0568}'), // 󰕨 ("md_video_off_outline", '\u{f0bdb}'), // 󰯛 ("md_video_outline", '\u{f0bdc}'), // 󰯜 ("md_video_plus", '\u{f09b3}'), // 󰦳 ("md_video_plus_outline", '\u{f01d3}'), // 󰇓 ("md_video_stabilization", '\u{f091b}'), // 󰤛 ("md_video_switch", '\u{f0569}'), // ó°•© ("md_video_switch_outline", '\u{f0790}'), // ó°ž ("md_video_vintage", '\u{f0a1c}'), // 󰨜 ("md_video_wireless", '\u{f0ed2}'), // ó°»’ ("md_video_wireless_outline", '\u{f0ed3}'), // ó°»“ ("md_view_agenda", '\u{f056a}'), // 󰕪 ("md_view_agenda_outline", '\u{f11d8}'), // 󱇘 ("md_view_array", '\u{f056b}'), // ó°•« ("md_view_array_outline", '\u{f1485}'), // ó±’… ("md_view_carousel", '\u{f056c}'), // 󰕬 ("md_view_carousel_outline", '\u{f1486}'), // ó±’† ("md_view_column", '\u{f056d}'), // ó°•­ ("md_view_column_outline", '\u{f1487}'), // ó±’‡ ("md_view_comfy", '\u{f0e6a}'), // 󰹪 ("md_view_comfy_outline", '\u{f1488}'), // ó±’ˆ ("md_view_compact", '\u{f0e6b}'), // 󰹫 ("md_view_compact_outline", '\u{f0e6c}'), // 󰹬 ("md_view_dashboard", '\u{f056e}'), // ó°•® ("md_view_dashboard_edit", '\u{f1947}'), // 󱥇 ("md_view_dashboard_edit_outline", '\u{f1948}'), // 󱥈 ("md_view_dashboard_outline", '\u{f0a1d}'), // ó°¨ ("md_view_dashboard_variant", '\u{f0843}'), // 󰡃 ("md_view_dashboard_variant_outline", '\u{f1489}'), // ó±’‰ ("md_view_day", '\u{f056f}'), // 󰕯 ("md_view_day_outline", '\u{f148a}'), // ó±’Š ("md_view_gallery", '\u{f1888}'), // 󱢈 ("md_view_gallery_outline", '\u{f1889}'), // 󱢉 ("md_view_grid", '\u{f0570}'), // ó°•° ("md_view_grid_outline", '\u{f11d9}'), // 󱇙 ("md_view_grid_plus", '\u{f0f8d}'), // ó°¾ ("md_view_grid_plus_outline", '\u{f11da}'), // 󱇚 ("md_view_headline", '\u{f0571}'), // ó°•± ("md_view_list", '\u{f0572}'), // ó°•² ("md_view_list_outline", '\u{f148b}'), // ó±’‹ ("md_view_module", '\u{f0573}'), // ó°•³ ("md_view_module_outline", '\u{f148c}'), // ó±’Œ ("md_view_parallel", '\u{f0728}'), // 󰜨 ("md_view_parallel_outline", '\u{f148d}'), // ó±’ ("md_view_quilt", '\u{f0574}'), // ó°•´ ("md_view_quilt_outline", '\u{f148e}'), // ó±’Ž ("md_view_sequential", '\u{f0729}'), // 󰜩 ("md_view_sequential_outline", '\u{f148f}'), // ó±’ ("md_view_split_horizontal", '\u{f0bcb}'), // 󰯋 ("md_view_split_vertical", '\u{f0bcc}'), // 󰯌 ("md_view_stream", '\u{f0575}'), // ó°•µ ("md_view_stream_outline", '\u{f1490}'), // ó±’ ("md_view_week", '\u{f0576}'), // ó°•¶ ("md_view_week_outline", '\u{f1491}'), // ó±’‘ ("md_vimeo", '\u{f0577}'), // ó°•· ("md_violin", '\u{f060f}'), // ó°˜ ("md_virtual_reality", '\u{f0894}'), // ó°¢” ("md_virus", '\u{f13b6}'), // 󱎶 ("md_virus_off", '\u{f18e1}'), // 󱣡 ("md_virus_off_outline", '\u{f18e2}'), // ó±£¢ ("md_virus_outline", '\u{f13b7}'), // 󱎷 ("md_vlc", '\u{f057c}'), // ó°•¼ ("md_voicemail", '\u{f057d}'), // ó°•½ ("md_volcano", '\u{f1a83}'), // 󱪃 ("md_volcano_outline", '\u{f1a84}'), // 󱪄 ("md_volleyball", '\u{f09b4}'), // ó°¦´ ("md_volume_high", '\u{f057e}'), // ó°•¾ ("md_volume_low", '\u{f057f}'), // ó°•¿ ("md_volume_medium", '\u{f0580}'), // ó°–€ ("md_volume_minus", '\u{f075e}'), // ó°ž ("md_volume_mute", '\u{f075f}'), // ó°Ÿ ("md_volume_off", '\u{f0581}'), // ó°– ("md_volume_plus", '\u{f075d}'), // ó° ("md_volume_source", '\u{f1120}'), // 󱄠 ("md_volume_variant_off", '\u{f0e08}'), // 󰸈 ("md_volume_vibrate", '\u{f1121}'), // 󱄡 ("md_vote", '\u{f0a1f}'), // 󰨟 ("md_vote_outline", '\u{f0a20}'), // ó°¨  ("md_vpn", '\u{f0582}'), // ó°–‚ ("md_vuejs", '\u{f0844}'), // ó°¡„ ("md_vuetify", '\u{f0e6d}'), // ó°¹­ ("md_walk", '\u{f0583}'), // ó°–ƒ ("md_wall", '\u{f07fe}'), // 󰟾 ("md_wall_fire", '\u{f1a11}'), // 󱨑 ("md_wall_sconce", '\u{f091c}'), // 󰤜 ("md_wall_sconce_flat", '\u{f091d}'), // ó°¤ ("md_wall_sconce_flat_outline", '\u{f17c9}'), // 󱟉 ("md_wall_sconce_flat_variant", '\u{f041c}'), // ó°œ ("md_wall_sconce_flat_variant_outline", '\u{f17ca}'), // 󱟊 ("md_wall_sconce_outline", '\u{f17cb}'), // 󱟋 ("md_wall_sconce_round", '\u{f0748}'), // ó°ˆ ("md_wall_sconce_round_outline", '\u{f17cc}'), // 󱟌 ("md_wall_sconce_round_variant", '\u{f091e}'), // 󰤞 ("md_wall_sconce_round_variant_outline", '\u{f17cd}'), // ó±Ÿ ("md_wallet", '\u{f0584}'), // ó°–„ ("md_wallet_giftcard", '\u{f0585}'), // ó°–… ("md_wallet_membership", '\u{f0586}'), // ó°–† ("md_wallet_outline", '\u{f0bdd}'), // ó°¯ ("md_wallet_plus", '\u{f0f8e}'), // 󰾎 ("md_wallet_plus_outline", '\u{f0f8f}'), // ó°¾ ("md_wallet_travel", '\u{f0587}'), // ó°–‡ ("md_wallpaper", '\u{f0e09}'), // 󰸉 ("md_wan", '\u{f0588}'), // ó°–ˆ ("md_wardrobe", '\u{f0f90}'), // ó°¾ ("md_wardrobe_outline", '\u{f0f91}'), // 󰾑 ("md_warehouse", '\u{f0f81}'), // ó°¾ ("md_washing_machine", '\u{f072a}'), // 󰜪 ("md_washing_machine_alert", '\u{f11bc}'), // 󱆼 ("md_washing_machine_off", '\u{f11bd}'), // 󱆽 ("md_watch", '\u{f0589}'), // ó°–‰ ("md_watch_export", '\u{f058a}'), // ó°–Š ("md_watch_export_variant", '\u{f0895}'), // 󰢕 ("md_watch_import", '\u{f058b}'), // ó°–‹ ("md_watch_import_variant", '\u{f0896}'), // ó°¢– ("md_watch_variant", '\u{f0897}'), // ó°¢— ("md_watch_vibrate", '\u{f06b1}'), // ó°š± ("md_watch_vibrate_off", '\u{f0cda}'), // 󰳚 ("md_water", '\u{f058c}'), // ó°–Œ ("md_water_alert", '\u{f1502}'), // 󱔂 ("md_water_alert_outline", '\u{f1503}'), // 󱔃 ("md_water_boiler", '\u{f0f92}'), // ó°¾’ ("md_water_boiler_alert", '\u{f11b3}'), // 󱆳 ("md_water_boiler_off", '\u{f11b4}'), // 󱆴 ("md_water_check", '\u{f1504}'), // 󱔄 ("md_water_check_outline", '\u{f1505}'), // ó±”… ("md_water_circle", '\u{f1806}'), // ó± † ("md_water_minus", '\u{f1506}'), // 󱔆 ("md_water_minus_outline", '\u{f1507}'), // 󱔇 ("md_water_off", '\u{f058d}'), // ó°– ("md_water_off_outline", '\u{f1508}'), // 󱔈 ("md_water_opacity", '\u{f1855}'), // 󱡕 ("md_water_outline", '\u{f0e0a}'), // 󰸊 ("md_water_percent", '\u{f058e}'), // ó°–Ž ("md_water_percent_alert", '\u{f1509}'), // 󱔉 ("md_water_plus", '\u{f150a}'), // 󱔊 ("md_water_plus_outline", '\u{f150b}'), // 󱔋 ("md_water_polo", '\u{f12a0}'), // 󱊠 ("md_water_pump", '\u{f058f}'), // ó°– ("md_water_pump_off", '\u{f0f93}'), // 󰾓 ("md_water_remove", '\u{f150c}'), // 󱔌 ("md_water_remove_outline", '\u{f150d}'), // ó±” ("md_water_sync", '\u{f17c6}'), // 󱟆 ("md_water_thermometer", '\u{f1a85}'), // 󱪅 ("md_water_thermometer_outline", '\u{f1a86}'), // 󱪆 ("md_water_well", '\u{f106b}'), // ó±« ("md_water_well_outline", '\u{f106c}'), // ó±¬ ("md_waterfall", '\u{f1849}'), // 󱡉 ("md_watering_can", '\u{f1481}'), // ó±’ ("md_watering_can_outline", '\u{f1482}'), // ó±’‚ ("md_watermark", '\u{f0612}'), // ó°˜’ ("md_wave", '\u{f0f2e}'), // ó°¼® ("md_waveform", '\u{f147d}'), // 󱑽 ("md_waves", '\u{f078d}'), // ó°ž ("md_waves_arrow_left", '\u{f1859}'), // 󱡙 ("md_waves_arrow_right", '\u{f185a}'), // 󱡚 ("md_waves_arrow_up", '\u{f185b}'), // 󱡛 ("md_waze", '\u{f0bde}'), // 󰯞 ("md_weather_cloudy", '\u{f0590}'), // ó°– ("md_weather_cloudy_alert", '\u{f0f2f}'), // 󰼯 ("md_weather_cloudy_arrow_right", '\u{f0e6e}'), // ó°¹® ("md_weather_cloudy_clock", '\u{f18f6}'), // ó±£¶ ("md_weather_fog", '\u{f0591}'), // ó°–‘ ("md_weather_hail", '\u{f0592}'), // ó°–’ ("md_weather_hazy", '\u{f0f30}'), // ó°¼° ("md_weather_hurricane", '\u{f0898}'), // 󰢘 ("md_weather_lightning", '\u{f0593}'), // ó°–“ ("md_weather_lightning_rainy", '\u{f067e}'), // ó°™¾ ("md_weather_night", '\u{f0594}'), // ó°–” ("md_weather_night_partly_cloudy", '\u{f0f31}'), // ó°¼± ("md_weather_partly_cloudy", '\u{f0595}'), // ó°–• ("md_weather_partly_lightning", '\u{f0f32}'), // ó°¼² ("md_weather_partly_rainy", '\u{f0f33}'), // ó°¼³ ("md_weather_partly_snowy", '\u{f0f34}'), // ó°¼´ ("md_weather_partly_snowy_rainy", '\u{f0f35}'), // ó°¼µ ("md_weather_pouring", '\u{f0596}'), // ó°–– ("md_weather_rainy", '\u{f0597}'), // ó°–— ("md_weather_snowy", '\u{f0598}'), // ó°–˜ ("md_weather_snowy_heavy", '\u{f0f36}'), // ó°¼¶ ("md_weather_snowy_rainy", '\u{f067f}'), // ó°™¿ ("md_weather_sunny", '\u{f0599}'), // ó°–™ ("md_weather_sunny_alert", '\u{f0f37}'), // ó°¼· ("md_weather_sunny_off", '\u{f14e4}'), // 󱓤 ("md_weather_sunset", '\u{f059a}'), // ó°–š ("md_weather_sunset_down", '\u{f059b}'), // ó°–› ("md_weather_sunset_up", '\u{f059c}'), // ó°–œ ("md_weather_tornado", '\u{f0f38}'), // 󰼸 ("md_weather_windy", '\u{f059d}'), // ó°– ("md_weather_windy_variant", '\u{f059e}'), // ó°–ž ("md_web", '\u{f059f}'), // ó°–Ÿ ("md_web_box", '\u{f0f94}'), // ó°¾” ("md_web_cancel", '\u{f1790}'), // ó±ž ("md_web_check", '\u{f0789}'), // 󰞉 ("md_web_clock", '\u{f124a}'), // 󱉊 ("md_web_minus", '\u{f10a0}'), // 󱂠 ("md_web_off", '\u{f0a8e}'), // 󰪎 ("md_web_plus", '\u{f0033}'), // ó°€³ ("md_web_refresh", '\u{f1791}'), // 󱞑 ("md_web_remove", '\u{f0551}'), // ó°•‘ ("md_web_sync", '\u{f1792}'), // 󱞒 ("md_webcam", '\u{f05a0}'), // ó°–  ("md_webcam_off", '\u{f1737}'), // 󱜷 ("md_webhook", '\u{f062f}'), // 󰘯 ("md_webpack", '\u{f072b}'), // 󰜫 ("md_webrtc", '\u{f1248}'), // 󱉈 ("md_wechat", '\u{f0611}'), // 󰘑 ("md_weight", '\u{f05a1}'), // ó°–¡ ("md_weight_gram", '\u{f0d3f}'), // ó°´¿ ("md_weight_kilogram", '\u{f05a2}'), // ó°–¢ ("md_weight_lifter", '\u{f115d}'), // ó±… ("md_weight_pound", '\u{f09b5}'), // 󰦵 ("md_whatsapp", '\u{f05a3}'), // ó°–£ ("md_wheel_barrow", '\u{f14f2}'), // 󱓲 ("md_wheelchair", '\u{f1a87}'), // 󱪇 ("md_wheelchair_accessibility", '\u{f05a4}'), // ó°–¤ ("md_whistle", '\u{f09b6}'), // 󰦶 ("md_whistle_outline", '\u{f12bc}'), // 󱊼 ("md_white_balance_auto", '\u{f05a5}'), // ó°–¥ ("md_white_balance_incandescent", '\u{f05a6}'), // ó°–¦ ("md_white_balance_iridescent", '\u{f05a7}'), // ó°–§ ("md_white_balance_sunny", '\u{f05a8}'), // ó°–¨ ("md_widgets", '\u{f072c}'), // 󰜬 ("md_widgets_outline", '\u{f1355}'), // ó±• ("md_wifi", '\u{f05a9}'), // ó°–© ("md_wifi_alert", '\u{f16b5}'), // 󱚵 ("md_wifi_arrow_down", '\u{f16b6}'), // 󱚶 ("md_wifi_arrow_left", '\u{f16b7}'), // 󱚷 ("md_wifi_arrow_left_right", '\u{f16b8}'), // 󱚸 ("md_wifi_arrow_right", '\u{f16b9}'), // 󱚹 ("md_wifi_arrow_up", '\u{f16ba}'), // 󱚺 ("md_wifi_arrow_up_down", '\u{f16bb}'), // 󱚻 ("md_wifi_cancel", '\u{f16bc}'), // 󱚼 ("md_wifi_check", '\u{f16bd}'), // 󱚽 ("md_wifi_cog", '\u{f16be}'), // 󱚾 ("md_wifi_lock", '\u{f16bf}'), // 󱚿 ("md_wifi_lock_open", '\u{f16c0}'), // 󱛀 ("md_wifi_marker", '\u{f16c1}'), // ó±› ("md_wifi_minus", '\u{f16c2}'), // 󱛂 ("md_wifi_off", '\u{f05aa}'), // ó°–ª ("md_wifi_plus", '\u{f16c3}'), // 󱛃 ("md_wifi_refresh", '\u{f16c4}'), // 󱛄 ("md_wifi_remove", '\u{f16c5}'), // ó±›… ("md_wifi_settings", '\u{f16c6}'), // 󱛆 ("md_wifi_star", '\u{f0e0b}'), // 󰸋 ("md_wifi_strength_1", '\u{f091f}'), // 󰤟 ("md_wifi_strength_1_alert", '\u{f0920}'), // ó°¤  ("md_wifi_strength_1_lock", '\u{f0921}'), // 󰤡 ("md_wifi_strength_1_lock_open", '\u{f16cb}'), // 󱛋 ("md_wifi_strength_2", '\u{f0922}'), // 󰤢 ("md_wifi_strength_2_alert", '\u{f0923}'), // 󰤣 ("md_wifi_strength_2_lock", '\u{f0924}'), // 󰤤 ("md_wifi_strength_2_lock_open", '\u{f16cc}'), // 󱛌 ("md_wifi_strength_3", '\u{f0925}'), // 󰤥 ("md_wifi_strength_3_alert", '\u{f0926}'), // 󰤦 ("md_wifi_strength_3_lock", '\u{f0927}'), // 󰤧 ("md_wifi_strength_3_lock_open", '\u{f16cd}'), // ó±› ("md_wifi_strength_4", '\u{f0928}'), // 󰤨 ("md_wifi_strength_4_alert", '\u{f0929}'), // 󰤩 ("md_wifi_strength_4_lock", '\u{f092a}'), // 󰤪 ("md_wifi_strength_4_lock_open", '\u{f16ce}'), // 󱛎 ("md_wifi_strength_alert_outline", '\u{f092b}'), // 󰤫 ("md_wifi_strength_lock_open_outline", '\u{f16cf}'), // ó±› ("md_wifi_strength_lock_outline", '\u{f092c}'), // 󰤬 ("md_wifi_strength_off", '\u{f092d}'), // ó°¤­ ("md_wifi_strength_off_outline", '\u{f092e}'), // 󰤮 ("md_wifi_strength_outline", '\u{f092f}'), // 󰤯 ("md_wifi_sync", '\u{f16c7}'), // 󱛇 ("md_wikipedia", '\u{f05ac}'), // ó°–¬ ("md_wind_power", '\u{f1a88}'), // 󱪈 ("md_wind_power_outline", '\u{f1a89}'), // 󱪉 ("md_wind_turbine", '\u{f0da5}'), // ó°¶¥ ("md_wind_turbine_alert", '\u{f19ab}'), // 󱦫 ("md_wind_turbine_check", '\u{f19ac}'), // 󱦬 ("md_window_close", '\u{f05ad}'), // ó°–­ ("md_window_closed", '\u{f05ae}'), // ó°–® ("md_window_closed_variant", '\u{f11db}'), // 󱇛 ("md_window_maximize", '\u{f05af}'), // ó°–¯ ("md_window_minimize", '\u{f05b0}'), // ó°–° ("md_window_open", '\u{f05b1}'), // ó°–± ("md_window_open_variant", '\u{f11dc}'), // 󱇜 ("md_window_restore", '\u{f05b2}'), // ó°–² ("md_window_shutter", '\u{f111c}'), // 󱄜 ("md_window_shutter_alert", '\u{f111d}'), // ó±„ ("md_window_shutter_cog", '\u{f1a8a}'), // 󱪊 ("md_window_shutter_open", '\u{f111e}'), // 󱄞 ("md_window_shutter_settings", '\u{f1a8b}'), // 󱪋 ("md_windsock", '\u{f15fa}'), // ó±—º ("md_wiper", '\u{f0ae9}'), // ó°«© ("md_wiper_wash", '\u{f0da6}'), // 󰶦 ("md_wiper_wash_alert", '\u{f18df}'), // 󱣟 ("md_wizard_hat", '\u{f1477}'), // 󱑷 ("md_wordpress", '\u{f05b4}'), // ó°–´ ("md_wrap", '\u{f05b6}'), // ó°–¶ ("md_wrap_disabled", '\u{f0bdf}'), // 󰯟 ("md_wrench", '\u{f05b7}'), // ó°–· ("md_wrench_clock", '\u{f19a3}'), // 󱦣 ("md_wrench_outline", '\u{f0be0}'), // ó°¯  ("md_xamarin", '\u{f0845}'), // ó°¡… ("md_xml", '\u{f05c0}'), // ó°—€ ("md_xmpp", '\u{f07ff}'), // ó°Ÿ¿ ("md_yahoo", '\u{f0b4f}'), // ó°­ ("md_yeast", '\u{f05c1}'), // ó°— ("md_yin_yang", '\u{f0680}'), // 󰚀 ("md_yoga", '\u{f117c}'), // ó±…¼ ("md_youtube", '\u{f05c3}'), // ó°—ƒ ("md_youtube_gaming", '\u{f0848}'), // 󰡈 ("md_youtube_studio", '\u{f0847}'), // 󰡇 ("md_youtube_subscription", '\u{f0d40}'), // ó°µ€ ("md_youtube_tv", '\u{f0448}'), // 󰑈 ("md_yurt", '\u{f1516}'), // ó±”– ("md_z_wave", '\u{f0aea}'), // 󰫪 ("md_zend", '\u{f0aeb}'), // ó°«« ("md_zigbee", '\u{f0d41}'), // ó°µ ("md_zip_box", '\u{f05c4}'), // ó°—„ ("md_zip_box_outline", '\u{f0ffa}'), // 󰿺 ("md_zip_disk", '\u{f0a23}'), // 󰨣 ("md_zodiac_aquarius", '\u{f0a7d}'), // ó°©½ ("md_zodiac_aries", '\u{f0a7e}'), // ó°©¾ ("md_zodiac_cancer", '\u{f0a7f}'), // ó°©¿ ("md_zodiac_capricorn", '\u{f0a80}'), // 󰪀 ("md_zodiac_gemini", '\u{f0a81}'), // ó°ª ("md_zodiac_leo", '\u{f0a82}'), // 󰪂 ("md_zodiac_libra", '\u{f0a83}'), // 󰪃 ("md_zodiac_pisces", '\u{f0a84}'), // 󰪄 ("md_zodiac_sagittarius", '\u{f0a85}'), // ó°ª… ("md_zodiac_scorpio", '\u{f0a86}'), // 󰪆 ("md_zodiac_taurus", '\u{f0a87}'), // 󰪇 ("md_zodiac_virgo", '\u{f0a88}'), // 󰪈 ("oct_accessibility", '\u{f406}'), // ï† ("oct_accessibility_inset", '\u{f40b}'), // ï‹ ("oct_alert", '\u{f421}'), // ï¡ ("oct_alert_fill", '\u{f40c}'), // ïŒ ("oct_apps", '\u{f40e}'), // ïŽ ("oct_archive", '\u{f411}'), // ï‘ ("oct_arrow_both", '\u{f416}'), // ï– ("oct_arrow_down", '\u{f433}'), // ï³ ("oct_arrow_down_left", '\u{f424}'), // ï¤ ("oct_arrow_down_right", '\u{f43e}'), // ï¾ ("oct_arrow_left", '\u{f434}'), // ï´ ("oct_arrow_right", '\u{f432}'), // ï² ("oct_arrow_switch", '\u{f443}'), //  ("oct_arrow_up", '\u{f431}'), // ï± ("oct_arrow_up_left", '\u{f45c}'), //  ("oct_arrow_up_right", '\u{f46c}'), //  ("oct_beaker", '\u{f499}'), // ï’™ ("oct_bell", '\u{f49a}'), // ï’š ("oct_bell_fill", '\u{f476}'), // ï‘¶ ("oct_bell_slash", '\u{f478}'), //  ("oct_blocked", '\u{f479}'), //  ("oct_bold", '\u{f49d}'), // ï’ ("oct_book", '\u{f405}'), // ï… ("oct_bookmark", '\u{f461}'), // ï‘¡ ("oct_bookmark_fill", '\u{f47a}'), //  ("oct_bookmark_slash", '\u{f533}'), //  ("oct_bookmark_slash_fill", '\u{f493}'), // ï’“ ("oct_briefcase", '\u{f491}'), // ï’‘ ("oct_broadcast", '\u{f43c}'), // ï¼ ("oct_browser", '\u{f488}'), // ï’ˆ ("oct_bug", '\u{f46f}'), //  ("oct_cache", '\u{f49b}'), // ï’› ("oct_calendar", '\u{f455}'), // ï‘• ("oct_check", '\u{f42e}'), // ï® ("oct_check_circle", '\u{f49e}'), // ï’ž ("oct_check_circle_fill", '\u{f4a4}'), // ï’¤ ("oct_checkbox", '\u{f4a7}'), // ï’§ ("oct_checklist", '\u{f45e}'), //  ("oct_chevron_down", '\u{f47c}'), //  ("oct_chevron_left", '\u{f47d}'), //  ("oct_chevron_right", '\u{f460}'), // ï‘  ("oct_chevron_up", '\u{f47b}'), // ï‘» ("oct_circle", '\u{f4aa}'), // ï’ª ("oct_circle_slash", '\u{f468}'), //  ("oct_clock", '\u{f43a}'), // ïº ("oct_clock_fill", '\u{f4ab}'), // ï’« ("oct_cloud", '\u{f4ac}'), // ï’¬ ("oct_cloud_offline", '\u{f4ad}'), // ï’­ ("oct_code", '\u{f44f}'), // ï‘ ("oct_code_of_conduct", '\u{f4ae}'), // ï’® ("oct_code_review", '\u{f4af}'), // ï’¯ ("oct_code_square", '\u{f4b0}'), // ï’° ("oct_codescan", '\u{f4b1}'), // ï’± ("oct_codescan_checkmark", '\u{f4b2}'), // ï’² ("oct_codespaces", '\u{f4b3}'), // ï’³ ("oct_columns", '\u{f4b4}'), // ï’´ ("oct_command_palette", '\u{f4b5}'), // ï’µ ("oct_comment", '\u{f41f}'), // ïŸ ("oct_comment_discussion", '\u{f442}'), // ï‘‚ ("oct_commit", '\u{f4b6}'), // ï’¶ ("oct_container", '\u{f4b7}'), // ï’· ("oct_copilot", '\u{f4b8}'), // ï’¸ ("oct_copilot_error", '\u{f4b9}'), // ï’¹ ("oct_copilot_warning", '\u{f4ba}'), // ï’º ("oct_copy", '\u{f4bb}'), // ï’» ("oct_cpu", '\u{f4bc}'), // ï’¼ ("oct_credit_card", '\u{f439}'), // ï¹ ("oct_cross_reference", '\u{f4bd}'), // ï’½ ("oct_dash", '\u{f48b}'), // ï’‹ ("oct_database", '\u{f472}'), //  ("oct_dependabot", '\u{f4be}'), // ï’¾ ("oct_desktop_download", '\u{f498}'), // ï’˜ ("oct_device_camera", '\u{f446}'), //  ("oct_device_camera_video", '\u{f447}'), //  ("oct_device_desktop", '\u{f4a9}'), // ï’© ("oct_device_mobile", '\u{f42c}'), // ï¬ ("oct_diamond", '\u{f4bf}'), // ï’¿ ("oct_diff", '\u{f440}'), // ï‘€ ("oct_diff_added", '\u{f457}'), // ï‘— ("oct_diff_ignored", '\u{f474}'), // ï‘´ ("oct_diff_modified", '\u{f459}'), // ï‘™ ("oct_diff_removed", '\u{f458}'), //  ("oct_diff_renamed", '\u{f45a}'), //  ("oct_discussion_closed", '\u{f4c0}'), // ï“€ ("oct_discussion_duplicate", '\u{f4c1}'), // ï“ ("oct_discussion_outdated", '\u{f4c2}'), // ï“‚ ("oct_dot", '\u{f4c3}'), //  ("oct_dot_fill", '\u{f444}'), // ï‘„ ("oct_download", '\u{f409}'), // ï‰ ("oct_duplicate", '\u{f4c4}'), // ï“„ ("oct_ellipsis", '\u{f475}'), //  ("oct_eye", '\u{f441}'), // ï‘ ("oct_eye_closed", '\u{f4c5}'), // ï“… ("oct_feed_discussion", '\u{f4c6}'), //  ("oct_feed_forked", '\u{f4c7}'), //  ("oct_feed_heart", '\u{f4c8}'), //  ("oct_feed_merged", '\u{f4c9}'), //  ("oct_feed_person", '\u{f4ca}'), //  ("oct_feed_repo", '\u{f4cb}'), // ï“‹ ("oct_feed_rocket", '\u{f4cc}'), //  ("oct_feed_star", '\u{f4cd}'), // ï“ ("oct_feed_tag", '\u{f4ce}'), //  ("oct_feed_trophy", '\u{f4cf}'), // ï“ ("oct_file", '\u{f4a5}'), // ï’¥ ("oct_file_added", '\u{f4d0}'), // ï“ ("oct_file_badge", '\u{f4d1}'), // ï“‘ ("oct_file_binary", '\u{f471}'), //  ("oct_file_code", '\u{f40d}'), // ï ("oct_file_diff", '\u{f4d2}'), // ï“’ ("oct_file_directory", '\u{f413}'), // ï“ ("oct_file_directory_fill", '\u{f4d3}'), // ï““ ("oct_file_directory_open_fill", '\u{f4d4}'), // ï“” ("oct_file_media", '\u{f40f}'), // ï ("oct_file_moved", '\u{f4d5}'), // ï“• ("oct_file_removed", '\u{f4d6}'), // ï“– ("oct_file_submodule", '\u{f414}'), // ï” ("oct_file_symlink_directory", '\u{f482}'), // ï’‚ ("oct_file_symlink_file", '\u{f481}'), // ï’ ("oct_file_zip", '\u{f410}'), // ï ("oct_filter", '\u{f4d7}'), // ï“— ("oct_fiscal_host", '\u{f4d8}'), //  ("oct_flame", '\u{f490}'), // ï’ ("oct_fold", '\u{f48c}'), // ï’Œ ("oct_fold_down", '\u{f4d9}'), // ï“™ ("oct_fold_up", '\u{f4da}'), //  ("oct_gear", '\u{f423}'), // ï£ ("oct_gift", '\u{f436}'), // ï¶ ("oct_git_branch", '\u{f418}'), // ï˜ ("oct_git_commit", '\u{f417}'), // ï— ("oct_git_compare", '\u{f47f}'), // ï‘¿ ("oct_git_merge", '\u{f419}'), // ï™ ("oct_git_merge_queue", '\u{f4db}'), // ï“› ("oct_git_pull_request", '\u{f407}'), // ï‡ ("oct_git_pull_request_closed", '\u{f4dc}'), //  ("oct_git_pull_request_draft", '\u{f4dd}'), // ï“ ("oct_globe", '\u{f484}'), // ï’„ ("oct_goal", '\u{f4de}'), //  ("oct_grabber", '\u{f4a6}'), // ï’¦ ("oct_graph", '\u{f437}'), // ï· ("oct_hash", '\u{f4df}'), //  ("oct_heading", '\u{f4e0}'), // ï“  ("oct_heart", '\u{2665}'), // ♥ ("oct_heart_fill", '\u{f4e1}'), // ï“¡ ("oct_history", '\u{f464}'), //  ("oct_home", '\u{f46d}'), // ï‘­ ("oct_home_fill", '\u{f4e2}'), // ï“¢ ("oct_horizontal_rule", '\u{f45b}'), // ï‘› ("oct_hourglass", '\u{f4e3}'), // ï“£ ("oct_hubot", '\u{f477}'), // ï‘· ("oct_id_badge", '\u{f4e4}'), //  ("oct_image", '\u{f4e5}'), // ï“¥ ("oct_inbox", '\u{f48d}'), // ï’ ("oct_infinity", '\u{f4e6}'), //  ("oct_info", '\u{f449}'), //  ("oct_issue_closed", '\u{f41d}'), // ï ("oct_issue_draft", '\u{f4e7}'), // ï“§ ("oct_issue_opened", '\u{f41b}'), // ï› ("oct_issue_reopened", '\u{f41c}'), // ïœ ("oct_issue_tracked_by", '\u{f4e8}'), //  ("oct_issue_tracks", '\u{f4e9}'), // ï“© ("oct_italic", '\u{f49f}'), // ï’Ÿ ("oct_iterations", '\u{f4ea}'), //  ("oct_kebab_horizontal", '\u{f4eb}'), // ï“« ("oct_key", '\u{f43d}'), // ï½ ("oct_key_asterisk", '\u{f4ec}'), //  ("oct_law", '\u{f495}'), // ï’• ("oct_light_bulb", '\u{f400}'), // ï€ ("oct_link", '\u{f44c}'), //  ("oct_link_external", '\u{f465}'), // ï‘¥ ("oct_list_ordered", '\u{f452}'), // ï‘’ ("oct_list_unordered", '\u{f451}'), // ï‘‘ ("oct_location", '\u{f450}'), // ï‘ ("oct_lock", '\u{f456}'), // ï‘– ("oct_log", '\u{f4ed}'), // ï“­ ("oct_logo_gist", '\u{f480}'), // ï’€ ("oct_logo_github", '\u{f470}'), // ï‘° ("oct_mail", '\u{f42f}'), // ï¯ ("oct_mark_github", '\u{f408}'), // ïˆ ("oct_markdown", '\u{f48a}'), // ï’Š ("oct_megaphone", '\u{f45f}'), //  ("oct_mention", '\u{f486}'), // ï’† ("oct_meter", '\u{f463}'), // ï‘£ ("oct_milestone", '\u{f45d}'), // ï‘ ("oct_mirror", '\u{f41a}'), // ïš ("oct_moon", '\u{f4ee}'), // ï“® ("oct_mortar_board", '\u{f494}'), // ï’” ("oct_move_to_bottom", '\u{f4ef}'), //  ("oct_move_to_end", '\u{f4f0}'), // ï“° ("oct_move_to_start", '\u{f4f1}'), //  ("oct_move_to_top", '\u{f4f2}'), //  ("oct_multi_select", '\u{f4f3}'), //  ("oct_mute", '\u{f466}'), //  ("oct_no_entry", '\u{f4f4}'), // ï“´ ("oct_north_star", '\u{f4f5}'), //  ("oct_note", '\u{f4f6}'), // ï“¶ ("oct_number", '\u{f4f7}'), // ï“· ("oct_organization", '\u{f42b}'), // ï« ("oct_package", '\u{f487}'), // ï’‡ ("oct_package_dependencies", '\u{f4f8}'), //  ("oct_package_dependents", '\u{f4f9}'), //  ("oct_paintbrush", '\u{f48f}'), // ï’ ("oct_paper_airplane", '\u{f4fa}'), //  ("oct_paperclip", '\u{f4fb}'), // ï“» ("oct_passkey_fill", '\u{f4fc}'), //  ("oct_paste", '\u{f429}'), // ï© ("oct_pencil", '\u{f448}'), //  ("oct_people", '\u{f4fd}'), //  ("oct_person", '\u{f415}'), // ï• ("oct_person_add", '\u{f4fe}'), //  ("oct_person_fill", '\u{f4ff}'), // ï“¿ ("oct_pin", '\u{f435}'), // ïµ ("oct_play", '\u{f500}'), //  ("oct_plug", '\u{f492}'), // ï’’ ("oct_plus", '\u{f44d}'), // ï‘ ("oct_plus_circle", '\u{f501}'), // ï” ("oct_project", '\u{f502}'), //  ("oct_project_roadmap", '\u{f503}'), //  ("oct_project_symlink", '\u{f504}'), //  ("oct_project_template", '\u{f505}'), // ï”… ("oct_pulse", '\u{f469}'), // ï‘© ("oct_question", '\u{f420}'), // ï  ("oct_quote", '\u{f453}'), // ï‘“ ("oct_read", '\u{f430}'), // ï° ("oct_rel_file_path", '\u{f506}'), //  ("oct_reply", '\u{f4a8}'), // ï’¨ ("oct_repo", '\u{f401}'), // ï ("oct_repo_clone", '\u{f43f}'), // ï¿ ("oct_repo_deleted", '\u{f507}'), //  ("oct_repo_forked", '\u{f402}'), // ï‚ ("oct_repo_locked", '\u{f508}'), //  ("oct_repo_pull", '\u{f404}'), // ï„ ("oct_repo_push", '\u{f403}'), // ïƒ ("oct_repo_template", '\u{f509}'), //  ("oct_report", '\u{f50a}'), //  ("oct_rocket", '\u{f427}'), // ï§ ("oct_rows", '\u{f50b}'), //  ("oct_rss", '\u{f428}'), // ï¨ ("oct_ruby", '\u{f43b}'), // ï» ("oct_screen_full", '\u{f50c}'), //  ("oct_screen_normal", '\u{f50d}'), // ï” ("oct_search", '\u{f422}'), // ï¢ ("oct_server", '\u{f473}'), //  ("oct_share", '\u{f50e}'), //  ("oct_share_android", '\u{f50f}'), // ï” ("oct_shield", '\u{f49c}'), // ï’œ ("oct_shield_check", '\u{f510}'), // ï” ("oct_shield_lock", '\u{f511}'), //  ("oct_shield_slash", '\u{f512}'), // ï”’ ("oct_shield_x", '\u{f513}'), //  ("oct_sidebar_collapse", '\u{f514}'), // ï”” ("oct_sidebar_expand", '\u{f515}'), //  ("oct_sign_in", '\u{f42a}'), // ïª ("oct_sign_out", '\u{f426}'), // ï¦ ("oct_single_select", '\u{f516}'), // ï”– ("oct_skip", '\u{f517}'), // ï”— ("oct_skip_fill", '\u{f518}'), //  ("oct_sliders", '\u{f462}'), // ï‘¢ ("oct_smiley", '\u{f4a2}'), // ï’¢ ("oct_sort_asc", '\u{f519}'), // ï”™ ("oct_sort_desc", '\u{f51a}'), //  ("oct_sparkle_fill", '\u{f51b}'), // ï”› ("oct_sponsor_tiers", '\u{f51c}'), //  ("oct_square", '\u{f51d}'), // ï” ("oct_square_fill", '\u{f445}'), // ï‘… ("oct_squirrel", '\u{f483}'), // ï’ƒ ("oct_stack", '\u{f51e}'), //  ("oct_star", '\u{f41e}'), // ïž ("oct_star_fill", '\u{f51f}'), //  ("oct_stop", '\u{f46e}'), // ï‘® ("oct_stopwatch", '\u{f520}'), // ï”  ("oct_strikethrough", '\u{f521}'), //  ("oct_sun", '\u{f522}'), //  ("oct_sync", '\u{f46a}'), //  ("oct_tab", '\u{f523}'), //  ("oct_tab_external", '\u{f524}'), //  ("oct_table", '\u{f525}'), //  ("oct_tag", '\u{f412}'), // ï’ ("oct_tasklist", '\u{f4a0}'), // ï’  ("oct_telescope", '\u{f46b}'), // ï‘« ("oct_telescope_fill", '\u{f526}'), //  ("oct_terminal", '\u{f489}'), // ï’‰ ("oct_three_bars", '\u{f44e}'), //  ("oct_thumbsdown", '\u{f497}'), // ï’— ("oct_thumbsup", '\u{f496}'), // ï’– ("oct_tools", '\u{f425}'), // ï¥ ("oct_trash", '\u{f48e}'), // ï’Ž ("oct_triangle_down", '\u{f44b}'), // ï‘‹ ("oct_triangle_left", '\u{f438}'), // ï¸ ("oct_triangle_right", '\u{f44a}'), //  ("oct_triangle_up", '\u{f47e}'), //  ("oct_trophy", '\u{f527}'), // ï”§ ("oct_typography", '\u{f528}'), //  ("oct_unfold", '\u{f42d}'), // ï­ ("oct_unlink", '\u{f529}'), //  ("oct_unlock", '\u{f52a}'), //  ("oct_unmute", '\u{f485}'), // ï’… ("oct_unread", '\u{f52b}'), //  ("oct_unverified", '\u{f4a3}'), // ï’£ ("oct_upload", '\u{f40a}'), // ïŠ ("oct_verified", '\u{f4a1}'), // ï’¡ ("oct_versions", '\u{f454}'), // ï‘” ("oct_video", '\u{f52c}'), //  ("oct_webhook", '\u{f52d}'), // ï”­ ("oct_workflow", '\u{f52e}'), // ï”® ("oct_x", '\u{f467}'), // ï‘§ ("oct_x_circle", '\u{f52f}'), //  ("oct_x_circle_fill", '\u{f530}'), // ï”° ("oct_zap", '\u{26a1}'), // âš¡ ("oct_zoom_in", '\u{f531}'), // ï”± ("oct_zoom_out", '\u{f532}'), //  ("pl_branch", '\u{e0a0}'), // î‚  ("pl_hostname", '\u{e0a2}'), // î‚¢ ("pl_left_hard_divider", '\u{e0b0}'), // î‚° ("pl_left_soft_divider", '\u{e0b1}'), //  ("pl_line_number", '\u{e0a1}'), // î‚¡ ("pl_right_hard_divider", '\u{e0b2}'), //  ("pl_right_soft_divider", '\u{e0b3}'), //  ("ple_backslash_separator", '\u{e0b9}'), //  ("ple_backslash_separator_redundant", '\u{e0bf}'), // î‚¿ ("ple_column_number", '\u{e0a3}'), // î‚£ ("ple_flame_thick", '\u{e0c0}'), //  ("ple_flame_thick_mirrored", '\u{e0c2}'), //  ("ple_flame_thin", '\u{e0c1}'), // îƒ ("ple_flame_thin_mirrored", '\u{e0c3}'), //  ("ple_forwardslash_separator", '\u{e0bb}'), // î‚» ("ple_forwardslash_separator_redundant", '\u{e0bd}'), //  ("ple_honeycomb", '\u{e0cc}'), //  ("ple_honeycomb_outline", '\u{e0cd}'), // îƒ ("ple_ice_waveform", '\u{e0c8}'), //  ("ple_ice_waveform_mirrored", '\u{e0ca}'), //  ("ple_left_half_circle_thick", '\u{e0b6}'), // î‚¶ ("ple_left_half_circle_thin", '\u{e0b7}'), // î‚· ("ple_lego_block_facing", '\u{e0d0}'), // îƒ ("ple_lego_block_sideways", '\u{e0d1}'), //  ("ple_lego_separator", '\u{e0ce}'), //  ("ple_lego_separator_thin", '\u{e0cf}'), // îƒ ("ple_lower_left_triangle", '\u{e0b8}'), //  ("ple_lower_right_triangle", '\u{e0ba}'), //  ("ple_pixelated_squares_big", '\u{e0c6}'), //  ("ple_pixelated_squares_big_mirrored", '\u{e0c7}'), //  ("ple_pixelated_squares_small", '\u{e0c4}'), //  ("ple_pixelated_squares_small_mirrored", '\u{e0c5}'), //  ("ple_right_half_circle_thick", '\u{e0b4}'), // î‚´ ("ple_right_half_circle_thin", '\u{e0b5}'), //  ("ple_trapezoid_top_bottom", '\u{e0d2}'), //  ("ple_trapezoid_top_bottom_mirrored", '\u{e0d4}'), //  ("ple_upper_left_triangle", '\u{e0bc}'), //  ("ple_upper_right_triangle", '\u{e0be}'), //  ("pom_away", '\u{e007}'), //  ("pom_clean_code", '\u{e000}'), //  ("pom_external_interruption", '\u{e00a}'), //  ("pom_internal_interruption", '\u{e009}'), //  ("pom_long_pause", '\u{e006}'), //  ("pom_pair_programming", '\u{e008}'), //  ("pom_pomodoro_done", '\u{e001}'), // î€ ("pom_pomodoro_estimated", '\u{e002}'), //  ("pom_pomodoro_squashed", '\u{e004}'), //  ("pom_pomodoro_ticking", '\u{e003}'), //  ("pom_short_pause", '\u{e005}'), //  ("seti_apple", '\u{e635}'), //  ("seti_argdown", '\u{e636}'), //  ("seti_asm", '\u{e637}'), //  ("seti_audio", '\u{e638}'), //  ("seti_babel", '\u{e639}'), //  ("seti_bazel", '\u{e63a}'), //  ("seti_bicep", '\u{e63b}'), //  ("seti_bower", '\u{e61a}'), //  ("seti_bsl", '\u{e63c}'), //  ("seti_c", '\u{e649}'), //  ("seti_c_sharp", '\u{e648}'), //  ("seti_cake", '\u{e63e}'), //  ("seti_cake_php", '\u{e63d}'), //  ("seti_checkbox", '\u{e63f}'), //  ("seti_checkbox_unchecked", '\u{e640}'), //  ("seti_clock", '\u{e641}'), // î™ ("seti_clojure", '\u{e642}'), //  ("seti_code_climate", '\u{e643}'), //  ("seti_code_search", '\u{e644}'), //  ("seti_coffee", '\u{e61b}'), //  ("seti_coldfusion", '\u{e645}'), // î™… ("seti_config", '\u{e615}'), //  ("seti_cpp", '\u{e646}'), //  ("seti_crystal_embedded", '\u{e647}'), //  ("seti_css", '\u{e614}'), //  ("seti_csv", '\u{e64a}'), //  ("seti_cu", '\u{e64b}'), //  ("seti_d", '\u{e651}'), //  ("seti_dart", '\u{e64c}'), //  ("seti_db", '\u{e64d}'), // î™ ("seti_default", '\u{e64e}'), //  ("seti_deprecation_cop", '\u{e64f}'), // î™ ("seti_docker", '\u{e650}'), // î™ ("seti_editorconfig", '\u{e652}'), // î™’ ("seti_ejs", '\u{e618}'), //  ("seti_elixir_script", '\u{e653}'), //  ("seti_error", '\u{e654}'), // î™” ("seti_eslint", '\u{e655}'), //  ("seti_ethereum", '\u{e656}'), // î™– ("seti_f_sharp", '\u{e65a}'), //  ("seti_favicon", '\u{e623}'), //  ("seti_firebase", '\u{e657}'), // î™— ("seti_firefox", '\u{e658}'), //  ("seti_folder", '\u{e613}'), //  ("seti_font", '\u{e659}'), // î™™ ("seti_git", '\u{e65d}'), // î™ ("seti_github", '\u{e65b}'), // î™› ("seti_gitlab", '\u{e65c}'), //  ("seti_go", '\u{e627}'), //  ("seti_go2", '\u{e65e}'), //  ("seti_godot", '\u{e65f}'), //  ("seti_gradle", '\u{e660}'), // î™  ("seti_grails", '\u{e661}'), //  ("seti_graphql", '\u{e662}'), //  ("seti_grunt", '\u{e611}'), //  ("seti_gulp", '\u{e610}'), // î˜ ("seti_hacklang", '\u{e663}'), //  ("seti_haml", '\u{e664}'), //  ("seti_happenings", '\u{e665}'), //  ("seti_haskell", '\u{e61f}'), //  ("seti_haxe", '\u{e666}'), //  ("seti_heroku", '\u{e607}'), //  ("seti_hex", '\u{e667}'), // î™§ ("seti_html", '\u{e60e}'), //  ("seti_ignored", '\u{e668}'), //  ("seti_illustrator", '\u{e669}'), //  ("seti_image", '\u{e60d}'), // î˜ ("seti_info", '\u{e66a}'), //  ("seti_ionic", '\u{e66b}'), //  ("seti_jade", '\u{e66c}'), //  ("seti_java", '\u{e66d}'), // î™­ ("seti_javascript", '\u{e60c}'), //  ("seti_jenkins", '\u{e66e}'), // î™® ("seti_jinja", '\u{e66f}'), //  ("seti_json", '\u{e60b}'), //  ("seti_julia", '\u{e624}'), //  ("seti_karma", '\u{e622}'), //  ("seti_license", '\u{e60a}'), //  ("seti_liquid", '\u{e670}'), // î™° ("seti_livescript", '\u{e671}'), // î™± ("seti_lock", '\u{e672}'), //  ("seti_lua", '\u{e620}'), //  ("seti_makefile", '\u{e673}'), //  ("seti_markdown", '\u{e609}'), //  ("seti_maven", '\u{e674}'), // î™´ ("seti_mdo", '\u{e675}'), //  ("seti_mustache", '\u{e60f}'), // î˜ ("seti_new_file", '\u{e676}'), // î™¶ ("seti_nim", '\u{e677}'), // î™· ("seti_notebook", '\u{e678}'), //  ("seti_npm", '\u{e616}'), //  ("seti_nunjucks", '\u{e679}'), //  ("seti_ocaml", '\u{e67a}'), //  ("seti_odata", '\u{e67b}'), // î™» ("seti_pddl", '\u{e67c}'), //  ("seti_pdf", '\u{e67d}'), //  ("seti_perl", '\u{e67e}'), //  ("seti_photoshop", '\u{e67f}'), //  ("seti_php", '\u{e608}'), //  ("seti_pipeline", '\u{e680}'), //  ("seti_plan", '\u{e681}'), // îš ("seti_platformio", '\u{e682}'), // îš‚ ("seti_powershell", '\u{e683}'), //  ("seti_prisma", '\u{e684}'), // îš„ ("seti_project", '\u{e601}'), // î˜ ("seti_prolog", '\u{e685}'), // îš… ("seti_pug", '\u{e686}'), //  ("seti_puppet", '\u{e631}'), //  ("seti_python", '\u{e606}'), //  ("seti_r", '\u{e68a}'), //  ("seti_rails", '\u{e604}'), //  ("seti_react", '\u{e625}'), //  ("seti_reasonml", '\u{e687}'), //  ("seti_rescript", '\u{e688}'), //  ("seti_rollup", '\u{e689}'), //  ("seti_ruby", '\u{e605}'), //  ("seti_rust", '\u{e68b}'), // îš‹ ("seti_salesforce", '\u{e68c}'), //  ("seti_sass", '\u{e603}'), //  ("seti_sbt", '\u{e68d}'), // îš ("seti_scala", '\u{e68e}'), //  ("seti_search", '\u{e68f}'), // îš ("seti_settings", '\u{e690}'), // îš ("seti_shell", '\u{e691}'), // îš‘ ("seti_slim", '\u{e692}'), // îš’ ("seti_smarty", '\u{e693}'), // îš“ ("seti_spring", '\u{e694}'), // îš” ("seti_stylelint", '\u{e695}'), // îš• ("seti_stylus", '\u{e600}'), //  ("seti_sublime", '\u{e696}'), // îš– ("seti_svelte", '\u{e697}'), // îš— ("seti_svg", '\u{e698}'), //  ("seti_swift", '\u{e699}'), // îš™ ("seti_terraform", '\u{e69a}'), // îšš ("seti_tex", '\u{e69b}'), // îš› ("seti_todo", '\u{e69c}'), // îšœ ("seti_tsconfig", '\u{e69d}'), // îš ("seti_twig", '\u{e61c}'), //  ("seti_typescript", '\u{e628}'), //  ("seti_vala", '\u{e69e}'), // îšž ("seti_video", '\u{e69f}'), //  ("seti_vue", '\u{e6a0}'), // îš  ("seti_wasm", '\u{e6a1}'), // îš¡ ("seti_wat", '\u{e6a2}'), //  ("seti_webpack", '\u{e6a3}'), //  ("seti_wgt", '\u{e6a4}'), //  ("seti_word", '\u{e6a5}'), //  ("seti_xls", '\u{e6a6}'), //  ("seti_xml", '\u{e619}'), //  ("seti_yarn", '\u{e6a7}'), // îš§ ("seti_yml", '\u{e6a8}'), //  ("seti_zig", '\u{e6a9}'), // îš© ("seti_zip", '\u{e6aa}'), //  ("weather_alien", '\u{e36e}'), // î® ("weather_aliens", '\u{e345}'), // î… ("weather_barometer", '\u{e372}'), // î² ("weather_celsius", '\u{e339}'), //  ("weather_cloud", '\u{e33d}'), //  ("weather_cloud_down", '\u{e33a}'), //  ("weather_cloud_refresh", '\u{e33b}'), //  ("weather_cloud_up", '\u{e33c}'), //  ("weather_cloudy", '\u{e312}'), //  ("weather_cloudy_gusts", '\u{e310}'), // îŒ ("weather_cloudy_windy", '\u{e311}'), //  ("weather_day_cloudy", '\u{e302}'), //  ("weather_day_cloudy_gusts", '\u{e300}'), //  ("weather_day_cloudy_high", '\u{e376}'), // î¶ ("weather_day_cloudy_windy", '\u{e301}'), // îŒ ("weather_day_fog", '\u{e303}'), //  ("weather_day_hail", '\u{e304}'), //  ("weather_day_haze", '\u{e3ae}'), //  ("weather_day_light_wind", '\u{e3bc}'), //  ("weather_day_lightning", '\u{e305}'), //  ("weather_day_rain", '\u{e308}'), //  ("weather_day_rain_mix", '\u{e306}'), //  ("weather_day_rain_wind", '\u{e307}'), //  ("weather_day_showers", '\u{e309}'), //  ("weather_day_sleet", '\u{e3aa}'), //  ("weather_day_sleet_storm", '\u{e362}'), // î¢ ("weather_day_snow", '\u{e30a}'), //  ("weather_day_snow_thunderstorm", '\u{e365}'), // î¥ ("weather_day_snow_wind", '\u{e35f}'), // îŸ ("weather_day_sprinkle", '\u{e30b}'), //  ("weather_day_storm_showers", '\u{e30e}'), //  ("weather_day_sunny", '\u{e30d}'), // îŒ ("weather_day_sunny_overcast", '\u{e30c}'), //  ("weather_day_thunderstorm", '\u{e30f}'), // îŒ ("weather_day_windy", '\u{e37d}'), // î½ ("weather_degrees", '\u{e33e}'), //  ("weather_direction_down", '\u{e340}'), // î€ ("weather_direction_down_left", '\u{e33f}'), //  ("weather_direction_down_right", '\u{e380}'), //  ("weather_direction_left", '\u{e344}'), // î„ ("weather_direction_right", '\u{e349}'), // î‰ ("weather_direction_up", '\u{e353}'), // î“ ("weather_direction_up_left", '\u{e37f}'), // î¿ ("weather_direction_up_right", '\u{e352}'), // î’ ("weather_dust", '\u{e35d}'), // î ("weather_earthquake", '\u{e3be}'), //  ("weather_fahrenheit", '\u{e341}'), // î ("weather_fire", '\u{e3bf}'), //  ("weather_flood", '\u{e375}'), // îµ ("weather_fog", '\u{e313}'), //  ("weather_gale_warning", '\u{e3c5}'), // î… ("weather_hail", '\u{e314}'), //  ("weather_horizon", '\u{e343}'), // îƒ ("weather_horizon_alt", '\u{e342}'), // î‚ ("weather_hot", '\u{e36b}'), // î« ("weather_humidity", '\u{e373}'), // î³ ("weather_hurricane", '\u{e36c}'), // î¬ ("weather_hurricane_warning", '\u{e3c7}'), // î‡ ("weather_lightning", '\u{e315}'), //  ("weather_lunar_eclipse", '\u{e369}'), // î© ("weather_meteor", '\u{e36a}'), // îª ("weather_moon_alt_first_quarter", '\u{e3ce}'), // îŽ ("weather_moon_alt_full", '\u{e3d5}'), // î• ("weather_moon_alt_new", '\u{e3e3}'), // î£ ("weather_moon_alt_third_quarter", '\u{e3dc}'), // îœ ("weather_moon_alt_waning_crescent_1", '\u{e3dd}'), // î ("weather_moon_alt_waning_crescent_2", '\u{e3de}'), // îž ("weather_moon_alt_waning_crescent_3", '\u{e3df}'), // îŸ ("weather_moon_alt_waning_crescent_4", '\u{e3e0}'), // î  ("weather_moon_alt_waning_crescent_5", '\u{e3e1}'), // î¡ ("weather_moon_alt_waning_crescent_6", '\u{e3e2}'), // î¢ ("weather_moon_alt_waning_gibbous_1", '\u{e3d6}'), // î– ("weather_moon_alt_waning_gibbous_2", '\u{e3d7}'), // î— ("weather_moon_alt_waning_gibbous_3", '\u{e3d8}'), // î˜ ("weather_moon_alt_waning_gibbous_4", '\u{e3d9}'), // î™ ("weather_moon_alt_waning_gibbous_5", '\u{e3da}'), // îš ("weather_moon_alt_waning_gibbous_6", '\u{e3db}'), // î› ("weather_moon_alt_waxing_crescent_1", '\u{e3c8}'), // îˆ ("weather_moon_alt_waxing_crescent_2", '\u{e3c9}'), // î‰ ("weather_moon_alt_waxing_crescent_3", '\u{e3ca}'), // îŠ ("weather_moon_alt_waxing_crescent_4", '\u{e3cb}'), // î‹ ("weather_moon_alt_waxing_crescent_5", '\u{e3cc}'), // îŒ ("weather_moon_alt_waxing_crescent_6", '\u{e3cd}'), // î ("weather_moon_alt_waxing_gibbous_1", '\u{e3cf}'), // î ("weather_moon_alt_waxing_gibbous_2", '\u{e3d0}'), // î ("weather_moon_alt_waxing_gibbous_3", '\u{e3d1}'), // î‘ ("weather_moon_alt_waxing_gibbous_4", '\u{e3d2}'), // î’ ("weather_moon_alt_waxing_gibbous_5", '\u{e3d3}'), // î“ ("weather_moon_alt_waxing_gibbous_6", '\u{e3d4}'), // î” ("weather_moon_first_quarter", '\u{e394}'), //  ("weather_moon_full", '\u{e39b}'), //  ("weather_moon_new", '\u{e38d}'), // îŽ ("weather_moon_third_quarter", '\u{e3a2}'), //  ("weather_moon_waning_crescent_1", '\u{e3a3}'), //  ("weather_moon_waning_crescent_2", '\u{e3a4}'), //  ("weather_moon_waning_crescent_3", '\u{e3a5}'), //  ("weather_moon_waning_crescent_4", '\u{e3a6}'), //  ("weather_moon_waning_crescent_5", '\u{e3a7}'), //  ("weather_moon_waning_crescent_6", '\u{e3a8}'), //  ("weather_moon_waning_gibbous_1", '\u{e39c}'), //  ("weather_moon_waning_gibbous_2", '\u{e39d}'), // îŽ ("weather_moon_waning_gibbous_3", '\u{e39e}'), //  ("weather_moon_waning_gibbous_4", '\u{e39f}'), //  ("weather_moon_waning_gibbous_5", '\u{e3a0}'), //  ("weather_moon_waning_gibbous_6", '\u{e3a1}'), //  ("weather_moon_waxing_crescent_1", '\u{e38e}'), //  ("weather_moon_waxing_crescent_2", '\u{e38f}'), // îŽ ("weather_moon_waxing_crescent_3", '\u{e390}'), // îŽ ("weather_moon_waxing_crescent_4", '\u{e391}'), //  ("weather_moon_waxing_crescent_5", '\u{e392}'), //  ("weather_moon_waxing_crescent_6", '\u{e393}'), //  ("weather_moon_waxing_gibbous_1", '\u{e395}'), //  ("weather_moon_waxing_gibbous_2", '\u{e396}'), //  ("weather_moon_waxing_gibbous_3", '\u{e397}'), //  ("weather_moon_waxing_gibbous_4", '\u{e398}'), //  ("weather_moon_waxing_gibbous_5", '\u{e399}'), //  ("weather_moon_waxing_gibbous_6", '\u{e39a}'), //  ("weather_moonrise", '\u{e3c1}'), // î ("weather_moonset", '\u{e3c2}'), // î‚ ("weather_na", '\u{e374}'), // î´ ("weather_night_alt_cloudy", '\u{e37e}'), // î¾ ("weather_night_alt_cloudy_gusts", '\u{e31f}'), //  ("weather_night_alt_cloudy_high", '\u{e377}'), // î· ("weather_night_alt_cloudy_windy", '\u{e320}'), //  ("weather_night_alt_hail", '\u{e321}'), //  ("weather_night_alt_lightning", '\u{e322}'), //  ("weather_night_alt_partly_cloudy", '\u{e379}'), // î¹ ("weather_night_alt_rain", '\u{e325}'), //  ("weather_night_alt_rain_mix", '\u{e323}'), //  ("weather_night_alt_rain_wind", '\u{e324}'), //  ("weather_night_alt_showers", '\u{e326}'), //  ("weather_night_alt_sleet", '\u{e3ac}'), //  ("weather_night_alt_sleet_storm", '\u{e364}'), // î¤ ("weather_night_alt_snow", '\u{e327}'), //  ("weather_night_alt_snow_thunderstorm", '\u{e367}'), // î§ ("weather_night_alt_snow_wind", '\u{e361}'), // î¡ ("weather_night_alt_sprinkle", '\u{e328}'), //  ("weather_night_alt_storm_showers", '\u{e329}'), //  ("weather_night_alt_thunderstorm", '\u{e32a}'), //  ("weather_night_clear", '\u{e32b}'), //  ("weather_night_cloudy", '\u{e32e}'), //  ("weather_night_cloudy_gusts", '\u{e32c}'), //  ("weather_night_cloudy_high", '\u{e378}'), // î¸ ("weather_night_cloudy_windy", '\u{e32d}'), //  ("weather_night_fog", '\u{e346}'), // î† ("weather_night_hail", '\u{e32f}'), //  ("weather_night_lightning", '\u{e330}'), //  ("weather_night_partly_cloudy", '\u{e37b}'), // î» ("weather_night_rain", '\u{e333}'), //  ("weather_night_rain_mix", '\u{e331}'), //  ("weather_night_rain_wind", '\u{e332}'), //  ("weather_night_showers", '\u{e334}'), //  ("weather_night_sleet", '\u{e3ab}'), //  ("weather_night_sleet_storm", '\u{e363}'), // î£ ("weather_night_snow", '\u{e335}'), //  ("weather_night_snow_thunderstorm", '\u{e366}'), // î¦ ("weather_night_snow_wind", '\u{e360}'), // î  ("weather_night_sprinkle", '\u{e336}'), //  ("weather_night_storm_showers", '\u{e337}'), //  ("weather_night_thunderstorm", '\u{e338}'), //  ("weather_rain", '\u{e318}'), //  ("weather_rain_mix", '\u{e316}'), //  ("weather_rain_wind", '\u{e317}'), //  ("weather_raindrop", '\u{e371}'), // î± ("weather_raindrops", '\u{e34a}'), // îŠ ("weather_refresh", '\u{e348}'), // îˆ ("weather_refresh_alt", '\u{e347}'), // î‡ ("weather_sandstorm", '\u{e37a}'), // îº ("weather_showers", '\u{e319}'), //  ("weather_sleet", '\u{e3ad}'), //  ("weather_small_craft_advisory", '\u{e3c4}'), // î„ ("weather_smog", '\u{e36d}'), // î­ ("weather_smoke", '\u{e35c}'), // îœ ("weather_snow", '\u{e31a}'), //  ("weather_snow_wind", '\u{e35e}'), // îž ("weather_snowflake_cold", '\u{e36f}'), // î¯ ("weather_solar_eclipse", '\u{e368}'), // î¨ ("weather_sprinkle", '\u{e31b}'), //  ("weather_stars", '\u{e370}'), // î° ("weather_storm_showers", '\u{e31c}'), //  ("weather_storm_warning", '\u{e3c6}'), // î† ("weather_strong_wind", '\u{e34b}'), // î‹ ("weather_sunrise", '\u{e34c}'), // îŒ ("weather_sunset", '\u{e34d}'), // î ("weather_thermometer", '\u{e350}'), // î ("weather_thermometer_exterior", '\u{e34e}'), // îŽ ("weather_thermometer_internal", '\u{e34f}'), // î ("weather_thunderstorm", '\u{e31d}'), // îŒ ("weather_time_1", '\u{e382}'), //  ("weather_time_2", '\u{e383}'), //  ("weather_time_3", '\u{e384}'), //  ("weather_time_4", '\u{e385}'), //  ("weather_time_5", '\u{e386}'), //  ("weather_time_6", '\u{e387}'), //  ("weather_time_7", '\u{e388}'), //  ("weather_time_8", '\u{e389}'), //  ("weather_time_9", '\u{e38a}'), //  ("weather_time_10", '\u{e38b}'), //  ("weather_time_11", '\u{e38c}'), //  ("weather_time_12", '\u{e381}'), // îŽ ("weather_tornado", '\u{e351}'), // î‘ ("weather_train", '\u{e3c3}'), // îƒ ("weather_tsunami", '\u{e3bd}'), //  ("weather_umbrella", '\u{e37c}'), // î¼ ("weather_volcano", '\u{e3c0}'), // î€ ("weather_wind_beaufort_0", '\u{e3af}'), //  ("weather_wind_beaufort_1", '\u{e3b0}'), //  ("weather_wind_beaufort_2", '\u{e3b1}'), //  ("weather_wind_beaufort_3", '\u{e3b2}'), //  ("weather_wind_beaufort_4", '\u{e3b3}'), //  ("weather_wind_beaufort_5", '\u{e3b4}'), //  ("weather_wind_beaufort_6", '\u{e3b5}'), //  ("weather_wind_beaufort_7", '\u{e3b6}'), //  ("weather_wind_beaufort_8", '\u{e3b7}'), //  ("weather_wind_beaufort_9", '\u{e3b8}'), //  ("weather_wind_beaufort_10", '\u{e3b9}'), //  ("weather_wind_beaufort_11", '\u{e3ba}'), //  ("weather_wind_beaufort_12", '\u{e3bb}'), //  ("weather_wind_direction", '\u{e3a9}'), //  ("weather_wind_east", '\u{e35b}'), // î› ("weather_wind_north", '\u{e35a}'), // îš ("weather_wind_north_east", '\u{e359}'), // î™ ("weather_wind_north_west", '\u{e358}'), // î˜ ("weather_wind_south", '\u{e357}'), // î— ("weather_wind_south_east", '\u{e356}'), // î– ("weather_wind_south_west", '\u{e355}'), // î• ("weather_wind_west", '\u{e354}'), // î” ("weather_windy", '\u{e31e}'), //  ]; termwiz-0.22.0/src/readbuf.rs000064400000000000000000000026541046102023000141620ustar 00000000000000use memmem::{Searcher, TwoWaySearcher}; /// This is a simple, small, read buffer that always has the buffer /// contents available as a contiguous slice. #[derive(Debug)] pub struct ReadBuffer { storage: Vec, } impl ReadBuffer { pub fn new() -> Self { Self { storage: Vec::with_capacity(16), } } pub fn as_slice(&self) -> &[u8] { self.storage.as_slice() } pub fn is_empty(&self) -> bool { self.storage.is_empty() } pub fn len(&self) -> usize { self.storage.len() } /// Mark `len` bytes as consumed, discarding them and shunting /// the contents of the buffer such that the remainder of the /// bytes are available at the front of the buffer. pub fn advance(&mut self, len: usize) { let remain = self.storage.len() - len; self.storage.rotate_left(len); self.storage.truncate(remain); } /// Append the contents of the slice to the read buffer pub fn extend_with(&mut self, slice: &[u8]) { self.storage.extend_from_slice(slice); } /// Search for `needle` starting at `offset`. Returns its offset /// into the buffer if found, else None. pub fn find_subsequence(&self, offset: usize, needle: &[u8]) -> Option { let needle = TwoWaySearcher::new(needle); let haystack = &self.storage[offset..]; needle.search_in(haystack).map(|x| x + offset) } } termwiz-0.22.0/src/render/mod.rs000064400000000000000000000003241046102023000146000ustar 00000000000000pub mod terminfo; #[cfg(windows)] pub mod windows; pub trait RenderTty: std::io::Write { /// Returns the (cols, rows) for the terminal fn get_size_in_cells(&mut self) -> crate::Result<(usize, usize)>; } termwiz-0.22.0/src/render/terminfo.rs000064400000000000000000001424741046102023000156610ustar 00000000000000//! Rendering of Changes using terminfo use crate::caps::{Capabilities, ColorLevel}; use crate::cell::{AttributeChange, Blink, CellAttributes, Intensity, Underline}; use crate::color::{ColorAttribute, ColorSpec}; use crate::escape::csi::{Cursor, Edit, EraseInDisplay, EraseInLine, Sgr, CSI}; use crate::escape::esc::EscCode; use crate::escape::osc::{ITermDimension, ITermFileData, ITermProprietary, OperatingSystemCommand}; use crate::escape::{Esc, OneBased}; use crate::image::{ImageDataType, TextureCoordinate}; use crate::render::RenderTty; use crate::surface::{Change, CursorShape, CursorVisibility, LineAttribute, Position}; use crate::Result; use std::io::Write; use terminfo::{capability as cap, Capability as TermInfoCapability}; pub struct TerminfoRenderer { caps: Capabilities, current_attr: CellAttributes, pending_attr: Option, /* TODO: we should record cursor position, shape and color here * so that we can optimize updating them on screen. */ } impl TerminfoRenderer { pub fn new(caps: Capabilities) -> Self { Self { caps, current_attr: CellAttributes::default(), pending_attr: None, } } fn get_capability<'a, T: TermInfoCapability<'a>>(&'a self) -> Option { self.caps.terminfo_db().and_then(|db| db.get::()) } fn attr_apply(&mut self, func: F) { self.pending_attr = Some(match self.pending_attr.take() { Some(mut attr) => { func(&mut attr); attr } None => { let mut attr = self.current_attr.clone(); func(&mut attr); attr } }); } #[cfg_attr(feature = "cargo-clippy", allow(clippy::cognitive_complexity))] fn flush_pending_attr(&mut self, out: &mut W) -> Result<()> { macro_rules! attr_on { ($cap:ident, $sgr:expr) => {{ let cap = if self.caps.force_terminfo_render_to_use_ansi_sgr() { None } else { self.get_capability::() }; if let Some(attr) = cap { attr.expand().to(out.by_ref())?; } else { write!(out, "{}", CSI::Sgr($sgr))?; } }}; ($sgr:expr) => { write!(out, "{}", CSI::Sgr($sgr))?; }; } if let Some(attr) = self.pending_attr.take() { let mut current_foreground = self.current_attr.foreground(); let mut current_background = self.current_attr.background(); if !attr.attribute_bits_equal(&self.current_attr) { // Updating the attribute bits also resets the colors. current_foreground = ColorAttribute::Default; current_background = ColorAttribute::Default; let sgr = if self.caps.force_terminfo_render_to_use_ansi_sgr() { None } else { self.get_capability::() }; // The SetAttributes capability can only handle single underline and slow blink. if let Some(sgr) = sgr { sgr.expand() .bold(attr.intensity() == Intensity::Bold) .dim(attr.intensity() == Intensity::Half) .underline(attr.underline() == Underline::Single) .blink(attr.blink() == Blink::Slow) .reverse(attr.reverse()) .invisible(attr.invisible()) .to(out.by_ref())?; } else { attr_on!(ExitAttributeMode, Sgr::Reset); match attr.intensity() { Intensity::Bold => attr_on!(EnterBoldMode, Sgr::Intensity(Intensity::Bold)), Intensity::Half => attr_on!(EnterDimMode, Sgr::Intensity(Intensity::Half)), _ => {} } if attr.underline() == Underline::Single { attr_on!(Sgr::Underline(Underline::Single)); } if attr.blink() == Blink::Slow { attr_on!(Sgr::Blink(Blink::Slow)); } if attr.reverse() { attr_on!(EnterReverseMode, Sgr::Inverse(true)); } if attr.invisible() { attr_on!(Sgr::Invisible(true)); } } if attr.underline() == Underline::Double { attr_on!(Sgr::Underline(Underline::Double)); } if attr.blink() == Blink::Rapid { attr_on!(Sgr::Blink(Blink::Rapid)); } if attr.italic() { attr_on!(EnterItalicsMode, Sgr::Italic(true)); } if attr.strikethrough() { attr_on!(Sgr::StrikeThrough(true)); } } let has_true_color = self.caps.color_level() == ColorLevel::TrueColor; // Whether to use terminfo to render 256 colors. If this is too large (ex. 16777216 from xterm-direct), // then setaf expects the index to be true color, in which case we cannot use it to render 256 (or even 16) colors. let terminfo_256_color: i32 = match self.get_capability::() { Some(cap::MaxColors(n)) => { if n > 256 { 0 } else { n } } None => 0, }; if attr.foreground() != current_foreground { match (has_true_color, attr.foreground()) { (true, ColorAttribute::TrueColorWithPaletteFallback(tc, _)) | (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => { write!( out, "{}", CSI::Sgr(Sgr::Foreground(ColorSpec::TrueColor(tc))) )?; } (false, ColorAttribute::TrueColorWithDefaultFallback(_)) | (_, ColorAttribute::Default) => { // Terminfo doesn't define a reset color to default, so // we use the ANSI code. write!(out, "{}", CSI::Sgr(Sgr::Foreground(ColorSpec::Default)))?; } (false, ColorAttribute::TrueColorWithPaletteFallback(_, idx)) | (_, ColorAttribute::PaletteIndex(idx)) => { match self.get_capability::() { Some(set) if (idx as i32) < terminfo_256_color => { set.expand().color(idx).to(out.by_ref())?; } _ => { write!( out, "{}", CSI::Sgr(Sgr::Foreground(ColorSpec::PaletteIndex(idx))) )?; } } } } } if attr.background() != current_background { match (has_true_color, attr.background()) { (true, ColorAttribute::TrueColorWithPaletteFallback(tc, _)) | (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => { write!( out, "{}", CSI::Sgr(Sgr::Background(ColorSpec::TrueColor(tc))) )?; } (false, ColorAttribute::TrueColorWithDefaultFallback(_)) | (_, ColorAttribute::Default) => { // Terminfo doesn't define a reset color to default, so // we use the ANSI code. write!(out, "{}", CSI::Sgr(Sgr::Background(ColorSpec::Default)))?; } (false, ColorAttribute::TrueColorWithPaletteFallback(_, idx)) | (_, ColorAttribute::PaletteIndex(idx)) => { match self.get_capability::() { Some(set) if (idx as i32) < terminfo_256_color => { set.expand().color(idx).to(out.by_ref())?; } _ => { write!( out, "{}", CSI::Sgr(Sgr::Background(ColorSpec::PaletteIndex(idx))) )?; } } } } } if self.caps.hyperlinks() { if let Some(link) = attr.hyperlink() { let osc = OperatingSystemCommand::SetHyperlink(Some((**link).clone())); write!(out, "{}", osc)?; } else if self.current_attr.hyperlink().is_some() { // Close out the old hyperlink let osc = OperatingSystemCommand::SetHyperlink(None); write!(out, "{}", osc)?; } } self.current_attr = attr; } Ok(()) } fn cursor_up(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Up(n)))?; } } Ok(()) } fn cursor_down(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Down(n)))?; } } Ok(()) } fn cursor_y_relative(&mut self, y: isize, out: &mut W) -> Result<()> { if y > 0 { self.cursor_down(y as u32, out) } else { self.cursor_up(-y as u32, out) } } fn cursor_left(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Left(n)))?; } } Ok(()) } fn cursor_right(&mut self, n: u32, out: &mut W) -> Result<()> { if n > 0 { if let Some(attr) = self.get_capability::() { attr.expand().count(n).to(out.by_ref())?; } else { write!(out, "{}", CSI::Cursor(Cursor::Right(n)))?; } } Ok(()) } fn cursor_x_relative(&mut self, x: isize, out: &mut W) -> Result<()> { if x > 0 { self.cursor_right(x as u32, out) } else { self.cursor_left(-x as u32, out) } } fn move_cursor_absolute( &mut self, x: u32, y: u32, out: &mut W, ) -> Result<()> { if x == 0 && y == 0 { if let Some(attr) = self.get_capability::() { attr.expand().to(out.by_ref())?; return Ok(()); } } if let Some(attr) = self.get_capability::() { // terminfo expansion automatically converts coordinates to 1-based, // so we can pass in the 0-based coordinates as-is attr.expand().x(x).y(y).to(out.by_ref())?; } else { // We need to manually convert to 1-based as the CSI representation // requires it and there's no automatic conversion. write!( out, "{}", CSI::Cursor(Cursor::Position { line: OneBased::from_zero_based(x), col: OneBased::from_zero_based(y), }) )?; } Ok(()) } #[cfg_attr( feature = "cargo-clippy", allow(clippy::cyclomatic_complexity, clippy::cognitive_complexity) )] pub fn render_to( &mut self, changes: &[Change], out: &mut W, ) -> Result<()> { macro_rules! record { ($accesor:ident, $value:expr) => { self.attr_apply(|attr| { attr.$accesor(*$value); }); }; } for change in changes { match change { Change::ClearScreen(color) => { // ClearScreen implicitly resets all to default let defaults = CellAttributes::default().set_background(*color).clone(); if self.current_attr != defaults { self.pending_attr = Some(defaults); self.flush_pending_attr(out)?; } self.pending_attr = None; if self.current_attr.background() == ColorAttribute::Default || self.caps.bce() { // The erase operation respects "background color erase", // or we're clearing to the default background color, so we can // simply emit a clear screen op. if let Some(clr) = self.get_capability::() { clr.expand().to(out.by_ref())?; } else { self.move_cursor_absolute(0, 0, out)?; write!( out, "{}", CSI::Edit(Edit::EraseInDisplay(EraseInDisplay::EraseDisplay)) )?; } } else { // We're setting the background to a specific color, so we get to // paint the whole thing. self.move_cursor_absolute(0, 0, out)?; let (cols, rows) = out.get_size_in_cells()?; let num_spaces = cols * rows; let mut buf = Vec::with_capacity(num_spaces); buf.resize(num_spaces, b' '); out.write_all(buf.as_slice())?; } } Change::ClearToEndOfLine(color) => { // ClearScreen implicitly resets all to default let defaults = CellAttributes::default().set_background(*color).clone(); if self.current_attr != defaults { self.pending_attr = Some(defaults); self.flush_pending_attr(out)?; } self.pending_attr = None; // FIXME: this doesn't behave correctly for terminals without bce. // If we knew the current cursor position, we would be able to // emit the correctly colored background for that case. if let Some(clr) = self.get_capability::() { clr.expand().to(out.by_ref())?; } else { write!( out, "{}", CSI::Edit(Edit::EraseInLine(EraseInLine::EraseToEndOfLine)) )?; } } Change::ClearToEndOfScreen(color) => { // ClearScreen implicitly resets all to default let defaults = CellAttributes::default().set_background(*color).clone(); if self.current_attr != defaults { self.pending_attr = Some(defaults); self.flush_pending_attr(out)?; } self.pending_attr = None; // FIXME: this doesn't behave correctly for terminals without bce. // If we knew the current cursor position, we would be able to // emit the correctly colored background for that case. if let Some(clr) = self.get_capability::() { clr.expand().to(out.by_ref())?; } else { write!( out, "{}", CSI::Edit(Edit::EraseInDisplay(EraseInDisplay::EraseToEndOfDisplay)) )?; } } Change::Attribute(AttributeChange::Intensity(value)) => { record!(set_intensity, value); } Change::Attribute(AttributeChange::Italic(value)) => { record!(set_italic, value); } Change::Attribute(AttributeChange::Reverse(value)) => { record!(set_reverse, value); } Change::Attribute(AttributeChange::StrikeThrough(value)) => { record!(set_strikethrough, value); } Change::Attribute(AttributeChange::Blink(value)) => { record!(set_blink, value); } Change::Attribute(AttributeChange::Invisible(value)) => { record!(set_invisible, value); } Change::Attribute(AttributeChange::Underline(value)) => { record!(set_underline, value); } Change::Attribute(AttributeChange::Foreground(col)) => { self.attr_apply(|attr| { attr.set_foreground(*col); }); } Change::Attribute(AttributeChange::Background(col)) => { self.attr_apply(|attr| { attr.set_background(*col); }); } Change::Attribute(AttributeChange::Hyperlink(link)) => { self.attr_apply(|attr| { attr.set_hyperlink(link.clone()); }); } Change::AllAttributes(all) => { self.pending_attr = Some(all.clone()); } Change::Text(text) => { self.flush_pending_attr(out)?; out.by_ref().write_all(text.as_bytes())?; } Change::CursorPosition { x, y } => { // Note: we use `cursor_up(screen_height)` to move the cursor all the way to // the top of the screen when we need to absolutely position only y. match (x, y) { (Position::Relative(0), Position::Relative(0)) => {} (Position::Absolute(0), Position::Relative(1)) => { out.by_ref().write_all(b"\r\n")?; } (Position::Absolute(x), Position::Relative(y)) => { self.cursor_y_relative(*y, out)?; out.by_ref().write_all(b"\r")?; self.cursor_right(*x as u32, out)?; } (Position::Relative(x), Position::EndRelative(y)) => { let (_cols, rows) = out.get_size_in_cells()?; self.cursor_up(rows as u32, out)?; self.cursor_down(rows.saturating_sub(y + 1) as u32, out)?; self.cursor_x_relative(*x, out)?; } (Position::Relative(x), Position::Relative(y)) => { self.cursor_y_relative(*y, out)?; self.cursor_x_relative(*x, out)?; } (Position::EndRelative(x), Position::Relative(y)) => { self.cursor_y_relative(*y, out)?; let (cols, _rows) = out.get_size_in_cells()?; out.by_ref().write_all(b"\r")?; self.cursor_right(cols.saturating_sub(x + 1) as u32, out)?; } (Position::Absolute(x), Position::Absolute(y)) => { self.move_cursor_absolute(*x as u32, *y as u32, out)?; } (Position::Absolute(x), Position::EndRelative(y)) => { let (_cols, rows) = out.get_size_in_cells()?; self.move_cursor_absolute( *x as u32, rows.saturating_sub(y + 1) as u32, out, )?; } (Position::EndRelative(x), Position::EndRelative(y)) => { let (cols, rows) = out.get_size_in_cells()?; self.move_cursor_absolute( cols.saturating_sub(x + 1) as u32, rows.saturating_sub(y + 1) as u32, out, )?; } (Position::Relative(x), Position::Absolute(y)) => { let (_cols, rows) = out.get_size_in_cells()?; self.cursor_up(rows as u32, out)?; self.cursor_down(*y as u32, out)?; self.cursor_x_relative(*x, out)?; } (Position::EndRelative(x), Position::Absolute(y)) => { let (cols, _rows) = out.get_size_in_cells()?; self.move_cursor_absolute( cols.saturating_sub(x + 1) as u32, *y as u32, out, )?; } } } Change::CursorColor(_color) => { // TODO: this isn't spec'd by terminfo, but some terminals // support it. Add this to capabilities? } Change::CursorShape(shape) => match shape { CursorShape::Default => { if let Some(normal) = self.get_capability::() { normal.expand().to(out.by_ref())?; } if let Some(reset) = self.get_capability::() { reset.expand().to(out.by_ref())?; } } _ => { let param = match shape { CursorShape::Default => unreachable!(), CursorShape::BlinkingBlock => 1, CursorShape::SteadyBlock => 2, CursorShape::BlinkingUnderline => 3, CursorShape::SteadyUnderline => 4, CursorShape::BlinkingBar => 5, CursorShape::SteadyBar => 6, }; if let Some(set) = self.get_capability::() { set.expand().kind(param).to(out.by_ref())?; } } }, Change::CursorVisibility(visibility) => match visibility { CursorVisibility::Visible => { if let Some(show) = self.get_capability::() { show.expand().to(out.by_ref())?; } } CursorVisibility::Hidden => { if let Some(hide) = self.get_capability::() { hide.expand().to(out.by_ref())?; } } }, Change::Image(image) => { if self.caps.iterm2_image() { let data = if image.top_left == TextureCoordinate::new_f32(0.0, 0.0) && image.bottom_right == TextureCoordinate::new_f32(1.0, 1.0) { // The whole image is requested, so we can send the // original image bytes over match &*image.image.data() { ImageDataType::EncodedFile(data) => data.to_vec(), ImageDataType::EncodedLease(lease) => lease.get_data()?, ImageDataType::AnimRgba8 { .. } | ImageDataType::Rgba8 { .. } => { unimplemented!() } } } else { // TODO: slice out the requested region of the image, // and encode as a PNG. unimplemented!(); }; let file = ITermFileData { name: None, size: Some(data.len()), width: ITermDimension::Cells(image.width as i64), height: ITermDimension::Cells(image.height as i64), preserve_aspect_ratio: true, inline: true, do_not_move_cursor: false, data, }; let osc = OperatingSystemCommand::ITermProprietary(ITermProprietary::File( Box::new(file), )); write!(out, "{}", osc)?; // TODO: } else if self.caps.sixel() { } else { // Blank out the cells and move the cursor to the right spot for y in 0..image.height { for _ in 0..image.width { write!(out, " ")?; } if y != image.height - 1 { writeln!(out)?; self.cursor_left(image.width as u32, out)?; } } self.cursor_up(image.height as u32, out)?; } } Change::ScrollRegionUp { first_row, region_size, scroll_count, } => { if *region_size > 0 { if let Some(csr) = self.get_capability::() { let top = *first_row as u32; let bottom = (*first_row + *region_size - 1) as u32; let scroll_count = *scroll_count as u32; csr.expand().top(top).bottom(bottom).to(out.by_ref())?; if scroll_count > 0 { if let Some(scroll) = self.get_capability::() { scroll.expand().count(scroll_count).to(out.by_ref())? } else { let scroll = self.get_capability::(); let set_position = self.get_capability::(); if let (Some(scroll), Some(set_position)) = (scroll, set_position) { set_position.expand().x(0).y(bottom).to(out.by_ref())?; for _ in 0..scroll_count { scroll.expand().to(out.by_ref())? } } } } } } } Change::ScrollRegionDown { first_row, region_size, scroll_count, } => { if *region_size > 0 { if let Some(csr) = self.get_capability::() { let top = *first_row as u32; let bottom = (*first_row + *region_size - 1) as u32; let scroll_count = *scroll_count as u32; csr.expand().top(top).bottom(bottom).to(out.by_ref())?; if scroll_count > 0 { if let Some(scroll) = self.get_capability::() { scroll.expand().count(scroll_count).to(out.by_ref())? } else { let scroll = self.get_capability::(); let set_position = self.get_capability::(); if let (Some(scroll), Some(set_position)) = (scroll, set_position) { set_position.expand().x(0).y(top).to(out.by_ref())?; for _ in 0..scroll_count { scroll.expand().to(out.by_ref())? } } } } } } } Change::Title(text) => { let osc = OperatingSystemCommand::SetWindowTitle(text.to_string()); write!(out, "{}", osc)?; } Change::LineAttribute(attr) => { let esc = Esc::Code(match attr { LineAttribute::DoubleHeightTopHalfLine => { EscCode::DecDoubleHeightTopHalfLine } LineAttribute::DoubleHeightBottomHalfLine => { EscCode::DecDoubleHeightBottomHalfLine } LineAttribute::DoubleWidthLine => EscCode::DecDoubleWidthLine, LineAttribute::SingleWidthLine => EscCode::DecSingleWidthLine, }); write!(out, "{esc}")?; } } } self.flush_pending_attr(out)?; out.flush()?; Ok(()) } } #[cfg(all(test, unix))] mod test { use super::*; use crate::bail; use crate::caps::ProbeHints; use crate::color::{AnsiColor, ColorAttribute}; use crate::escape::parser::Parser; use crate::escape::{Action, Esc, EscCode}; use crate::input::InputEvent; use crate::terminal::unix::{Purge, SetAttributeWhen, UnixTty}; use crate::terminal::{cast, ScreenSize, Terminal, TerminalWaker}; use libc::winsize; use std::io::{Error as IoError, ErrorKind, Read, Result as IoResult, Write}; use std::mem; use std::time::Duration; use terminfo; use termios::Termios; /// Return Capabilities loaded from the included xterm terminfo data fn xterm_terminfo() -> Capabilities { xterm_terminfo_with_hints(ProbeHints::default()) } fn xterm_terminfo_with_hints(hints: ProbeHints) -> Capabilities { // Load our own compiled data so that the tests have an // environment that doesn't vary machine by machine. let data = include_bytes!("../../data/xterm-256color"); Capabilities::new_with_hints(hints.terminfo_db(Some( terminfo::Database::from_buffer(data.as_ref()).unwrap(), ))) .unwrap() } fn no_terminfo_all_enabled() -> Capabilities { Capabilities::new_with_hints(ProbeHints::default().color_level(Some(ColorLevel::TrueColor))) .unwrap() } struct FakeTty { buf: Vec, size: winsize, termios: Termios, } impl FakeTty { fn new_with_size(width: usize, height: usize) -> Self { let size = winsize { ws_col: cast(width).unwrap(), ws_row: cast(height).unwrap(), ws_xpixel: 0, ws_ypixel: 0, }; let buf = Vec::new(); Self { size, buf, termios: unsafe { mem::zeroed() }, } } } impl RenderTty for FakeTty { fn get_size_in_cells(&mut self) -> Result<(usize, usize)> { Ok((self.size.ws_col as usize, self.size.ws_row as usize)) } } impl UnixTty for FakeTty { fn get_size(&mut self) -> Result { Ok(self.size.clone()) } fn set_size(&mut self, size: winsize) -> Result<()> { self.size = size.clone(); Ok(()) } fn get_termios(&mut self) -> Result { Ok(self.termios.clone()) } fn set_termios(&mut self, termios: &Termios, _when: SetAttributeWhen) -> Result<()> { self.termios = termios.clone(); Ok(()) } /// Waits until all written data has been transmitted. fn drain(&mut self) -> Result<()> { Ok(()) } fn purge(&mut self, _purge: Purge) -> Result<()> { Ok(()) } } impl Read for FakeTty { fn read(&mut self, _buf: &mut [u8]) -> std::result::Result { Err(IoError::new(ErrorKind::Other, "not implemented")) } } impl Write for FakeTty { fn write(&mut self, buf: &[u8]) -> IoResult { self.buf.write(buf) } fn flush(&mut self) -> IoResult<()> { self.buf.flush() } } struct FakeTerm { write: FakeTty, renderer: TerminfoRenderer, } impl FakeTerm { fn new(caps: Capabilities) -> Self { Self::new_with_size(caps, 80, 24) } fn new_with_size(caps: Capabilities, width: usize, height: usize) -> Self { let write = FakeTty::new_with_size(width, height); let renderer = TerminfoRenderer::new(caps); Self { write, renderer } } fn parse(&self) -> Vec { let mut p = Parser::new(); p.parse_as_vec(&self.write.buf) } } impl Terminal for FakeTerm { fn set_raw_mode(&mut self) -> Result<()> { bail!("not implemented"); } fn set_cooked_mode(&mut self) -> Result<()> { bail!("not implemented"); } fn enter_alternate_screen(&mut self) -> Result<()> { bail!("not implemented"); } fn exit_alternate_screen(&mut self) -> Result<()> { bail!("not implemented"); } fn render(&mut self, changes: &[Change]) -> Result<()> { self.renderer.render_to(changes, &mut self.write) } fn get_screen_size(&mut self) -> Result { let size = self.write.get_size()?; Ok(ScreenSize { rows: cast(size.ws_row)?, cols: cast(size.ws_col)?, xpixel: cast(size.ws_xpixel)?, ypixel: cast(size.ws_ypixel)?, }) } fn set_screen_size(&mut self, size: ScreenSize) -> Result<()> { let size = winsize { ws_row: cast(size.rows)?, ws_col: cast(size.cols)?, ws_xpixel: cast(size.xpixel)?, ws_ypixel: cast(size.ypixel)?, }; self.write.set_size(size) } fn flush(&mut self) -> Result<()> { Ok(()) } fn poll_input(&mut self, _wait: Option) -> Result> { bail!("not implemented"); } fn waker(&self) -> TerminalWaker { unimplemented!(); } } #[test] fn empty_render() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[]).unwrap(); assert_eq!("", String::from_utf8(out.write.buf).unwrap()); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn basic_text() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[Change::Text("foo".into())]).unwrap(); assert_eq!("foo", String::from_utf8(out.write.buf).unwrap()); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn bold_text() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Text("not ".into()), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("foo".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Print('n'), Action::Print('o'), Action::Print('t'), Action::Print(' '), Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('f'), Action::Print('o'), Action::Print('o'), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .clone() ); } #[test] // Sanity that force_terminfo_render_to_use_ansi_sgr does something. fn bold_text_force_ansi_sgr() { let mut out = FakeTerm::new(xterm_terminfo_with_hints( ProbeHints::default().force_terminfo_render_to_use_ansi_sgr(Some(true)), )); out.render(&[ Change::Text("not ".into()), AttributeChange::Intensity(Intensity::Bold).into(), Change::Text("foo".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ // Same as bold_text() above, but without the "(B" from srg/sgr0. Action::Print('n'), Action::Print('o'), Action::Print('t'), Action::Print(' '), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('f'), Action::Print('o'), Action::Print('o'), ], ); } #[test] fn clear_screen() { let mut out = FakeTerm::new_with_size(xterm_terminfo(), 4, 3); out.render(&[Change::ClearScreen(ColorAttribute::default())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), Action::CSI(CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseDisplay, ))), ] ); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn clear_screen_bce() { let mut out = FakeTerm::new_with_size(xterm_terminfo(), 4, 3); out.render(&[Change::ClearScreen(AnsiColor::Maroon.into())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Background(AnsiColor::Maroon.into()))), Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), Action::CSI(CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseDisplay, ))), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_background(AnsiColor::Maroon) .clone() ); } #[test] fn clear_screen_no_terminfo() { let mut out = FakeTerm::new_with_size(no_terminfo_all_enabled(), 4, 3); out.render(&[Change::ClearScreen(ColorAttribute::default())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), Action::CSI(CSI::Edit(Edit::EraseInDisplay( EraseInDisplay::EraseDisplay, ))), ] ); assert_eq!(out.renderer.current_attr, CellAttributes::default()); } #[test] fn clear_screen_bce_no_terminfo() { let mut out = FakeTerm::new_with_size(no_terminfo_all_enabled(), 4, 3); out.render(&[Change::ClearScreen(AnsiColor::Maroon.into())]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Background(AnsiColor::Maroon.into()))), Action::CSI(CSI::Cursor(Cursor::Position { line: OneBased::new(1), col: OneBased::new(1) })), // bce is not known to be available, so we emit a bunch of spaces. // TODO: could we use ECMA-48 REP for this? Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), Action::Print(' '), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_background(AnsiColor::Maroon) .clone() ); } #[test] fn bold_text_no_terminfo() { let mut out = FakeTerm::new(no_terminfo_all_enabled()); out.render(&[ Change::Text("not ".into()), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("foo".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Print('n'), Action::Print('o'), Action::Print('t'), Action::Print(' '), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::Print('f'), Action::Print('o'), Action::Print('o'), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .clone() ); } #[test] fn red_bold_text() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("red".into()), Change::Attribute(AttributeChange::Foreground(AnsiColor::Red.into())), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), // Note that the render code rearranges (red,bold) to (bold,red) Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('r'), Action::Print('e'), Action::Print('d'), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Red.into()))), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .set_foreground(AnsiColor::Red) .clone() ); } #[test] fn red_bold_text_no_terminfo() { let mut out = FakeTerm::new(no_terminfo_all_enabled()); out.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("red".into()), Change::Attribute(AttributeChange::Foreground(AnsiColor::Red.into())), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Reset)), // Note that the render code rearranges (red,bold) to (bold,red) Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('r'), Action::Print('e'), Action::Print('d'), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Red.into()))), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_intensity(Intensity::Bold) .set_foreground(AnsiColor::Red) .clone() ); } #[test] fn color_after_attribute_change() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Attribute(AttributeChange::Foreground(AnsiColor::Maroon.into())), Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("red".into()), Change::Attribute(AttributeChange::Intensity(Intensity::Normal)), Change::Text("2".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), // Note that the render code rearranges (red,bold) to (bold,red) Action::CSI(CSI::Sgr(Sgr::Intensity(Intensity::Bold))), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('r'), Action::Print('e'), Action::Print('d'), // Turning off bold is translated into reset and set red again Action::Esc(Esc::Code(EscCode::AsciiCharacterSetG0)), Action::CSI(CSI::Sgr(Sgr::Reset)), Action::CSI(CSI::Sgr(Sgr::Foreground(AnsiColor::Maroon.into()))), Action::Print('2'), ] ); assert_eq!( out.renderer.current_attr, CellAttributes::default() .set_foreground(AnsiColor::Maroon) .clone() ); } #[test] fn truecolor() { let mut out = FakeTerm::new(xterm_terminfo()); out.render(&[ Change::Attribute(AttributeChange::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), )), Change::Text("A".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), ))), Action::Print('A'), ] ); } #[test] fn truecolor_no_terminfo() { let mut out = FakeTerm::new(no_terminfo_all_enabled()); out.render(&[ Change::Attribute(AttributeChange::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), )), Change::Text("A".into()), ]) .unwrap(); let result = out.parse(); assert_eq!( result, vec![ Action::CSI(CSI::Sgr(Sgr::Foreground( ColorSpec::TrueColor((255, 128, 64).into()).into(), ))), Action::Print('A'), ] ); } } termwiz-0.22.0/src/render/windows.rs000064400000000000000000000365771046102023000155360ustar 00000000000000//! A Renderer for windows consoles use crate::caps::Capabilities; use crate::cell::{AttributeChange, CellAttributes, Underline}; use crate::color::{AnsiColor, ColorAttribute}; use crate::surface::{Change, Position}; use crate::terminal::windows::ConsoleOutputHandle; use crate::Result; use num_traits::FromPrimitive; use std::io::Write; use winapi::shared::minwindef::WORD; use winapi::um::wincon::{ BACKGROUND_BLUE, BACKGROUND_GREEN, BACKGROUND_INTENSITY, BACKGROUND_RED, CHAR_INFO, COMMON_LVB_REVERSE_VIDEO, COMMON_LVB_UNDERSCORE, FOREGROUND_BLUE, FOREGROUND_GREEN, FOREGROUND_INTENSITY, FOREGROUND_RED, }; pub struct WindowsConsoleRenderer { pending_attr: CellAttributes, } impl WindowsConsoleRenderer { pub fn new(_caps: Capabilities) -> Self { Self { pending_attr: CellAttributes::default(), } } } fn to_attr_word(attr: &CellAttributes) -> u16 { macro_rules! ansi_colors_impl { ($idx:expr, $default:ident, $red:ident, $green:ident, $blue:ident, $bright:ident, $( ($variant:ident, $bits:expr) ),*) =>{ match FromPrimitive::from_u8($idx).unwrap_or(AnsiColor::$default) { $( AnsiColor::$variant => $bits, )* } } } macro_rules! ansi_colors { ($idx:expr, $default:ident, $red:ident, $green:ident, $blue:ident, $bright:ident) => { ansi_colors_impl!( $idx, $default, $red, $green, $blue, $bright, (Black, 0), (Maroon, $red), (Green, $green), (Olive, $red | $green), (Navy, $blue), (Purple, $red | $blue), (Teal, $green | $blue), (Silver, $red | $green | $blue), (Grey, $bright), (Red, $bright | $red), (Lime, $bright | $green), (Yellow, $bright | $red | $green), (Blue, $bright | $blue), (Fuchsia, $bright | $red | $blue), (Aqua, $bright | $green | $blue), (White, $bright | $red | $green | $blue) ) }; } let fg = match attr.foreground() { ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => { FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN } ColorAttribute::TrueColorWithPaletteFallback(_, idx) | ColorAttribute::PaletteIndex(idx) => ansi_colors!( idx, White, FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_BLUE, FOREGROUND_INTENSITY ), }; let bg = match attr.background() { ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => 0, ColorAttribute::TrueColorWithPaletteFallback(_, idx) | ColorAttribute::PaletteIndex(idx) => ansi_colors!( idx, Black, BACKGROUND_RED, BACKGROUND_GREEN, BACKGROUND_BLUE, BACKGROUND_INTENSITY ), }; let reverse = if attr.reverse() { COMMON_LVB_REVERSE_VIDEO } else { 0 }; let underline = if attr.underline() != Underline::None { COMMON_LVB_UNDERSCORE } else { 0 }; bg | fg | reverse | underline } struct ScreenBuffer { buf: Vec, dirty: bool, rows: usize, cols: usize, cursor_x: usize, cursor_y: usize, pending_attr: WORD, } impl ScreenBuffer { fn cursor_idx(&self) -> usize { let idx = (self.cursor_y * self.cols) + self.cursor_x; assert!( idx < self.rows * self.cols, "idx={}, cursor:({},{}) rows={}, cols={}.", idx, self.cursor_x, self.cursor_y, self.rows, self.cols ); idx } fn fill(&mut self, c: char, attr: WORD, x: usize, y: usize, num_elements: usize) -> usize { let idx = (y * self.cols) + x; let max = self.rows * self.cols; let end = (idx + num_elements).min(max); let c = c as u16; for cell in &mut self.buf[idx..end] { cell.Attributes = attr; unsafe { *cell.Char.UnicodeChar_mut() = c; } } self.dirty = true; end } fn do_cursor_y_scroll(&mut self, out: &mut B) -> Result<()> { if self.cursor_y >= self.rows { self.dirty = true; let lines_to_scroll = self.cursor_y.saturating_sub(self.rows) + 1; self.scroll(0, self.rows, -1 * lines_to_scroll as isize, out)?; self.dirty = true; self.cursor_y -= lines_to_scroll; assert!(self.cursor_y < self.rows); } Ok(()) } fn set_cursor( &mut self, x: usize, y: usize, out: &mut B, ) -> Result<()> { self.cursor_x = x; self.cursor_y = y; self.do_cursor_y_scroll(out)?; // Make sure we mark dirty after we've scrolled! self.dirty = true; assert!(self.cursor_x < self.cols); assert!(self.cursor_y < self.rows); Ok(()) } fn write_text( &mut self, t: &str, attr: WORD, out: &mut B, ) -> Result<()> { for c in t.chars() { match c { '\r' => { self.cursor_x = 0; } '\n' => { self.cursor_y += 1; self.do_cursor_y_scroll(out)?; } c => { if self.cursor_x == self.cols { self.cursor_y += 1; self.cursor_x = 0; } self.do_cursor_y_scroll(out)?; let idx = self.cursor_idx(); let cell = &mut self.buf[idx]; cell.Attributes = attr; unsafe { *cell.Char.UnicodeChar_mut() = c as u16; } self.cursor_x += 1; self.dirty = true; } } } Ok(()) } fn flush(&mut self, out: &mut B) -> Result<()> { self.flush_screen(out)?; let info = out.get_buffer_info()?; out.set_cursor_position( self.cursor_x as i16, self.cursor_y as i16 + info.srWindow.Top, )?; out.set_attr(self.pending_attr)?; out.flush()?; Ok(()) } fn flush_screen(&mut self, out: &mut B) -> Result<()> { if self.dirty { out.flush()?; out.set_buffer_contents(&self.buf)?; out.flush()?; self.dirty = false; } Ok(()) } fn reread_buffer(&mut self, out: &mut B) -> Result<()> { self.buf = out.get_buffer_contents()?; self.dirty = false; Ok(()) } fn scroll( &mut self, first_row: usize, region_size: usize, scroll_count: isize, out: &mut B, ) -> Result<()> { if region_size > 0 && scroll_count != 0 { self.flush_screen(out)?; let info = out.get_buffer_info()?; // Scroll the full width of the window, always. let left = 0; let right = info.dwSize.X - 1; // We're only doing vertical scrolling let dx = 0; let dy = scroll_count as i16; if first_row == 0 && region_size == self.rows { // We're scrolling the whole screen, so let it scroll // up into the scrollback out.set_viewport( info.srWindow.Left, info.srWindow.Top - dy, info.srWindow.Right, info.srWindow.Bottom - dy, )?; } else { // We're just scrolling a region within the window let top = info.srWindow.Top + first_row as i16; let bottom = top + region_size.saturating_sub(1) as i16; out.scroll_region(left, top, right, bottom, dx, dy, self.pending_attr)?; } self.reread_buffer(out)?; } Ok(()) } } impl WindowsConsoleRenderer { pub fn render_to( &mut self, changes: &[Change], out: &mut B, ) -> Result<()> { out.flush()?; let info = out.get_buffer_info()?; let cols = info.dwSize.X as usize; let rows = 1 + info.srWindow.Bottom as usize - info.srWindow.Top as usize; let mut buffer = ScreenBuffer { buf: out.get_buffer_contents()?, cursor_x: info.dwCursorPosition.X as usize, cursor_y: (info.dwCursorPosition.Y as usize).saturating_sub(info.srWindow.Top as usize), dirty: false, rows, cols, pending_attr: to_attr_word(&CellAttributes::default()), }; for change in changes { match change { Change::ClearScreen(color) => { let attr = CellAttributes::default() .set_background(color.clone()) .clone(); buffer.fill(' ', to_attr_word(&attr), 0, 0, cols * rows); buffer.set_cursor(0, 0, out)?; } Change::ClearToEndOfLine(color) => { let attr = CellAttributes::default() .set_background(color.clone()) .clone(); buffer.fill( ' ', to_attr_word(&attr), buffer.cursor_x, buffer.cursor_y, cols.saturating_sub(buffer.cursor_x), ); } Change::ClearToEndOfScreen(color) => { let attr = CellAttributes::default() .set_background(color.clone()) .clone(); buffer.fill( ' ', to_attr_word(&attr), buffer.cursor_x, buffer.cursor_y, cols * rows, ); } Change::Text(text) => { buffer.write_text(&text, to_attr_word(&self.pending_attr), out)?; } Change::CursorPosition { x, y } => { let x = match x { Position::Absolute(x) => *x as usize, Position::Relative(delta) => { (buffer.cursor_x as isize).saturating_sub(-*delta) as usize } Position::EndRelative(delta) => cols.saturating_sub(*delta), }; // For vertical cursor movement, we constrain the movement to // the viewport. let y = match y { Position::Absolute(y) => *y as usize, Position::Relative(delta) => { (buffer.cursor_y as isize).saturating_sub(-*delta) as usize } Position::EndRelative(delta) => rows.saturating_sub(*delta), }; buffer.set_cursor(x, y, out)?; } Change::Attribute(AttributeChange::Intensity(value)) => { self.pending_attr.set_intensity(*value); } Change::Attribute(AttributeChange::Italic(value)) => { self.pending_attr.set_italic(*value); } Change::Attribute(AttributeChange::Reverse(value)) => { self.pending_attr.set_reverse(*value); } Change::Attribute(AttributeChange::StrikeThrough(value)) => { self.pending_attr.set_strikethrough(*value); } Change::Attribute(AttributeChange::Blink(value)) => { self.pending_attr.set_blink(*value); } Change::Attribute(AttributeChange::Invisible(value)) => { self.pending_attr.set_invisible(*value); } Change::Attribute(AttributeChange::Underline(value)) => { self.pending_attr.set_underline(*value); } Change::Attribute(AttributeChange::Foreground(col)) => { self.pending_attr.set_foreground(*col); } Change::Attribute(AttributeChange::Background(col)) => { self.pending_attr.set_background(*col); } Change::Attribute(AttributeChange::Hyperlink(link)) => { self.pending_attr.set_hyperlink(link.clone()); } Change::AllAttributes(all) => { self.pending_attr = all.clone(); } Change::CursorColor(_color) => {} Change::CursorShape(_shape) => {} Change::CursorVisibility(_visibility) => {} Change::Image(image) => { // Images are not supported, so just blank out the cells and // move the cursor to the right spot for y in 0..image.height { buffer.fill( ' ', 0, buffer.cursor_x, y + buffer.cursor_y, image.width as usize, ); } buffer.set_cursor(buffer.cursor_x + image.width, buffer.cursor_y, out)?; } Change::ScrollRegionUp { first_row, region_size, scroll_count, } => { buffer.scroll(*first_row, *region_size, -1 * *scroll_count as isize, out)?; } Change::ScrollRegionDown { first_row, region_size, scroll_count, } => { buffer.scroll(*first_row, *region_size, *scroll_count as isize, out)?; } Change::Title(_text) => { // Don't actually render this for now. // The primary purpose of Change::Title at the time of // writing is to transfer tab titles across domains // in the wezterm multiplexer model. It's not clear // that it would be a good idea to unilaterally output // eg: a title change escape sequence here in the // renderer because we might be composing multiple widgets // together, each with its own title. } Change::LineAttribute(_) => { // Ignore line attributes } } } buffer.flush(out)?; Ok(()) } } termwiz-0.22.0/src/surface/change.rs000064400000000000000000000265751046102023000154370ustar 00000000000000use crate::cell::{unicode_column_width, AttributeChange, CellAttributes}; use crate::color::ColorAttribute; pub use crate::image::{ImageData, TextureCoordinate}; use crate::surface::{CursorShape, CursorVisibility, Position}; use finl_unicode::grapheme_clusters::Graphemes; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::sync::Arc; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub enum LineAttribute { DoubleHeightTopHalfLine, DoubleHeightBottomHalfLine, DoubleWidthLine, SingleWidthLine, } /// `Change` describes an update operation to be applied to a `Surface`. /// Changes to the active attributes (color, style), moving the cursor /// and outputting text are examples of some of the values. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub enum Change { /// Change a single attribute Attribute(AttributeChange), /// Change all possible attributes to the given set of values AllAttributes(CellAttributes), /// Add printable text. /// Control characters are rendered inert by transforming them /// to space. CR and LF characters are interpreted by moving /// the cursor position. CR moves the cursor to the start of /// the line and LF moves the cursor down to the next line. /// You typically want to use both together when sending in /// a line break. Text(String), /// Clear the screen to the specified color. /// Implicitly clears all attributes prior to clearing the screen. /// Moves the cursor to the home position (top left). ClearScreen(ColorAttribute), /// Clear from the current cursor X position to the rightmost /// edge of the screen. The background color is set to the /// provided color. The cursor position remains unchanged. ClearToEndOfLine(ColorAttribute), /// Clear from the current cursor X position to the rightmost /// edge of the screen on the current line. Clear all of the /// lines below the current cursor Y position. The background /// color is set ot the provided color. The cursor position /// remains unchanged. ClearToEndOfScreen(ColorAttribute), /// Move the cursor to the specified `Position`. CursorPosition { x: Position, y: Position }, /// Change the cursor color. CursorColor(ColorAttribute), /// Change the cursor shape CursorShape(CursorShape), /// Change the cursor visibility CursorVisibility(CursorVisibility), /// Place an image at the current cursor position. /// The image defines the dimensions in cells. /// TODO: check iterm rendering behavior when the image is larger than the width of the screen. /// If the image is taller than the remaining space at the bottom /// of the screen, the screen will scroll up. /// The cursor Y position is unchanged by rendering the Image. /// The cursor X position will be incremented by `Image::width` cells. Image(Image), /// Scroll the `region_size` lines starting at `first_row` upwards /// by `scroll_count` lines. The `scroll_count` lines at the top of /// the region are overwritten. The `scroll_count` lines at the /// bottom of the region will become blank. /// /// After a region is scrolled, the cursor position is undefined, /// and the terminal's scroll region is set to the range specified. /// To restore scrolling behaviour to the full terminal window, an /// additional `Change::ScrollRegionUp { first_row: 0, region_size: /// height, scroll_count: 0 }`, where `height` is the height of the /// terminal, should be emitted. ScrollRegionUp { first_row: usize, region_size: usize, scroll_count: usize, }, /// Scroll the `region_size` lines starting at `first_row` downwards /// by `scroll_count` lines. The `scroll_count` lines at the bottom /// the region are overwritten. The `scroll_count` lines at the top /// of the region will become blank. /// /// After a region is scrolled, the cursor position is undefined, /// and the terminal's scroll region is set to the range specified. /// To restore scrolling behaviour to the full terminal window, an /// additional `Change::ScrollRegionDown { first_row: 0, /// region_size: height, scroll_count: 0 }`, where `height` is the /// height of the terminal, should be emitted. ScrollRegionDown { first_row: usize, region_size: usize, scroll_count: usize, }, /// Change the title of the window in which the surface will be /// rendered. Title(String), /// Adjust the current line attributes, such as double height or width LineAttribute(LineAttribute), } impl Change { pub fn is_text(&self) -> bool { matches!(self, Change::Text(_)) } pub fn text(&self) -> &str { match self { Change::Text(text) => text, _ => panic!("you must use Change::is_text() to guard calls to Change::text()"), } } } impl> From for Change { fn from(s: S) -> Self { Change::Text(s.into()) } } impl From for Change { fn from(c: AttributeChange) -> Self { Change::Attribute(c) } } impl From for Change { fn from(attr: LineAttribute) -> Self { Change::LineAttribute(attr) } } /// Keeps track of a run of changes and allows reasoning about the cursor /// position and the extent of the screen that the sequence will affect. /// This is useful for example when implementing something like a LineEditor /// where you don't want to take control over the entire surface but do want /// to be able to emit a dynamically sized output relative to the cursor /// position at the time that the editor is invoked. pub struct ChangeSequence { changes: Vec, screen_rows: usize, screen_cols: usize, pub(crate) cursor_x: usize, pub(crate) cursor_y: isize, render_y_max: isize, render_y_min: isize, } impl ChangeSequence { pub fn new(rows: usize, cols: usize) -> Self { Self { changes: vec![], screen_rows: rows, screen_cols: cols, cursor_x: 0, cursor_y: 0, render_y_max: 0, render_y_min: 0, } } pub fn consume(self) -> Vec { self.changes } /// Returns the cursor position, (x, y). pub fn current_cursor_position(&self) -> (usize, isize) { (self.cursor_x, self.cursor_y) } pub fn move_to(&mut self, (cursor_x, cursor_y): (usize, isize)) { self.add(Change::CursorPosition { x: Position::Relative(cursor_x as isize - self.cursor_x as isize), y: Position::Relative(cursor_y - self.cursor_y), }); } /// Returns the total number of rows affected pub fn render_height(&self) -> usize { (self.render_y_max - self.render_y_min).max(0).abs() as usize } fn update_render_height(&mut self) { self.render_y_max = self.render_y_max.max(self.cursor_y); self.render_y_min = self.render_y_min.min(self.cursor_y); } pub fn add_changes(&mut self, changes: Vec) { for change in changes { self.add(change); } } pub fn add>(&mut self, change: C) { let change = change.into(); match &change { Change::AllAttributes(_) | Change::Attribute(_) | Change::CursorColor(_) | Change::CursorShape(_) | Change::CursorVisibility(_) | Change::ClearToEndOfLine(_) | Change::Title(_) | Change::LineAttribute(_) | Change::ClearToEndOfScreen(_) => {} Change::Text(t) => { for g in Graphemes::new(t.as_str()) { if self.cursor_x == self.screen_cols { self.cursor_y += 1; self.cursor_x = 0; } if g == "\n" { self.cursor_y += 1; } else if g == "\r" { self.cursor_x = 0; } else if g == "\r\n" { self.cursor_y += 1; self.cursor_x = 0; } else { let len = unicode_column_width(g, None); self.cursor_x += len; } } self.update_render_height(); } Change::Image(im) => { self.cursor_x += im.width; self.render_y_max = self.render_y_max.max(self.cursor_y + im.height as isize); } Change::ClearScreen(_) => { self.cursor_x = 0; self.cursor_y = 0; } Change::CursorPosition { x, y } => { self.cursor_x = match x { Position::Relative(x) => { ((self.cursor_x as isize + x) % self.screen_cols as isize) as usize } Position::Absolute(x) => x % self.screen_cols, Position::EndRelative(x) => (self.screen_cols - x) % self.screen_cols, }; self.cursor_y = match y { Position::Relative(y) => { (self.cursor_y as isize + y) % self.screen_rows as isize } Position::Absolute(y) => (y % self.screen_rows) as isize, Position::EndRelative(y) => { ((self.screen_rows - y) % self.screen_rows) as isize } }; self.update_render_height(); } Change::ScrollRegionUp { .. } | Change::ScrollRegionDown { .. } => { // The resultant cursor position is undefined by // the renderer! // We just pick something. self.cursor_x = 0; self.cursor_y = 0; } } self.changes.push(change); } } /// The `Image` `Change` needs to support adding an image that spans multiple /// rows and columns, as well as model the content for just one of those cells. /// For instance, if some of the cells inside an image are replaced by textual /// content, and the screen is scrolled, computing the diff change stream needs /// to be able to express that a single cell holds a slice from a larger image. /// The `Image` struct expresses its dimensions in cells and references a region /// in the shared source image data using texture coordinates. /// A 4x3 cell image would set `width=3`, `height=3`, `top_left=(0,0)`, `bottom_right=(1,1)`. /// The top left cell from that image, if it were to be included in a diff, /// would be recorded as `width=1`, `height=1`, `top_left=(0,0)`, `bottom_right=(1/4,1/3)`. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub struct Image { /// measured in cells pub width: usize, /// measure in cells pub height: usize, /// Texture coordinate for the top left of this image block. /// (0,0) is the top left of the ImageData. (1, 1) is /// the bottom right. pub top_left: TextureCoordinate, /// Texture coordinates for the bottom right of this image block. pub bottom_right: TextureCoordinate, /// the image data pub image: Arc, } termwiz-0.22.0/src/surface/line/cellref.rs000064400000000000000000000040301046102023000165330ustar 00000000000000use crate::cell::{Cell, CellAttributes}; use crate::emoji::Presentation; use std::hash::{Hash, Hasher}; #[derive(Debug, Clone, Copy)] pub enum CellRef<'a> { CellRef { cell_index: usize, cell: &'a Cell, }, ClusterRef { cell_index: usize, text: &'a str, width: usize, attrs: &'a CellAttributes, }, } impl<'a> CellRef<'a> { pub fn cell_index(&self) -> usize { match self { Self::ClusterRef { cell_index, .. } | Self::CellRef { cell_index, .. } => *cell_index, } } pub fn str(&self) -> &str { match self { Self::CellRef { cell, .. } => cell.str(), Self::ClusterRef { text, .. } => text, } } pub fn width(&self) -> usize { match self { Self::CellRef { cell, .. } => cell.width(), Self::ClusterRef { width, .. } => *width, } } pub fn attrs(&self) -> &CellAttributes { match self { Self::CellRef { cell, .. } => cell.attrs(), Self::ClusterRef { attrs, .. } => attrs, } } pub fn presentation(&self) -> Presentation { match self { Self::CellRef { cell, .. } => cell.presentation(), Self::ClusterRef { text, .. } => match Presentation::for_grapheme(text) { (_, Some(variation)) => variation, (presentation, None) => presentation, }, } } pub fn as_cell(&self) -> Cell { match self { Self::CellRef { cell, .. } => (*cell).clone(), Self::ClusterRef { text, width, attrs, .. } => Cell::new_grapheme_with_width(text, *width, (*attrs).clone()), } } pub fn same_contents(&self, other: &Self) -> bool { self.str() == other.str() && self.width() == other.width() && self.attrs() == other.attrs() } pub fn compute_shape_hash(&self, hasher: &mut H) { self.str().hash(hasher); self.attrs().compute_shape_hash(hasher); } } termwiz-0.22.0/src/surface/line/clusterline.rs000064400000000000000000000256431046102023000174650ustar 00000000000000use crate::cell::{Cell, CellAttributes}; use crate::surface::line::CellRef; use finl_unicode::grapheme_clusters::Graphemes; use fixedbitset::FixedBitSet; #[cfg(feature = "use_serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::convert::TryInto; use std::num::NonZeroU8; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] struct Cluster { cell_width: u16, attrs: CellAttributes, } /// Stores line data as a contiguous string and a series of /// clusters of attribute data describing attributed ranges /// within the line #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub(crate) struct ClusteredLine { pub text: String, #[cfg_attr( feature = "use_serde", serde( deserialize_with = "deserialize_bitset", serialize_with = "serialize_bitset" ) )] is_double_wide: Option>, clusters: Vec, /// Length, measured in cells len: u16, last_cell_width: Option, } #[cfg(feature = "use_serde")] fn deserialize_bitset<'de, D>(deserializer: D) -> Result>, D::Error> where D: Deserializer<'de>, { let wide_indices = >::deserialize(deserializer)?; if wide_indices.is_empty() { Ok(None) } else { let max_idx = wide_indices.iter().max().unwrap_or(&1); let mut bitset = FixedBitSet::with_capacity(max_idx + 1); for idx in wide_indices { bitset.set(idx, true); } Ok(Some(Box::new(bitset))) } } /// Serialize the bitset as a vector of the indices of just the 1 bits; /// the thesis is that most of the cells on a given line are single width. /// That may not be strictly true for users that heavily use asian scripts, /// but we'll start with this and see if we need to improve it. #[cfg(feature = "use_serde")] fn serialize_bitset(value: &Option>, serializer: S) -> Result where S: Serializer, { let mut wide_indices: Vec = vec![]; if let Some(bits) = value { for idx in bits.ones() { wide_indices.push(idx); } } wide_indices.serialize(serializer) } impl ClusteredLine { pub fn new() -> Self { Self { text: String::with_capacity(80), is_double_wide: None, clusters: vec![], len: 0, last_cell_width: None, } } pub fn to_cell_vec(&self) -> Vec { let mut cells = vec![]; for c in self.iter() { cells.push(c.as_cell()); for _ in 1..c.width() { cells.push(Cell::blank_with_attrs(c.attrs().clone())); } } cells } pub fn from_cell_vec<'a>(hint: usize, iter: impl Iterator>) -> Self { let mut last_cluster: Option = None; let mut is_double_wide = FixedBitSet::with_capacity(hint); let mut text = String::new(); let mut clusters = vec![]; let mut any_double = false; let mut len = 0; let mut last_cell_width = None; for cell in iter { len += cell.width(); last_cell_width = NonZeroU8::new(1); if cell.width() > 1 { any_double = true; is_double_wide.set(cell.cell_index(), true); } text.push_str(cell.str()); last_cluster = match last_cluster.take() { None => Some(Cluster { cell_width: cell.width() as u16, attrs: cell.attrs().clone(), }), Some(cluster) if cluster.attrs != *cell.attrs() => { clusters.push(cluster); Some(Cluster { cell_width: cell.width() as u16, attrs: cell.attrs().clone(), }) } Some(mut cluster) => { cluster.cell_width += cell.width() as u16; Some(cluster) } }; } if let Some(cluster) = last_cluster.take() { clusters.push(cluster); } Self { text, is_double_wide: if any_double { Some(Box::new(is_double_wide)) } else { None }, clusters, len: len.try_into().unwrap(), last_cell_width, } } pub fn len(&self) -> usize { self.len as usize } fn is_double_wide(&self, cell_index: usize) -> bool { match &self.is_double_wide { Some(bitset) => bitset.contains(cell_index), None => false, } } pub fn iter(&self) -> ClusterLineCellIter { let mut clusters = self.clusters.iter(); let cluster = clusters.next(); ClusterLineCellIter { graphemes: Graphemes::new(&self.text), clusters, cluster, idx: 0, cluster_total: 0, line: self, } } pub fn append_grapheme(&mut self, text: &str, cell_width: usize, attrs: CellAttributes) { let new_cluster = match self.clusters.last() { Some(cluster) => cluster.attrs != attrs, None => true, }; let new_cell_index = self.len as usize; let cell_width = cell_width as u16; if new_cluster { self.clusters.push(Cluster { attrs, cell_width }); } else if let Some(cluster) = self.clusters.last_mut() { cluster.cell_width += cell_width as u16; } self.text.push_str(text); if cell_width > 1 { let bitset = match self.is_double_wide.take() { Some(mut bitset) => { bitset.grow(new_cell_index + 1); bitset.set(new_cell_index, true); bitset } None => { let mut bitset = FixedBitSet::with_capacity(new_cell_index + 1); bitset.set(new_cell_index, true); Box::new(bitset) } }; self.is_double_wide.replace(bitset); } self.last_cell_width = NonZeroU8::new(cell_width as u8); self.len += cell_width; } pub fn append(&mut self, cell: Cell) { let new_cluster = match self.clusters.last() { Some(cluster) => cluster.attrs != *cell.attrs(), None => true, }; let new_cell_index = self.len as usize; let cell_width = cell.width() as u16; if new_cluster { self.clusters.push(Cluster { attrs: (*cell.attrs()).clone(), cell_width, }); } else if let Some(cluster) = self.clusters.last_mut() { cluster.cell_width += cell_width; } self.text.push_str(cell.str()); if cell_width > 1 { let bitset = match self.is_double_wide.take() { Some(mut bitset) => { bitset.grow(new_cell_index + 1); bitset.set(new_cell_index, true); bitset } None => { let mut bitset = FixedBitSet::with_capacity(new_cell_index + 1); bitset.set(new_cell_index, true); Box::new(bitset) } }; self.is_double_wide.replace(bitset); } self.last_cell_width = NonZeroU8::new(cell_width as u8); self.len += cell_width; } pub fn prune_trailing_blanks(&mut self) -> bool { let num_spaces = self.text.chars().rev().take_while(|&c| c == ' ').count(); if num_spaces == 0 { return false; } let blank = CellAttributes::blank(); let mut pruned = false; for _ in 0..num_spaces { let mut need_pop = false; if let Some(cluster) = self.clusters.last_mut() { if cluster.attrs != blank { break; } cluster.cell_width -= 1; self.text.pop(); self.len -= 1; self.last_cell_width.take(); pruned = true; if cluster.cell_width == 0 { need_pop = true; } } if need_pop { self.clusters.pop(); } } pruned } fn compute_last_cell_width(&mut self) -> Option { if self.last_cell_width.is_none() { if let Some(last_cell) = self.iter().last() { self.last_cell_width = NonZeroU8::new(last_cell.width() as u8); } } self.last_cell_width } pub fn set_last_cell_was_wrapped(&mut self, wrapped: bool) { if let Some(width) = self.compute_last_cell_width() { let width = width.get() as u16; if let Some(last_cluster) = self.clusters.last_mut() { let mut attrs = last_cluster.attrs.clone(); attrs.set_wrapped(wrapped); if last_cluster.cell_width == width { // Re-purpose final cluster last_cluster.attrs = attrs; } else { last_cluster.cell_width -= width; self.clusters.push(Cluster { cell_width: width, attrs, }); } } } } } pub(crate) struct ClusterLineCellIter<'a> { graphemes: Graphemes<'a>, clusters: std::slice::Iter<'a, Cluster>, cluster: Option<&'a Cluster>, idx: usize, cluster_total: usize, line: &'a ClusteredLine, } impl<'a> Iterator for ClusterLineCellIter<'a> { type Item = CellRef<'a>; fn next(&mut self) -> Option> { let text = self.graphemes.next()?; let cell_index = self.idx; let width = if self.line.is_double_wide(cell_index) { 2 } else { 1 }; self.idx += width; self.cluster_total += width; let attrs = &self.cluster.as_ref()?.attrs; if self.cluster_total >= self.cluster.as_ref()?.cell_width as usize { self.cluster = self.clusters.next(); self.cluster_total = 0; } Some(CellRef::ClusterRef { cell_index, width, text, attrs, }) } } #[cfg(test)] mod test { use super::*; #[test] #[cfg(target_pointer_width = "64")] fn memory_usage() { assert_eq!(std::mem::size_of::(), 64); assert_eq!(std::mem::size_of::(), 24); assert_eq!(std::mem::size_of::>(), 24); assert_eq!(std::mem::size_of::>>(), 8); assert_eq!(std::mem::size_of::>(), 1); } } termwiz-0.22.0/src/surface/line/line.rs000064400000000000000000001224021046102023000160520ustar 00000000000000use crate::cell::{Cell, CellAttributes, SemanticType, UnicodeVersion}; use crate::cellcluster::CellCluster; use crate::hyperlink::Rule; use crate::surface::line::cellref::CellRef; use crate::surface::line::clusterline::ClusteredLine; use crate::surface::line::linebits::LineBits; use crate::surface::line::storage::{CellStorage, VisibleCellIter}; use crate::surface::line::vecstorage::{VecStorage, VecStorageIter}; use crate::surface::{Change, SequenceNo, SEQ_ZERO}; use finl_unicode::grapheme_clusters::Graphemes; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use siphasher::sip128::{Hasher128, SipHasher}; use std::any::Any; use std::borrow::Cow; use std::hash::Hash; use std::ops::Range; use std::sync::{Arc, Mutex, Weak}; use wezterm_bidi::{Direction, ParagraphDirectionHint}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq)] pub struct ZoneRange { pub semantic_type: SemanticType, pub range: Range, } #[derive(Debug, Clone, PartialEq)] pub enum DoubleClickRange { Range(Range), RangeWithWrap(Range), } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug)] pub struct Line { pub(crate) cells: CellStorage, zones: Vec, seqno: SequenceNo, bits: LineBits, #[cfg_attr(feature = "use_serde", serde(skip))] appdata: Mutex>>, } impl Clone for Line { fn clone(&self) -> Self { Self { cells: self.cells.clone(), zones: self.zones.clone(), seqno: self.seqno, bits: self.bits, appdata: Mutex::new(self.appdata.lock().unwrap().clone()), } } } impl PartialEq for Line { fn eq(&self, other: &Self) -> bool { self.seqno == other.seqno && self.bits == other.bits && self.cells == other.cells } } impl Line { pub fn with_width_and_cell(width: usize, cell: Cell, seqno: SequenceNo) -> Self { let mut cells = Vec::with_capacity(width); cells.resize(width, cell.clone()); let bits = LineBits::NONE; Self { bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn from_cells(cells: Vec, seqno: SequenceNo) -> Self { let bits = LineBits::NONE; Self { bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } /// Create a new line using cluster storage, optimized for appending /// and lower memory utilization. /// The line will automatically switch to cell storage when necessary /// to apply edits. pub fn new(seqno: SequenceNo) -> Self { Self { bits: LineBits::NONE, cells: CellStorage::C(ClusteredLine::new()), seqno, zones: vec![], appdata: Mutex::new(None), } } /// Computes a hash over the line that will change if the way that /// the line contents are shaped would change. /// This is independent of the seqno and is based purely on the /// content of the line. /// /// Line doesn't implement Hash in terms of this function as compute_shape_hash /// doesn't every possible bit of internal state, and we don't want to /// encourage using Line directly as a hash key. pub fn compute_shape_hash(&self) -> [u8; 16] { let mut hasher = SipHasher::new(); self.bits.bits().hash(&mut hasher); for cell in self.visible_cells() { cell.compute_shape_hash(&mut hasher); } hasher.finish128().as_bytes() } pub fn with_width(width: usize, seqno: SequenceNo) -> Self { let mut cells = Vec::with_capacity(width); cells.resize_with(width, Cell::blank); let bits = LineBits::NONE; Self { bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn from_text( s: &str, attrs: &CellAttributes, seqno: SequenceNo, unicode_version: Option, ) -> Line { let mut cells = Vec::new(); for sub in Graphemes::new(s) { let cell = Cell::new_grapheme(sub, attrs.clone(), unicode_version); let width = cell.width(); cells.push(cell); for _ in 1..width { cells.push(Cell::new(' ', attrs.clone())); } } Line { cells: CellStorage::V(VecStorage::new(cells)), bits: LineBits::NONE, seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn from_text_with_wrapped_last_col( s: &str, attrs: &CellAttributes, seqno: SequenceNo, ) -> Line { let mut line = Self::from_text(s, attrs, seqno, None); line.cells_mut() .last_mut() .map(|cell| cell.attrs_mut().set_wrapped(true)); line } pub fn resize_and_clear( &mut self, width: usize, seqno: SequenceNo, blank_attr: CellAttributes, ) { { let cells = self.coerce_vec_storage(); for c in cells.iter_mut() { *c = Cell::blank_with_attrs(blank_attr.clone()); } cells.resize_with(width, || Cell::blank_with_attrs(blank_attr.clone())); cells.shrink_to_fit(); } self.update_last_change_seqno(seqno); self.invalidate_zones(); self.bits = LineBits::NONE; } pub fn resize(&mut self, width: usize, seqno: SequenceNo) { self.coerce_vec_storage().resize_with(width, Cell::blank); self.update_last_change_seqno(seqno); self.invalidate_zones(); } /// Wrap the line so that it fits within the provided width. /// Returns the list of resultant line(s) pub fn wrap(self, width: usize, seqno: SequenceNo) -> Vec { let mut cells: Vec = self.visible_cells().collect(); if let Some(end_idx) = cells.iter().rposition(|c| c.str() != " ") { cells.truncate(end_idx + 1); let mut lines: Vec = vec![]; let mut delta = 0; for cell in cells { let need_new_line = lines .last_mut() .map(|line| line.len() + cell.width() > width) .unwrap_or(true); if need_new_line { lines .last_mut() .map(|line| line.set_last_cell_was_wrapped(true, seqno)); lines.push(Line::new(seqno)); delta = cell.cell_index(); } let line = lines.last_mut().unwrap(); line.set_cell_grapheme( cell.cell_index() - delta, cell.str(), cell.width(), (*cell.attrs()).clone(), seqno, ); } lines } else { vec![self] } } /// Set arbitrary application specific data for the line. /// Only one piece of appdata can be tracked per line, /// so this is only suitable for the overall application /// and not for use by "middleware" crates. /// A Weak reference is stored. /// `get_appdata` is used to retrieve a previously stored reference. pub fn set_appdata(&self, appdata: Arc) { let appdata: Arc = appdata; self.appdata .lock() .unwrap() .replace(Arc::downgrade(&appdata)); } pub fn clear_appdata(&self) { self.appdata.lock().unwrap().take(); } /// Retrieve the appdata for the line, if any. /// This may return None in the case where the underlying data has /// been released: Line only stores a Weak reference to it. pub fn get_appdata(&self) -> Option> { self.appdata .lock() .unwrap() .as_ref() .and_then(|data| data.upgrade()) } /// Returns true if the line's last changed seqno is more recent /// than the provided seqno parameter pub fn changed_since(&self, seqno: SequenceNo) -> bool { self.seqno == SEQ_ZERO || self.seqno > seqno } pub fn current_seqno(&self) -> SequenceNo { self.seqno } /// Annotate the line with the sequence number of a change. /// This can be used together with Line::changed_since to /// manage caching and rendering #[inline] pub fn update_last_change_seqno(&mut self, seqno: SequenceNo) { self.seqno = self.seqno.max(seqno); } /// Check whether the line is single-width. #[inline] pub fn is_single_width(&self) -> bool { (self.bits & (LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_TOP | LineBits::DOUBLE_HEIGHT_BOTTOM)) == LineBits::NONE } /// Force single-width. This also implicitly sets /// double-height-(top/bottom) and dirty. #[inline] pub fn set_single_width(&mut self, seqno: SequenceNo) { self.bits.remove(LineBits::DOUBLE_WIDTH_HEIGHT_MASK); self.update_last_change_seqno(seqno); } /// Check whether the line is double-width and not double-height. #[inline] pub fn is_double_width(&self) -> bool { (self.bits & LineBits::DOUBLE_WIDTH_HEIGHT_MASK) == LineBits::DOUBLE_WIDTH } /// Force double-width. This also implicitly sets /// double-height-(top/bottom) and dirty. #[inline] pub fn set_double_width(&mut self, seqno: SequenceNo) { self.bits .remove(LineBits::DOUBLE_HEIGHT_TOP | LineBits::DOUBLE_HEIGHT_BOTTOM); self.bits.insert(LineBits::DOUBLE_WIDTH); self.update_last_change_seqno(seqno); } /// Check whether the line is double-height-top. #[inline] pub fn is_double_height_top(&self) -> bool { (self.bits & LineBits::DOUBLE_WIDTH_HEIGHT_MASK) == LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_TOP } /// Force double-height top-half. This also implicitly sets /// double-width and dirty. #[inline] pub fn set_double_height_top(&mut self, seqno: SequenceNo) { self.bits.remove(LineBits::DOUBLE_HEIGHT_BOTTOM); self.bits .insert(LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_TOP); self.update_last_change_seqno(seqno); } /// Check whether the line is double-height-bottom. #[inline] pub fn is_double_height_bottom(&self) -> bool { (self.bits & LineBits::DOUBLE_WIDTH_HEIGHT_MASK) == LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_BOTTOM } /// Force double-height bottom-half. This also implicitly sets /// double-width and dirty. #[inline] pub fn set_double_height_bottom(&mut self, seqno: SequenceNo) { self.bits.remove(LineBits::DOUBLE_HEIGHT_TOP); self.bits .insert(LineBits::DOUBLE_WIDTH | LineBits::DOUBLE_HEIGHT_BOTTOM); self.update_last_change_seqno(seqno); } /// Set a flag the indicate whether the line should have the bidi /// algorithm applied during rendering pub fn set_bidi_enabled(&mut self, enabled: bool, seqno: SequenceNo) { self.bits.set(LineBits::BIDI_ENABLED, enabled); self.update_last_change_seqno(seqno); } /// Set the bidi direction for the line. /// This affects both the bidi algorithm (if enabled via set_bidi_enabled) /// and the layout direction of the line. /// `auto_detect` specifies whether the direction should be auto-detected /// before falling back to the specified direction. pub fn set_direction(&mut self, direction: Direction, auto_detect: bool, seqno: SequenceNo) { self.bits .set(LineBits::RTL, direction == Direction::LeftToRight); self.bits.set(LineBits::AUTO_DETECT_DIRECTION, auto_detect); self.update_last_change_seqno(seqno); } pub fn set_bidi_info( &mut self, enabled: bool, direction: ParagraphDirectionHint, seqno: SequenceNo, ) { self.bits.set(LineBits::BIDI_ENABLED, enabled); let (auto, rtl) = match direction { ParagraphDirectionHint::AutoRightToLeft => (true, true), ParagraphDirectionHint::AutoLeftToRight => (true, false), ParagraphDirectionHint::LeftToRight => (false, false), ParagraphDirectionHint::RightToLeft => (false, true), }; self.bits.set(LineBits::AUTO_DETECT_DIRECTION, auto); self.bits.set(LineBits::RTL, rtl); self.update_last_change_seqno(seqno); } /// Returns a tuple of (BIDI_ENABLED, Direction), indicating whether /// the line should have the bidi algorithm applied and its base /// direction, respectively. pub fn bidi_info(&self) -> (bool, ParagraphDirectionHint) { ( self.bits.contains(LineBits::BIDI_ENABLED), match ( self.bits.contains(LineBits::AUTO_DETECT_DIRECTION), self.bits.contains(LineBits::RTL), ) { (true, true) => ParagraphDirectionHint::AutoRightToLeft, (false, true) => ParagraphDirectionHint::RightToLeft, (true, false) => ParagraphDirectionHint::AutoLeftToRight, (false, false) => ParagraphDirectionHint::LeftToRight, }, ) } fn invalidate_zones(&mut self) { self.zones.clear(); } fn compute_zones(&mut self) { let blank_cell = Cell::blank(); let mut last_cell: Option = None; let mut current_zone: Option = None; let mut zones = vec![]; // Rows may have trailing space+Output cells interleaved // with other zones as a result of clear-to-eol and // clear-to-end-of-screen sequences. We don't want // those to affect the zones that we compute here let mut last_non_blank = self.len(); for cell in self.visible_cells() { if cell.str() != blank_cell.str() || cell.attrs() != blank_cell.attrs() { last_non_blank = cell.cell_index(); } } for cell in self.visible_cells() { if cell.cell_index() > last_non_blank { break; } let grapheme_idx = cell.cell_index() as u16; let semantic_type = cell.attrs().semantic_type(); let new_zone = match last_cell { None => true, Some(ref c) => c.attrs().semantic_type() != semantic_type, }; if new_zone { if let Some(zone) = current_zone.take() { zones.push(zone); } current_zone.replace(ZoneRange { range: grapheme_idx..grapheme_idx + 1, semantic_type, }); } if let Some(zone) = current_zone.as_mut() { zone.range.end = grapheme_idx; } last_cell.replace(cell); } if let Some(zone) = current_zone.take() { zones.push(zone); } self.zones = zones; } pub fn semantic_zone_ranges(&mut self) -> &[ZoneRange] { if self.zones.is_empty() { self.compute_zones(); } &self.zones } /// If we have any cells with an implicit hyperlink, remove the hyperlink /// from the cell attributes but leave the remainder of the attributes alone. #[inline] pub fn invalidate_implicit_hyperlinks(&mut self, seqno: SequenceNo) { if (self.bits & (LineBits::SCANNED_IMPLICIT_HYPERLINKS | LineBits::HAS_IMPLICIT_HYPERLINKS)) == LineBits::NONE { return; } self.bits &= !LineBits::SCANNED_IMPLICIT_HYPERLINKS; if (self.bits & LineBits::HAS_IMPLICIT_HYPERLINKS) == LineBits::NONE { return; } self.invalidate_implicit_hyperlinks_impl(seqno); } fn invalidate_implicit_hyperlinks_impl(&mut self, seqno: SequenceNo) { let cells = self.coerce_vec_storage(); for cell in cells.iter_mut() { let replace = match cell.attrs().hyperlink() { Some(ref link) if link.is_implicit() => Some(Cell::new_grapheme( cell.str(), cell.attrs().clone().set_hyperlink(None).clone(), None, )), _ => None, }; if let Some(replace) = replace { *cell = replace; } } self.bits &= !LineBits::HAS_IMPLICIT_HYPERLINKS; self.update_last_change_seqno(seqno); } /// Scan through the line and look for sequences that match the provided /// rules. Matching sequences are considered to be implicit hyperlinks /// and will have a hyperlink attribute associated with them. /// This function will only make changes if the line has been invalidated /// since the last time this function was called. /// This function does not remember the values of the `rules` slice, so it /// is the responsibility of the caller to call `invalidate_implicit_hyperlinks` /// if it wishes to call this function with different `rules`. pub fn scan_and_create_hyperlinks(&mut self, rules: &[Rule]) { if (self.bits & LineBits::SCANNED_IMPLICIT_HYPERLINKS) == LineBits::SCANNED_IMPLICIT_HYPERLINKS { // Has not changed since last time we scanned return; } // FIXME: let's build a string and a byte-to-cell map here, and // use this as an opportunity to rebuild HAS_HYPERLINK, skip matching // cells with existing non-implicit hyperlinks, and avoid matching // text with zero-width cells. self.bits |= LineBits::SCANNED_IMPLICIT_HYPERLINKS; self.bits &= !LineBits::HAS_IMPLICIT_HYPERLINKS; let line = self.as_str(); let matches = Rule::match_hyperlinks(&line, rules); if matches.is_empty() { return; } let line = line.into_owned(); let cells = self.coerce_vec_storage(); if cells.scan_and_create_hyperlinks(&line, matches) { self.bits |= LineBits::HAS_IMPLICIT_HYPERLINKS; } } /// Scan through a logical line that is comprised of an array of /// physical lines and look for sequences that match the provided /// rules. Matching sequences are considered to be implicit hyperlinks /// and will have a hyperlink attribute associated with them. /// This function will only make changes if the line has been invalidated /// since the last time this function was called. /// This function does not remember the values of the `rules` slice, so it /// is the responsibility of the caller to call `invalidate_implicit_hyperlinks` /// if it wishes to call this function with different `rules`. /// /// This function will call Line::clear_appdata on lines where /// hyperlinks are adjusted. pub fn apply_hyperlink_rules(rules: &[Rule], logical_line: &mut [&mut Line]) { if rules.is_empty() || logical_line.is_empty() { return; } let mut need_scan = false; for line in logical_line.iter() { if !line.bits.contains(LineBits::SCANNED_IMPLICIT_HYPERLINKS) { need_scan = true; break; } } if !need_scan { return; } let mut logical = logical_line[0].clone(); for line in &logical_line[1..] { let seqno = logical.current_seqno().max(line.current_seqno()); logical.append_line((**line).clone(), seqno); } let seq = logical.current_seqno(); logical.invalidate_implicit_hyperlinks(seq); logical.scan_and_create_hyperlinks(rules); if !logical.has_hyperlink() { for line in logical_line.iter_mut() { line.bits.set(LineBits::SCANNED_IMPLICIT_HYPERLINKS, true); line.clear_appdata(); } return; } // Re-compute the physical lines that comprise this logical line for phys in logical_line.iter_mut() { let wrapped = phys.last_cell_was_wrapped(); let is_cluster = matches!(&phys.cells, CellStorage::C(_)); let len = phys.len(); let remainder = logical.split_off(len, seq); **phys = logical; logical = remainder; phys.set_last_cell_was_wrapped(wrapped, seq); phys.clear_appdata(); if is_cluster { phys.compress_for_scrollback(); } } } /// Returns true if the line contains a hyperlink #[inline] pub fn has_hyperlink(&self) -> bool { (self.bits & (LineBits::HAS_HYPERLINK | LineBits::HAS_IMPLICIT_HYPERLINKS)) != LineBits::NONE } /// Recompose line into the corresponding utf8 string. pub fn as_str(&self) -> Cow { match &self.cells { CellStorage::V(_) => { let mut s = String::new(); for cell in self.visible_cells() { s.push_str(cell.str()); } Cow::Owned(s) } CellStorage::C(cl) => Cow::Borrowed(&cl.text), } } pub fn split_off(&mut self, idx: usize, seqno: SequenceNo) -> Self { let my_cells = self.coerce_vec_storage(); // Clamp to avoid out of bounds panic if the line is shorter // than the requested split point // let idx = idx.min(my_cells.len()); let cells = my_cells.split_off(idx); Self { bits: self.bits, cells: CellStorage::V(VecStorage::new(cells)), seqno, zones: vec![], appdata: Mutex::new(None), } } pub fn compute_double_click_range bool>( &self, click_col: usize, is_word: F, ) -> DoubleClickRange { let len = self.len(); if click_col >= len { return DoubleClickRange::Range(click_col..click_col); } let mut lower = click_col; let mut upper = click_col; // TODO: look back and look ahead for cells that are hidden by // a preceding multi-wide cell let cells = self.visible_cells().collect::>(); for cell in &cells { if cell.cell_index() < click_col { continue; } if !is_word(cell.str()) { break; } upper = cell.cell_index() + 1; } for cell in cells.iter().rev() { if cell.cell_index() > click_col { continue; } if !is_word(cell.str()) { break; } lower = cell.cell_index(); } if upper > lower && upper >= len && cells .last() .map(|cell| cell.attrs().wrapped()) .unwrap_or(false) { DoubleClickRange::RangeWithWrap(lower..upper) } else { DoubleClickRange::Range(lower..upper) } } /// Returns a substring from the line. pub fn columns_as_str(&self, range: Range) -> String { let mut s = String::new(); for c in self.visible_cells() { if c.cell_index() < range.start { continue; } if c.cell_index() >= range.end { break; } s.push_str(c.str()); } s } pub fn columns_as_line(&self, range: Range) -> Self { let mut cells = vec![]; for c in self.visible_cells() { if c.cell_index() < range.start { continue; } if c.cell_index() >= range.end { break; } cells.push(c.as_cell()); } Self { bits: LineBits::NONE, cells: CellStorage::V(VecStorage::new(cells)), seqno: self.current_seqno(), zones: vec![], appdata: Mutex::new(None), } } /// If we're about to modify a cell obscured by a double-width /// character ahead of that cell, we need to nerf that sequence /// of cells to avoid partial rendering concerns. /// Similarly, when we assign a cell, we need to blank out those /// occluded successor cells. pub fn set_cell(&mut self, idx: usize, cell: Cell, seqno: SequenceNo) { self.set_cell_impl(idx, cell, false, seqno); } /// Assign a cell using grapheme text with a known width and attributes. /// This is a micro-optimization over first constructing a Cell from /// the grapheme info. If assigning this particular cell can be optimized /// to an append to the interal clustered storage then the cost of /// constructing and dropping the Cell can be avoided. pub fn set_cell_grapheme( &mut self, idx: usize, text: &str, width: usize, attr: CellAttributes, seqno: SequenceNo, ) { if attr.hyperlink().is_some() { self.bits |= LineBits::HAS_HYPERLINK; } if let CellStorage::C(cl) = &mut self.cells { if idx > cl.len() && text == " " && attr == CellAttributes::blank() { // Appending blank beyond end of line; is already // implicitly blank return; } while cl.len() < idx { // Fill out any implied blanks until we can append // their intended cell content cl.append_grapheme(" ", 1, CellAttributes::blank()); } if idx == cl.len() { cl.append_grapheme(text, width, attr); self.invalidate_implicit_hyperlinks(seqno); self.invalidate_zones(); self.update_last_change_seqno(seqno); return; } } self.set_cell(idx, Cell::new_grapheme_with_width(text, width, attr), seqno); } pub fn set_cell_clearing_image_placements( &mut self, idx: usize, cell: Cell, seqno: SequenceNo, ) { self.set_cell_impl(idx, cell, true, seqno) } fn raw_set_cell(&mut self, idx: usize, cell: Cell, clear: bool) { let cells = self.coerce_vec_storage(); cells.set_cell(idx, cell, clear); } fn set_cell_impl(&mut self, idx: usize, cell: Cell, clear: bool, seqno: SequenceNo) { // The .max(1) stuff is here in case we get called with a // zero-width cell. That shouldn't happen: those sequences // should get filtered out in the terminal parsing layer, // but in case one does sneak through, we need to ensure that // we grow the cells array to hold this bogus entry. // https://github.com/wez/wezterm/issues/768 let width = cell.width().max(1); self.invalidate_implicit_hyperlinks(seqno); self.invalidate_zones(); self.update_last_change_seqno(seqno); if cell.attrs().hyperlink().is_some() { self.bits |= LineBits::HAS_HYPERLINK; } if let CellStorage::C(cl) = &mut self.cells { if idx > cl.len() && cell == Cell::blank() { // Appending blank beyond end of line; is already // implicitly blank return; } while cl.len() < idx { // Fill out any implied blanks until we can append // their intended cell content cl.append_grapheme(" ", 1, CellAttributes::blank()); } if idx == cl.len() { cl.append(cell); return; } /* log::info!( "cannot append {cell:?} to {:?} as idx={idx} and cl.len is {}", cl, cl.len ); */ } // if the line isn't wide enough, pad it out with the default attributes. { let cells = self.coerce_vec_storage(); if idx + width > cells.len() { cells.resize_with(idx + width, Cell::blank); } } self.invalidate_grapheme_at_or_before(idx); // For double-wide or wider chars, ensure that the cells that // are overlapped by this one are blanked out. for i in 1..=width.saturating_sub(1) { self.raw_set_cell(idx + i, Cell::blank_with_attrs(cell.attrs().clone()), clear); } self.raw_set_cell(idx, cell, clear); } /// Place text starting at the specified column index. /// Each grapheme of the text run has the same attributes. pub fn overlay_text_with_attribute( &mut self, mut start_idx: usize, text: &str, attr: CellAttributes, seqno: SequenceNo, ) { for (i, c) in Graphemes::new(text).enumerate() { let cell = Cell::new_grapheme(c, attr.clone(), None); let width = cell.width(); self.set_cell(i + start_idx, cell, seqno); // Compensate for required spacing/placement of // double width characters start_idx += width.saturating_sub(1); } } fn invalidate_grapheme_at_or_before(&mut self, idx: usize) { // Assumption: that the width of a grapheme is never > 2. // This constrains the amount of look-back that we need to do here. if idx > 0 { let prior = idx - 1; let cells = self.coerce_vec_storage(); let width = cells[prior].width(); if width > 1 { let attrs = cells[prior].attrs().clone(); for nerf in prior..prior + width { cells[nerf] = Cell::blank_with_attrs(attrs.clone()); } } } } pub fn insert_cell(&mut self, x: usize, cell: Cell, right_margin: usize, seqno: SequenceNo) { self.invalidate_implicit_hyperlinks(seqno); let cells = self.coerce_vec_storage(); if right_margin <= cells.len() { cells.remove(right_margin - 1); } if x >= cells.len() { cells.resize_with(x, Cell::blank); } // If we're inserting a wide cell, we should also insert the overlapped cells. // We insert them first so that the grapheme winds up left-most. let width = cell.width(); for _ in 1..=width.saturating_sub(1) { cells.insert(x, Cell::blank_with_attrs(cell.attrs().clone())); } cells.insert(x, cell); self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn erase_cell(&mut self, x: usize, seqno: SequenceNo) { if x >= self.len() { // Already implicitly erased return; } self.invalidate_implicit_hyperlinks(seqno); self.invalidate_grapheme_at_or_before(x); { let cells = self.coerce_vec_storage(); cells.remove(x); cells.push(Cell::default()); } self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn remove_cell(&mut self, x: usize, seqno: SequenceNo) { if x >= self.len() { // Already implicitly removed return; } self.invalidate_implicit_hyperlinks(seqno); self.invalidate_grapheme_at_or_before(x); self.coerce_vec_storage().remove(x); self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn erase_cell_with_margin( &mut self, x: usize, right_margin: usize, seqno: SequenceNo, blank_attr: CellAttributes, ) { self.invalidate_implicit_hyperlinks(seqno); if x < self.len() { self.invalidate_grapheme_at_or_before(x); self.coerce_vec_storage().remove(x); } if right_margin <= self.len() + 1 /* we just removed one */ { self.coerce_vec_storage() .insert(right_margin - 1, Cell::blank_with_attrs(blank_attr)); } self.update_last_change_seqno(seqno); self.invalidate_zones(); } pub fn prune_trailing_blanks(&mut self, seqno: SequenceNo) { if let CellStorage::C(cl) = &mut self.cells { if cl.prune_trailing_blanks() { self.update_last_change_seqno(seqno); self.invalidate_zones(); } return; } let def_attr = CellAttributes::blank(); let cells = self.coerce_vec_storage(); if let Some(end_idx) = cells .iter() .rposition(|c| c.str() != " " || c.attrs() != &def_attr) { cells.resize_with(end_idx + 1, Cell::blank); self.update_last_change_seqno(seqno); self.invalidate_zones(); } } pub fn fill_range(&mut self, cols: Range, cell: &Cell, seqno: SequenceNo) { if self.len() == 0 && *cell == Cell::blank() { // We would be filling it with blanks only to prune // them all away again before we return; NOP return; } for x in cols { // FIXME: we can skip the look-back for second and subsequent iterations self.set_cell_impl(x, cell.clone(), true, seqno); } self.prune_trailing_blanks(seqno); } pub fn len(&self) -> usize { match &self.cells { CellStorage::V(cells) => cells.len(), CellStorage::C(cl) => cl.len(), } } /// Iterates the visible cells, respecting the width of the cell. /// For instance, a double-width cell overlaps the following (blank) /// cell, so that blank cell is omitted from the iterator results. /// The iterator yields (column_index, Cell). Column index is the /// index into Self::cells, and due to the possibility of skipping /// the characters that follow wide characters, the column index may /// skip some positions. It is returned as a convenience to the consumer /// as using .enumerate() on this iterator wouldn't be as useful. pub fn visible_cells<'a>(&'a self) -> impl Iterator> { match &self.cells { CellStorage::V(cells) => VisibleCellIter::V(VecStorageIter { cells: cells.iter(), idx: 0, skip_width: 0, }), CellStorage::C(cl) => VisibleCellIter::C(cl.iter()), } } pub fn get_cell(&self, cell_index: usize) -> Option { self.visible_cells() .find(|cell| cell.cell_index() == cell_index) } pub fn cluster(&self, bidi_hint: Option) -> Vec { CellCluster::make_cluster(self.len(), self.visible_cells(), bidi_hint) } fn make_cells(&mut self) { let cells = match &self.cells { CellStorage::V(_) => return, CellStorage::C(cl) => cl.to_cell_vec(), }; // log::info!("make_cells\n{:?}", backtrace::Backtrace::new()); self.cells = CellStorage::V(VecStorage::new(cells)); } pub(crate) fn coerce_vec_storage(&mut self) -> &mut VecStorage { self.make_cells(); match &mut self.cells { CellStorage::V(c) => return c, CellStorage::C(_) => unreachable!(), } } /// Adjusts the internal storage so that it occupies less /// space. Subsequent mutations will incur some overhead to /// re-materialize the storage in a form that is suitable /// for mutation. pub fn compress_for_scrollback(&mut self) { let cv = match &self.cells { CellStorage::V(v) => ClusteredLine::from_cell_vec(v.len(), self.visible_cells()), CellStorage::C(_) => return, }; self.cells = CellStorage::C(cv); } pub fn cells_mut(&mut self) -> &mut [Cell] { self.coerce_vec_storage().as_mut_slice() } /// Return true if the line consists solely of whitespace cells pub fn is_whitespace(&self) -> bool { self.visible_cells().all(|c| c.str() == " ") } /// Return true if the last cell in the line has the wrapped attribute, /// indicating that the following line is logically a part of this one. pub fn last_cell_was_wrapped(&self) -> bool { self.visible_cells() .last() .map(|c| c.attrs().wrapped()) .unwrap_or(false) } /// Adjust the value of the wrapped attribute on the last cell of this /// line. pub fn set_last_cell_was_wrapped(&mut self, wrapped: bool, seqno: SequenceNo) { self.update_last_change_seqno(seqno); if let CellStorage::C(cl) = &mut self.cells { if cl.len() == 0 { // Need to mark that implicit space as wrapped, so // explicitly add it cl.append(Cell::blank()); } cl.set_last_cell_was_wrapped(wrapped); return; } let cells = self.coerce_vec_storage(); if let Some(cell) = cells.last_mut() { cell.attrs_mut().set_wrapped(wrapped); } } /// Concatenate the cells from other with this line, appending them /// to this line. /// This function is used by rewrapping logic when joining wrapped /// lines back together. pub fn append_line(&mut self, other: Line, seqno: SequenceNo) { match &mut self.cells { CellStorage::V(cells) => { for cell in other.visible_cells() { cells.push(cell.as_cell()); for _ in 1..cell.width() { cells.push(Cell::new(' ', cell.attrs().clone())); } } } CellStorage::C(cl) => { for cell in other.visible_cells() { cl.append(cell.as_cell()); } } } self.update_last_change_seqno(seqno); self.invalidate_zones(); } /// mutable access the cell data, but the caller must take care /// to only mutate attributes rather than the cell textual content. /// Use set_cell if you need to modify the textual content of the /// cell, so that important invariants are upheld. pub fn cells_mut_for_attr_changes_only(&mut self) -> &mut [Cell] { self.coerce_vec_storage().as_mut_slice() } /// Given a starting attribute value, produce a series of Change /// entries to recreate the current line pub fn changes(&self, start_attr: &CellAttributes) -> Vec { let mut result = Vec::new(); let mut attr = start_attr.clone(); let mut text_run = String::new(); for cell in self.visible_cells() { if *cell.attrs() == attr { text_run.push_str(cell.str()); } else { // flush out the current text run if !text_run.is_empty() { result.push(Change::Text(text_run.clone())); text_run.clear(); } attr = cell.attrs().clone(); result.push(Change::AllAttributes(attr.clone())); text_run.push_str(cell.str()); } } // flush out any remaining text run if !text_run.is_empty() { // if this is just spaces then it is likely cheaper // to emit ClearToEndOfLine instead. if attr == CellAttributes::default() .set_background(attr.background()) .clone() { let left = text_run.trim_end_matches(' ').to_string(); let num_trailing_spaces = text_run.len() - left.len(); if num_trailing_spaces > 0 { if !left.is_empty() { result.push(Change::Text(left)); } else if result.len() == 1 { // if the only queued result prior to clearing // to the end of the line is an attribute change, // we can prune it out and return just the line // clearing operation if let Change::AllAttributes(_) = result[0] { result.clear() } } // Since this function is only called in the full repaint // case, and we always emit a clear screen with the default // background color, we don't need to emit an instruction // to clear the remainder of the line unless it has a different // background color. if attr.background() != Default::default() { result.push(Change::ClearToEndOfLine(attr.background())); } } else { result.push(Change::Text(text_run)); } } else { result.push(Change::Text(text_run)); } } result } } impl<'a> From<&'a str> for Line { fn from(s: &str) -> Line { Line::from_text(s, &CellAttributes::default(), SEQ_ZERO, None) } } termwiz-0.22.0/src/surface/line/linebits.rs000064400000000000000000000040241046102023000167330ustar 00000000000000use bitflags::bitflags; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; bitflags! { #[cfg_attr(feature="use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq)] pub(crate) struct LineBits : u16 { const NONE = 0; /// The line contains 1+ cells with explicit hyperlinks set const HAS_HYPERLINK = 1<<1; /// true if we have scanned for implicit hyperlinks const SCANNED_IMPLICIT_HYPERLINKS = 1<<2; /// true if we found implicit hyperlinks in the last scan const HAS_IMPLICIT_HYPERLINKS = 1<<3; /// true if this line should be displayed with /// in double-width const DOUBLE_WIDTH = 1<<4; /// true if this line should be displayed /// as double-height top-half const DOUBLE_HEIGHT_TOP = 1<<5; /// true if this line should be displayed /// as double-height bottom-half const DOUBLE_HEIGHT_BOTTOM = 1<<6; const DOUBLE_WIDTH_HEIGHT_MASK = Self::DOUBLE_WIDTH.bits() | Self::DOUBLE_HEIGHT_TOP.bits() | Self::DOUBLE_HEIGHT_BOTTOM.bits(); /// true if the line should have the bidi algorithm /// applied as part of presentation. /// This corresponds to the "implicit" bidi modes /// described in /// const BIDI_ENABLED = 1<<0; /// true if the line base direction is RTL. /// When BIDI_ENABLED is also true, this is passed to the bidi algorithm. /// When rendering, the line will be rendered from RTL. const RTL = 1<<7; /// true if the direction for the line should be auto-detected /// when BIDI_ENABLED is also true. /// If false, the direction is taken from the RTL bit only. /// Otherwise, the auto-detect direction is used, falling back /// to the direction specified by the RTL bit. const AUTO_DETECT_DIRECTION = 1<<8; } } termwiz-0.22.0/src/surface/line/mod.rs000064400000000000000000000002401046102023000156750ustar 00000000000000mod cellref; mod clusterline; mod line; mod linebits; mod storage; mod test; mod vecstorage; pub use cellref::CellRef; pub use line::{DoubleClickRange, Line}; termwiz-0.22.0/src/surface/line/storage.rs000064400000000000000000000020011046102023000165570ustar 00000000000000use crate::surface::line::cellref::CellRef; use crate::surface::line::clusterline::{ClusterLineCellIter, ClusteredLine}; use crate::surface::line::vecstorage::{VecStorage, VecStorageIter}; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub(crate) enum CellStorage { V(VecStorage), C(ClusteredLine), } pub(crate) enum VisibleCellIter<'a> { V(VecStorageIter<'a>), C(ClusterLineCellIter<'a>), } impl<'a> Iterator for VisibleCellIter<'a> { type Item = CellRef<'a>; fn next(&mut self) -> Option> { match self { Self::V(iter) => iter.next(), Self::C(iter) => iter.next(), } } } #[cfg(test)] mod test { use super::*; #[test] #[cfg(target_pointer_width = "64")] fn memory_usage() { assert_eq!(std::mem::size_of::(), 64); assert_eq!(std::mem::size_of::(), 24); } } termwiz-0.22.0/src/surface/line/test.rs000064400000000000000000000442401046102023000161050ustar 00000000000000#![cfg(test)] use super::*; use crate::cell::{Cell, CellAttributes}; use crate::hyperlink::{Hyperlink, Rule}; use crate::surface::line::clusterline::ClusteredLine; use crate::surface::SEQ_ZERO; use k9::assert_equal as assert_eq; use std::sync::Arc; /// There are 4 double-wide graphemes that occupy 2 cells each. /// When we join the lines, we must preserve the invisible blank /// that is part of the grapheme otherwise our metrics will be /// wrong. /// #[test] fn append_line() { let mut line1: Line = "0123456789".into(); let line2: Line = "グループaa".into(); line1.append_line(line2, SEQ_ZERO); assert_eq!(line1.len(), 20); } #[test] fn hyperlinks() { let text = "⤠ðŸ˜ðŸ¤¢ http://example.com \u{1f468}\u{1f3fe}\u{200d}\u{1f9b0} http://example.com"; let rules = vec![ Rule::new(r"\b\w+://(?:[\w.-]+)\.[a-z]{2,15}\S*\b", "$0").unwrap(), Rule::new(r"\b\w+@[\w-]+(\.[\w-]+)+\b", "mailto:$0").unwrap(), ]; let hyperlink = Arc::new(Hyperlink::new_implicit("http://example.com")); let hyperlink_attr = CellAttributes::default() .set_hyperlink(Some(hyperlink.clone())) .clone(); let mut line: Line = text.into(); line.scan_and_create_hyperlinks(&rules); assert!(line.has_hyperlink()); assert_eq!( line.coerce_vec_storage().to_vec(), vec![ Cell::new_grapheme("â¤", CellAttributes::default(), None), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new_grapheme("ðŸ˜", CellAttributes::default(), None), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new_grapheme("🤢", CellAttributes::default(), None), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new(' ', CellAttributes::default()), Cell::new('h', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new(':', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('x', hyperlink_attr.clone()), Cell::new('a', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new('l', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('.', hyperlink_attr.clone()), Cell::new('c', hyperlink_attr.clone()), Cell::new('o', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), Cell::new(' ', CellAttributes::default()), Cell::new_grapheme( // man: dark skin tone, red hair ZWJ emoji grapheme "\u{1f468}\u{1f3fe}\u{200d}\u{1f9b0}", CellAttributes::default(), None, ), Cell::new(' ', CellAttributes::default()), // double width spacer Cell::new(' ', CellAttributes::default()), Cell::new('h', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('t', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new(':', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('/', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('x', hyperlink_attr.clone()), Cell::new('a', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), Cell::new('p', hyperlink_attr.clone()), Cell::new('l', hyperlink_attr.clone()), Cell::new('e', hyperlink_attr.clone()), Cell::new('.', hyperlink_attr.clone()), Cell::new('c', hyperlink_attr.clone()), Cell::new('o', hyperlink_attr.clone()), Cell::new('m', hyperlink_attr.clone()), ] ); } #[test] fn double_click_range_bounds() { let line: Line = "hello".into(); let r = line.compute_double_click_range(200, |_| true); assert_eq!(r, DoubleClickRange::Range(200..200)); } #[test] fn cluster_representation_basic() { let line: Line = "hello".into(); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 5, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_representation_double_width() { let line: Line = "⤠ðŸ˜ðŸ¤¢he⤠ðŸ˜ðŸ¤¢llo⤠ðŸ˜ðŸ¤¢".into(); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "⤠ðŸ˜ðŸ¤¢he⤠ðŸ˜ðŸ¤¢llo⤠ðŸ˜ðŸ¤¢", is_double_wide: Some( FixedBitSet { data: [ 2626580, ], length: 23, }, ), clusters: [ Cluster { cell_width: 23, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 23, last_cell_width: Some( 1, ), }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_representation_empty() { let line = Line::from_cells(vec![], SEQ_ZERO); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "", is_double_wide: None, clusters: [], len: 0, last_cell_width: None, }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_wrap_last() { let mut line: Line = "hello".into(); line.compress_for_scrollback(); line.set_last_cell_was_wrapped(true, 1); k9::snapshot!( line, r#" Line { cells: C( ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 4, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 2048, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: true, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), }, ), zones: [], seqno: 1, bits: LineBits( 0x0, ), appdata: Mutex { data: None, poisoned: false, .. }, } "# ); } fn bold() -> CellAttributes { use crate::cell::Intensity; let mut attr = CellAttributes::default(); attr.set_intensity(Intensity::Bold); attr } #[test] fn cluster_representation_attributes() { let line = Line::from_cells( vec![ Cell::new_grapheme("a", CellAttributes::default(), None), Cell::new_grapheme("b", bold(), None), Cell::new_grapheme("c", CellAttributes::default(), None), Cell::new_grapheme("d", bold(), None), ], SEQ_ZERO, ); let mut compressed = line.clone(); compressed.compress_for_scrollback(); k9::snapshot!( &compressed.cells, r#" C( ClusteredLine { text: "abcd", is_double_wide: None, clusters: [ Cluster { cell_width: 1, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 4, last_cell_width: Some( 1, ), }, ) "# ); compressed.coerce_vec_storage(); assert_eq!(line, compressed); } #[test] fn cluster_append() { let mut cl = ClusteredLine::new(); cl.append(Cell::new_grapheme("h", CellAttributes::default(), None)); cl.append(Cell::new_grapheme("e", CellAttributes::default(), None)); cl.append(Cell::new_grapheme("l", bold(), None)); cl.append(Cell::new_grapheme("l", CellAttributes::default(), None)); cl.append(Cell::new_grapheme("o", CellAttributes::default(), None)); k9::snapshot!( cl, r#" ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), } "# ); } #[test] fn cluster_line_new() { let mut line = Line::new(1); line.set_cell( 0, Cell::new_grapheme("h", CellAttributes::default(), None), 1, ); line.set_cell( 1, Cell::new_grapheme("e", CellAttributes::default(), None), 2, ); line.set_cell(2, Cell::new_grapheme("l", bold(), None), 3); line.set_cell( 3, Cell::new_grapheme("l", CellAttributes::default(), None), 4, ); line.set_cell( 4, Cell::new_grapheme("o", CellAttributes::default(), None), 5, ); k9::snapshot!( line, r#" Line { cells: C( ClusteredLine { text: "hello", is_double_wide: None, clusters: [ Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 1, attrs: CellAttributes { attributes: 1, intensity: Bold, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, Cluster { cell_width: 2, attrs: CellAttributes { attributes: 0, intensity: Normal, underline: None, blink: None, italic: false, reverse: false, strikethrough: false, invisible: false, wrapped: false, overline: false, semantic_type: Output, foreground: Default, background: Default, fat: None, }, }, ], len: 5, last_cell_width: Some( 1, ), }, ), zones: [], seqno: 5, bits: LineBits( 0x0, ), appdata: Mutex { data: None, poisoned: false, .. }, } "# ); } termwiz-0.22.0/src/surface/line/vecstorage.rs000064400000000000000000000061131046102023000172650ustar 00000000000000use crate::cell::Cell; use crate::surface::line::cellref::CellRef; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::sync::Arc; use unicode_segmentation::UnicodeSegmentation; #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub(crate) struct VecStorage { cells: Vec, } impl VecStorage { pub(crate) fn new(cells: Vec) -> Self { Self { cells } } pub(crate) fn set_cell(&mut self, idx: usize, mut cell: Cell, clear_image_placement: bool) { if !clear_image_placement { if let Some(images) = self.cells[idx].attrs().images() { for image in images { if image.has_placement_id() { cell.attrs_mut().attach_image(Box::new(image)); } } } } self.cells[idx] = cell; } pub(crate) fn scan_and_create_hyperlinks( &mut self, line: &str, matches: Vec, ) -> bool { // The capture range is measured in bytes but we need to translate // that to the index of the column. This is complicated a bit further // because double wide sequences have a blank column cell after them // in the cells array, but the string we match against excludes that // string. let mut cell_idx = 0; let mut has_implicit_hyperlinks = false; for (byte_idx, _grapheme) in line.grapheme_indices(true) { let cell = &mut self.cells[cell_idx]; let mut matched = false; for m in &matches { if m.range.contains(&byte_idx) { let attrs = cell.attrs_mut(); // Don't replace existing links if attrs.hyperlink().is_none() { attrs.set_hyperlink(Some(Arc::clone(&m.link))); matched = true; } } } cell_idx += cell.width(); if matched { has_implicit_hyperlinks = true; } } has_implicit_hyperlinks } } impl std::ops::Deref for VecStorage { type Target = Vec; fn deref(&self) -> &Vec { &self.cells } } impl std::ops::DerefMut for VecStorage { fn deref_mut(&mut self) -> &mut Vec { &mut self.cells } } /// Iterates over a slice of Cell, yielding only visible cells pub(crate) struct VecStorageIter<'a> { pub cells: std::slice::Iter<'a, Cell>, pub idx: usize, pub skip_width: usize, } impl<'a> Iterator for VecStorageIter<'a> { type Item = CellRef<'a>; fn next(&mut self) -> Option> { while self.skip_width > 0 { self.skip_width -= 1; let _ = self.cells.next()?; self.idx += 1; } let cell = self.cells.next()?; let cell_index = self.idx; self.idx += 1; self.skip_width = cell.width().saturating_sub(1); Some(CellRef::CellRef { cell_index, cell }) } } termwiz-0.22.0/src/surface/mod.rs000064400000000000000000001712001046102023000147530ustar 00000000000000use crate::cell::{Cell, CellAttributes}; use crate::color::ColorAttribute; use crate::image::ImageCell; use crate::surface::line::CellRef; use finl_unicode::grapheme_clusters::Graphemes; use ordered_float::NotNan; #[cfg(feature = "use_serde")] use serde::{Deserialize, Serialize}; use std::borrow::Cow; use std::cmp::min; use wezterm_dynamic::{FromDynamic, ToDynamic}; pub mod change; pub mod line; pub use self::change::{Change, Image, LineAttribute, TextureCoordinate}; pub use self::line::Line; /// Position holds 0-based positioning information, where /// Absolute(0) is the start of the line or column, /// Relative(0) is the current position in the line or /// column and EndRelative(0) is the end position in the /// line or column. #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub enum Position { /// Negative values move up, positive values down, 0 means no change Relative(isize), /// Relative to the start of the line or top of the screen Absolute(usize), /// Relative to the end of line or bottom of screen EndRelative(usize), } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Hash, Copy, PartialEq, Eq, FromDynamic, ToDynamic)] pub enum CursorVisibility { Hidden, Visible, } impl Default for CursorVisibility { fn default() -> CursorVisibility { CursorVisibility::Visible } } #[cfg_attr(feature = "use_serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromDynamic, ToDynamic)] pub enum CursorShape { Default, BlinkingBlock, SteadyBlock, BlinkingUnderline, SteadyUnderline, BlinkingBar, SteadyBar, } impl Default for CursorShape { fn default() -> CursorShape { CursorShape::Default } } impl CursorShape { pub fn is_blinking(self) -> bool { matches!( self, Self::BlinkingBlock | Self::BlinkingUnderline | Self::BlinkingBar ) } } /// SequenceNo indicates a logical position within a stream of changes. /// The sequence is only meaningful within a given `Surface` instance. pub type SequenceNo = usize; pub const SEQ_ZERO: SequenceNo = 0; /// The `Surface` type represents the contents of a terminal screen. /// It is not directly connected to a terminal device. /// It consists of a buffer and a log of changes. You can accumulate /// updates to the screen by adding instances of the `Change` enum /// that describe the updates. /// /// When ready to render the `Surface` to a `Terminal`, you can use /// the `get_changes` method to return an optimized stream of `Change`s /// since the last render and then pass it to an instance of `Renderer`. /// /// `Surface`s can also be composited together; this is useful when /// building up a UI with layers or widgets: each widget can be its /// own `Surface` instance and have its content maintained independently /// from the other widgets on the screen and can then be copied into /// the target `Surface` buffer for rendering. /// /// To support more efficient updates in the composite use case, a /// `draw_from_screen` method is available; the intent is to have one /// `Surface` be hold the data that was last rendered, and a second `Surface` /// of the same size that is repeatedly redrawn from the composite /// of the widgets. `draw_from_screen` is used to extract the smallest /// difference between the updated screen and apply those changes to /// the render target, and then use `get_changes` to render those without /// repainting the world on each update. #[derive(Default)] pub struct Surface { width: usize, height: usize, lines: Vec, attributes: CellAttributes, xpos: usize, ypos: usize, seqno: SequenceNo, changes: Vec, cursor_shape: Option, cursor_visibility: CursorVisibility, cursor_color: ColorAttribute, title: String, } #[derive(Default)] struct DiffState { changes: Vec, /// Keep track of the cursor position that the change stream /// selects for updates so that we can avoid emitting redundant /// position changes. cursor: Option<(usize, usize)>, /// Similarly, we keep track of the cell attributes that we have /// activated for change stream to avoid over-emitting. /// Tracking the cursor and attributes in this way helps to coalesce /// lines of text into simpler strings. attr: Option, } impl DiffState { #[inline] fn diff_cells(&mut self, col_num: usize, row_num: usize, cell: CellRef, other_cell: CellRef) { if cell.same_contents(&other_cell) { return; } self.set_cell(col_num, row_num, other_cell); } #[inline] fn set_cell(&mut self, col_num: usize, row_num: usize, other_cell: CellRef) { self.cursor = match self.cursor.take() { Some((cursor_row, cursor_col)) if cursor_row == row_num && cursor_col == col_num => { // It is on the current column, so we don't need // to explicitly move it. Move the cursor by the // width of the text we're about to add. Some((row_num, col_num + other_cell.width())) } _ => { // Need to explicitly move the cursor self.changes.push(Change::CursorPosition { y: Position::Absolute(row_num), x: Position::Absolute(col_num), }); // and update the position for next time Some((row_num, col_num + other_cell.width())) } }; // we could get fancy and try to minimize the update traffic // by computing a series of AttributeChange values here. // For now, let's just record the new value self.attr = match self.attr.take() { Some(ref attr) if attr == other_cell.attrs() => { // Active attributes match, so we don't need // to emit a change for them Some(attr.clone()) } _ => { // Attributes are different self.changes .push(Change::AllAttributes(other_cell.attrs().clone())); Some(other_cell.attrs().clone()) } }; // A little bit of bloat in the code to avoid runs of single // character Text entries; just append to the string. let result_len = self.changes.len(); if result_len > 0 && self.changes[result_len - 1].is_text() { if let Some(Change::Text(ref mut prefix)) = self.changes.get_mut(result_len - 1) { prefix.push_str(other_cell.str()); } } else { self.changes .push(Change::Text(other_cell.str().to_string())); } } } impl Surface { /// Create a new Surface with the specified width and height. pub fn new(width: usize, height: usize) -> Self { let mut scr = Surface { width, height, ..Default::default() }; scr.resize(width, height); scr } /// Returns the (width, height) of the surface pub fn dimensions(&self) -> (usize, usize) { (self.width, self.height) } pub fn cursor_position(&self) -> (usize, usize) { (self.xpos, self.ypos) } pub fn cursor_shape(&self) -> Option { self.cursor_shape } pub fn cursor_visibility(&self) -> CursorVisibility { self.cursor_visibility } pub fn title(&self) -> &str { &self.title } /// Resize the Surface to the specified width and height. /// If the width and/or height are smaller than previously, the rows and/or /// columns are truncated. If the width and/or height are larger than /// previously then an appropriate number of cells are added to the /// buffer and filled with default attributes. /// The resize event invalidates the change stream, discarding it and /// causing a subsequent `get_changes` call to yield a full repaint. /// If the cursor position would be outside the bounds of the newly resized /// screen, it will be moved to be within the new bounds. pub fn resize(&mut self, width: usize, height: usize) { // We need to invalidate the change stream prior to this // event, so we nominally generate an entry for the resize // here. Since rendering a resize doesn't make sense, we // don't record a Change entry. Instead what we do is // increment the sequence number and then flush the whole // stream. The next call to get_changes() will perform a // full repaint, and that is what we want. // We only do this if we have any changes buffered. if !self.changes.is_empty() { self.seqno += 1; self.changes.clear(); } self.lines .resize(height, Line::with_width(width, self.seqno)); for line in &mut self.lines { line.resize(width, self.seqno); } self.width = width; self.height = height; // Ensure that the cursor position is well-defined self.xpos = compute_position_change(self.xpos, &Position::Relative(0), self.width); self.ypos = compute_position_change(self.ypos, &Position::Relative(0), self.height); } /// Efficiently apply a series of changes /// Returns the sequence number at the end of the change. pub fn add_changes(&mut self, mut changes: Vec) -> SequenceNo { let seq = self.seqno.saturating_sub(1) + changes.len(); for change in &changes { self.apply_change(&change); } self.seqno += changes.len(); self.changes.append(&mut changes); seq } /// Apply a change and return the sequence number at the end of the change. pub fn add_change>(&mut self, change: C) -> SequenceNo { let seq = self.seqno; self.seqno += 1; let change = change.into(); self.apply_change(&change); self.changes.push(change); seq } fn apply_change(&mut self, change: &Change) { match change { Change::AllAttributes(attr) => self.attributes = attr.clone(), Change::Text(text) => self.print_text(text), Change::Attribute(change) => self.attributes.apply_change(change), Change::CursorPosition { x, y } => self.set_cursor_pos(x, y), Change::ClearScreen(color) => self.clear_screen(*color), Change::ClearToEndOfLine(color) => self.clear_eol(*color), Change::ClearToEndOfScreen(color) => self.clear_eos(*color), Change::CursorColor(color) => self.cursor_color = *color, Change::CursorShape(shape) => self.cursor_shape = Some(*shape), Change::CursorVisibility(visibility) => self.cursor_visibility = *visibility, Change::Image(image) => self.add_image(image), Change::Title(text) => self.title = text.to_owned(), Change::ScrollRegionUp { first_row, region_size, scroll_count, } => self.scroll_region_up(*first_row, *region_size, *scroll_count), Change::ScrollRegionDown { first_row, region_size, scroll_count, } => self.scroll_region_down(*first_row, *region_size, *scroll_count), Change::LineAttribute(attr) => self.line_attribute(attr), } } fn add_image(&mut self, image: &Image) { let xsize = (image.bottom_right.x - image.top_left.x) / image.width as f32; let ysize = (image.bottom_right.y - image.top_left.y) / image.height as f32; if self.ypos + image.height > self.height { let scroll = (self.ypos + image.height) - self.height; for _ in 0..scroll { self.scroll_screen_up(); } self.ypos -= scroll; } let mut ypos = NotNan::new(0.0).unwrap(); for y in 0..image.height { let mut xpos = NotNan::new(0.0).unwrap(); for x in 0..image.width { self.lines[self.ypos + y].set_cell( self.xpos + x, Cell::new( ' ', self.attributes .clone() .set_image(Box::new(ImageCell::new( TextureCoordinate::new( image.top_left.x + xpos, image.top_left.y + ypos, ), TextureCoordinate::new( image.top_left.x + xpos + xsize, image.top_left.y + ypos + ysize, ), image.image.clone(), ))) .clone(), ), self.seqno, ); xpos += xsize; } ypos += ysize; } self.xpos += image.width; } fn clear_screen(&mut self, color: ColorAttribute) { self.attributes = CellAttributes::default().set_background(color).clone(); let cleared = Cell::new(' ', self.attributes.clone()); for line in &mut self.lines { line.fill_range(0..self.width, &cleared, self.seqno); } self.xpos = 0; self.ypos = 0; } fn clear_eos(&mut self, color: ColorAttribute) { self.attributes = CellAttributes::default().set_background(color).clone(); let cleared = Cell::new(' ', self.attributes.clone()); self.lines[self.ypos].fill_range(self.xpos..self.width, &cleared, self.seqno); for line in &mut self.lines.iter_mut().skip(self.ypos + 1) { line.fill_range(0..self.width, &cleared, self.seqno); } } fn clear_eol(&mut self, color: ColorAttribute) { self.attributes = CellAttributes::default().set_background(color).clone(); let cleared = Cell::new(' ', self.attributes.clone()); self.lines[self.ypos].fill_range(self.xpos..self.width, &cleared, self.seqno); } fn scroll_screen_up(&mut self) { self.lines.remove(0); self.lines.push(Line::with_width(self.width, self.seqno)); } fn scroll_region_up(&mut self, start: usize, size: usize, count: usize) { // Replace the first lines with empty lines for index in start..start + min(count, size) { self.lines[index] = Line::with_width(self.width, self.seqno); } // Rotate the remaining lines up the surface. if 0 < count && count < size { self.lines[start..start + size].rotate_left(count); } } fn scroll_region_down(&mut self, start: usize, size: usize, count: usize) { // Replace the last lines with empty lines for index in start + size - min(count, size)..start + size { self.lines[index] = Line::with_width(self.width, self.seqno); } // Rotate the remaining lines down the surface. if 0 < count && count < size { self.lines[start..start + size].rotate_right(count); } } fn line_attribute(&mut self, attr: &LineAttribute) { let line = &mut self.lines[self.ypos]; match attr { LineAttribute::DoubleHeightTopHalfLine => line.set_double_height_top(self.seqno), LineAttribute::DoubleHeightBottomHalfLine => line.set_double_height_bottom(self.seqno), LineAttribute::DoubleWidthLine => line.set_double_width(self.seqno), LineAttribute::SingleWidthLine => line.set_single_width(self.seqno), } } fn print_text(&mut self, text: &str) { for g in Graphemes::new(text) { if g == "\r\n" { self.xpos = 0; let new_y = self.ypos + 1; if new_y >= self.height { self.scroll_screen_up(); } else { self.ypos = new_y; } continue; } if g == "\r" { self.xpos = 0; continue; } if g == "\n" { let new_y = self.ypos + 1; if new_y >= self.height { self.scroll_screen_up(); } else { self.ypos = new_y; } continue; } if self.xpos >= self.width { let new_y = self.ypos + 1; if new_y >= self.height { self.scroll_screen_up(); } else { self.ypos = new_y; } self.xpos = 0; } let cell = Cell::new_grapheme(g, self.attributes.clone(), None); // the max(1) here is to ensure that we advance to the next cell // position for zero-width graphemes. We want to make sure that // they occupy a cell so that we can re-emit them when we output them. // If we didn't do this, then we'd effectively filter them out from // the model, which seems like a lossy design choice. let width = cell.width().max(1); self.lines[self.ypos].set_cell(self.xpos, cell, self.seqno); // Increment the position now; we'll defer processing // wrapping until the next printed character, otherwise // we'll eagerly scroll when we reach the right margin. self.xpos += width; } } fn set_cursor_pos(&mut self, x: &Position, y: &Position) { self.xpos = compute_position_change(self.xpos, x, self.width); self.ypos = compute_position_change(self.ypos, y, self.height); } /// Returns the entire contents of the screen as a string. /// Only the character data is returned. The end of each line is /// returned as a \n character. /// This function exists primarily for testing purposes. pub fn screen_chars_to_string(&self) -> String { let mut s = String::new(); for line in &self.lines { for cell in line.visible_cells() { s.push_str(cell.str()); } s.push('\n'); } s } /// Returns the cell data for the screen. /// This is intended to be used for testing purposes. pub fn screen_cells(&mut self) -> Vec<&mut [Cell]> { let mut lines = Vec::new(); for line in &mut self.lines { lines.push(line.cells_mut()); } lines } pub fn screen_lines(&self) -> Vec> { self.lines.iter().map(|line| Cow::Borrowed(line)).collect() } /// Returns a stream of changes suitable to update the screen /// to match the model. The input `seq` argument should be 0 /// on the first call, or in any situation where the screen /// contents may have been invalidated, otherwise it should /// be set to the `SequenceNo` returned by the most recent call /// to `get_changes`. /// `get_changes` will use a heuristic to decide on the lower /// cost approach to updating the screen and return some sequence /// of `Change` entries that will update the display accordingly. /// The worst case is that this function will fabricate a sequence /// of Change entries to paint the screen from scratch. pub fn get_changes(&self, seq: SequenceNo) -> (SequenceNo, Cow<[Change]>) { // Do we have continuity in the sequence numbering? let first = self.seqno.saturating_sub(self.changes.len()); if seq == 0 || first > seq || self.seqno == 0 { // No, we have folded away some data, we'll need a full paint return (self.seqno, Cow::Owned(self.repaint_all())); } // Approximate cost to render the change screen let delta_cost = self.seqno - seq; // Approximate cost to repaint from scratch let full_cost = self.estimate_full_paint_cost(); if delta_cost > full_cost { (self.seqno, Cow::Owned(self.repaint_all())) } else { (self.seqno, Cow::Borrowed(&self.changes[seq - first..])) } } pub fn has_changes(&self, seq: SequenceNo) -> bool { self.seqno != seq } pub fn current_seqno(&self) -> SequenceNo { self.seqno } /// After having called `get_changes` and processed the resultant /// change stream, the caller can then pass the returned `SequenceNo` /// value to this call to prune the list of changes and free up /// resources from the change log. pub fn flush_changes_older_than(&mut self, seq: SequenceNo) { let first = self.seqno.saturating_sub(self.changes.len()); let idx = seq.saturating_sub(first); if idx > self.changes.len() { return; } self.changes = self.changes.split_off(idx); } /// Without allocating resources, estimate how many Change entries /// we would produce in repaint_all for the current state. fn estimate_full_paint_cost(&self) -> usize { // assume 1 per cell with 20% overhead for attribute changes 3 + (((self.width * self.height) as f64) * 1.2) as usize } fn repaint_all(&self) -> Vec { let mut result = vec![ // Home the cursor and clear the screen to defaults. Hide the // cursor while we're repainting. Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), ]; if !self.title.is_empty() { result.push(Change::Title(self.title.to_owned())); } let mut attr = CellAttributes::default(); let crlf = Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }; // Walk backwards through the lines; the goal is to determine // if the screen ends with a number of clear lines that we // can coalesce together as a ClearToEndOfScreen op. // We track the index (from the end) of the last matching // run, together with the color of that run. let mut trailing_color = None; let mut trailing_idx = None; for (idx, line) in self.lines.iter().rev().enumerate() { let changes = line.changes(&attr); if changes.is_empty() { // The line recorded no changes; this means that the line // consists of spaces and the default background color match trailing_color { Some(other) if other != Default::default() => { // Color doesn't match up, so we have to stop // looking for the ClearToEndOfScreen run here break; } // Color does match Some(_) => continue, // we don't have a run, we should start one None => { trailing_color = Some(Default::default()); trailing_idx = Some(idx); continue; } } } else { let last_change = changes.len() - 1; match (&changes[last_change], trailing_color) { (&Change::ClearToEndOfLine(ref color), None) => { trailing_color = Some(*color); trailing_idx = Some(idx); } (&Change::ClearToEndOfLine(ref color), Some(other)) => { if other == *color { trailing_idx = Some(idx); continue; } else { break; } } _ => break, } } } for (idx, line) in self.lines.iter().enumerate() { match trailing_idx { Some(t) if self.height - t == idx => { let color = trailing_color.expect("didn't set trailing_color along with trailing_idx"); // The first in the sequence of the ClearToEndOfLine may // be batched up here; let's remove it if that is the case. let last_result = result.len() - 1; match result[last_result] { Change::ClearToEndOfLine(col) if col == color => { result.remove(last_result); } _ => {} } result.push(Change::ClearToEndOfScreen(color)); break; } _ => {} } let mut changes = line.changes(&attr); if idx != 0 { // We emit a relative move at the end of each // line with the theory that this will translate // to a short \r\n sequence rather than the longer // absolute cursor positioning sequence result.push(crlf.clone()); } result.append(&mut changes); if let Some(c) = line.visible_cells().last() { attr = c.attrs().clone(); } } // Remove any trailing sequence of cursor movements, as we're // going to just finish up with an absolute move anyway. loop { let result_len = result.len(); if result_len == 0 { break; } match result[result_len - 1] { Change::CursorPosition { .. } => { result.remove(result_len - 1); } _ => break, } } // Place the cursor at its intended position, but only if we moved the // cursor. We don't explicitly track movement but can infer it from the // size of the results: results will have an initial ClearScreen entry // that homes the cursor and a CursorShape entry that hides the cursor. // If the screen is otherwise blank there will be no further entries // and we don't need to emit cursor movement. However, in the // optimization passes above, we may have removed some number of // movement entries, so let's be sure to check the cursor position to // make sure that we don't fail to emit movement. let moved_cursor = result.len() != 2; if moved_cursor || self.xpos != 0 || self.ypos != 0 { result.push(Change::CursorPosition { x: Position::Absolute(self.xpos), y: Position::Absolute(self.ypos), }); } // Set the intended cursor shape. We hid the cursor at the start // of the repaint, so no need to hide it again. if self.cursor_visibility != CursorVisibility::Hidden { result.push(Change::CursorVisibility(CursorVisibility::Visible)); if let Some(shape) = self.cursor_shape { result.push(Change::CursorShape(shape)); } } result } /// Computes the change stream required to make the region within `self` /// at coordinates `x`, `y` and size `width`, `height` look like the /// same sized region within `other` at coordinates `other_x`, `other_y`. /// /// `other` and `self` may be the same, causing regions within the same /// `Surface` to be differenced; this is used by the `copy_region` method. /// /// The returned list of `Change`s can be passed to the `add_changes` method /// to make the region within self match the region within other. #[allow(clippy::too_many_arguments)] pub fn diff_region( &self, x: usize, y: usize, width: usize, height: usize, other: &Surface, other_x: usize, other_y: usize, ) -> Vec { let mut diff_state = DiffState::default(); for ((row_num, line), other_line) in self .lines .iter() .enumerate() .skip(y) .take_while(|(row_num, _)| *row_num < y + height) .zip(other.lines.iter().skip(other_y)) { diff_line( &mut diff_state, line, row_num, other_line, x, width, other_x, ); } diff_state.changes } pub fn diff_lines(&self, other_lines: Vec<&Line>) -> Vec { let mut diff_state = DiffState::default(); for ((row_num, line), other_line) in self.lines.iter().enumerate().zip(other_lines.iter()) { diff_line(&mut diff_state, line, row_num, other_line, 0, line.len(), 0); } diff_state.changes } pub fn diff_against_numbered_line(&self, row_num: usize, other_line: &Line) -> Vec { let mut diff_state = DiffState::default(); if let Some(line) = self.lines.get(row_num) { diff_line(&mut diff_state, line, row_num, other_line, 0, line.len(), 0); } diff_state.changes } /// Computes the change stream required to make `self` have the same /// screen contents as `other`. pub fn diff_screens(&self, other: &Surface) -> Vec { self.diff_region(0, 0, self.width, self.height, other, 0, 0) } /// Draw the contents of `other` into self at the specified coordinates. /// The required updates are recorded as Change entries as well as stored /// in the screen line/cell data. /// Saves the cursor position and attributes that were in effect prior to /// calling `draw_from_screen` and restores them after applying the changes /// from the other surface. pub fn draw_from_screen(&mut self, other: &Surface, x: usize, y: usize) -> SequenceNo { let attrs = self.attributes.clone(); let cursor = (self.xpos, self.ypos); let changes = self.diff_region(x, y, other.width, other.height, other, 0, 0); let seq = self.add_changes(changes); self.xpos = cursor.0; self.ypos = cursor.1; self.attributes = attrs; seq } /// Copy the contents of the specified region to the same sized /// region elsewhere in the screen display. /// The regions may overlap. /// # Panics /// The destination region must be the same size as the source /// (which is implied by the function parameters) and must fit /// within the width and height of the Surface or this operation /// will panic. pub fn copy_region( &mut self, src_x: usize, src_y: usize, width: usize, height: usize, dest_x: usize, dest_y: usize, ) -> SequenceNo { let changes = self.diff_region(dest_x, dest_y, width, height, self, src_x, src_y); self.add_changes(changes) } } /// Populate `diff_state` with changes to replace contents of `line` in range [x,x+width) /// with the contents of `other_line` in range [other_x,other_x+width). fn diff_line( diff_state: &mut DiffState, line: &Line, row_num: usize, other_line: &Line, x: usize, width: usize, other_x: usize, ) { let mut cells = line .visible_cells() .skip_while(|cell| cell.cell_index() < x) .take_while(|cell| cell.cell_index() < x + width) .peekable(); let other_cells = other_line .visible_cells() .skip_while(|cell| cell.cell_index() < other_x) .take_while(|cell| cell.cell_index() < other_x + width); for other_cell in other_cells { let rel_x = other_cell.cell_index() - other_x; let mut comparison_cell = None; // Advance the `cells` iterator to try to find the visible cell in `line` in the equivalent // position to `other_cell`. If there is no visible cell in equivalent position, advance // one past and wait for next iteration. while let Some(cell) = cells.peek() { let cell_rel_x = cell.cell_index() - x; if cell_rel_x == rel_x { comparison_cell = Some(*cell); break; } else if cell_rel_x > rel_x { break; } cells.next(); } // If we find a cell in the equivalent position, diff against it. If not, we know // there is a multi-cell grapheme in `line` that partially overlaps `other_cell`, // so we have to overwrite anyway. if let Some(comparison_cell) = comparison_cell { diff_state.diff_cells(x + rel_x, row_num, comparison_cell, other_cell); } else { diff_state.set_cell(x + rel_x, row_num, other_cell); } } } /// Applies a Position update to either the x or y position. /// The value is clamped to be in the range: 0..limit fn compute_position_change(current: usize, pos: &Position, limit: usize) -> usize { use self::Position::*; match pos { Relative(delta) => { if *delta >= 0 { min( current.saturating_add(*delta as usize), limit.saturating_sub(1), ) } else { current.saturating_sub((*delta).abs() as usize) } } Absolute(abs) => min(*abs, limit.saturating_sub(1)), EndRelative(delta) => limit.saturating_sub(*delta), } } #[cfg(test)] mod test { use super::*; use crate::cell::{AttributeChange, Intensity}; use crate::color::AnsiColor; use crate::image::ImageData; use std::sync::Arc; // The \x20's look a little awkward, but we can't use a plain // space in the first chararcter of a multi-line continuation; // it gets eaten up and ignored. #[test] fn basic_print() { let mut s = Surface::new(4, 3); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20\x20\n\ \x20\x20\x20\x20\n\ \x20\x20\x20\x20\n" ); s.add_change("w00t"); assert_eq!( s.screen_chars_to_string(), "w00t\n\ \x20\x20\x20\x20\n\ \x20\x20\x20\x20\n" ); s.add_change("foo"); assert_eq!( s.screen_chars_to_string(), "w00t\n\ foo\x20\n\ \x20\x20\x20\x20\n" ); s.add_change("baar"); assert_eq!( s.screen_chars_to_string(), "w00t\n\ foob\n\ aar\x20\n" ); s.add_change("baz"); assert_eq!( s.screen_chars_to_string(), "foob\n\ aarb\n\ az\x20\x20\n" ); } #[test] fn newline() { let mut s = Surface::new(4, 4); s.add_change("bloo\rwat\n hey\r\nho"); assert_eq!( s.screen_chars_to_string(), "wato\n\ \x20\x20\x20\x20\n\ hey \n\ ho \n" ); } #[test] fn clear_screen() { let mut s = Surface::new(2, 2); s.add_change("hello"); assert_eq!(s.xpos, 1); assert_eq!(s.ypos, 1); s.add_change(Change::ClearScreen(Default::default())); assert_eq!(s.xpos, 0); assert_eq!(s.ypos, 0); assert_eq!(s.screen_chars_to_string(), " \n \n"); } #[test] fn clear_eol() { let mut s = Surface::new(3, 3); s.add_change("helwowfoo"); s.add_change(Change::ClearToEndOfLine(Default::default())); assert_eq!(s.screen_chars_to_string(), "hel\nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(0), }); s.add_change(Change::ClearToEndOfLine(Default::default())); assert_eq!(s.screen_chars_to_string(), " \nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::ClearToEndOfLine(Default::default())); assert_eq!(s.screen_chars_to_string(), " \nw\nfoo\n"); } #[test] fn clear_eos() { let mut s = Surface::new(3, 3); s.add_change("helwowfoo"); s.add_change(Change::ClearToEndOfScreen(Default::default())); assert_eq!(s.screen_chars_to_string(), "hel\nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::ClearToEndOfScreen(Default::default())); assert_eq!(s.screen_chars_to_string(), "hel\nw\n \n"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text("hel".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::Text("w".into()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn clear_eos_back_color() { let mut s = Surface::new(3, 3); s.add_change(Change::ClearScreen(AnsiColor::Red.into())); s.add_change("helwowfoo"); assert_eq!(s.screen_chars_to_string(), "hel\nwow\nfoo\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::ClearToEndOfScreen(AnsiColor::Red.into())); assert_eq!(s.screen_chars_to_string(), "hel\nw \n \n"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::AllAttributes( CellAttributes::default() .set_background(AnsiColor::Red) .clone() ), Change::Text("hel".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::Text("w".into()), Change::ClearToEndOfScreen(AnsiColor::Red.into()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn clear_eol_opt() { let mut s = Surface::new(3, 3); s.add_change(Change::Attribute(AttributeChange::Background( AnsiColor::Red.into(), ))); s.add_change("111 333"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::AllAttributes( CellAttributes::default() .set_background(AnsiColor::Red) .clone() ), Change::Text("111".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::ClearToEndOfLine(AnsiColor::Red.into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Relative(1), }, Change::Text("333".into()), Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn clear_and_move_cursor() { let mut s = Surface::new(4, 3); s.add_change(Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn cursor_movement() { let mut s = Surface::new(4, 3); s.add_change(Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(2), }); s.add_change("X"); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20\x20\n\ \x20\x20\x20\x20\n\ \x20\x20\x20X\n" ); s.add_change(Change::CursorPosition { x: Position::Relative(-2), y: Position::Relative(-1), }); s.add_change("-"); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20\x20\n\ \x20\x20-\x20\n\ \x20\x20\x20X\n" ); s.add_change(Change::CursorPosition { x: Position::Relative(1), y: Position::Relative(-1), }); s.add_change("-"); assert_eq!( s.screen_chars_to_string(), "\x20\x20\x20-\n\ \x20\x20-\x20\n\ \x20\x20\x20X\n" ); } #[test] fn attribute_setting() { use crate::cell::Intensity; let mut s = Surface::new(3, 1); s.add_change("n"); s.add_change(AttributeChange::Intensity(Intensity::Bold)); s.add_change("b"); let mut bold = CellAttributes::default(); bold.set_intensity(Intensity::Bold); assert_eq!( s.screen_cells(), [[ Cell::new('n', CellAttributes::default()), Cell::new('b', bold), Cell::default(), ]] ); } #[test] fn empty_changes() { let s = Surface::new(4, 3); let empty = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::CursorVisibility(CursorVisibility::Visible), ]; let (seq, changes) = s.get_changes(0); assert_eq!(seq, 0); assert_eq!(empty, &*changes); // Using an invalid sequence number should get us the full // repaint also. let (seq, changes) = s.get_changes(1); assert_eq!(seq, 0); assert_eq!(empty, &*changes); } #[test] fn add_changes_empty() { let mut s = Surface::new(2, 2); let last_seq = s.add_change("foo"); assert_eq!(0, last_seq); assert_eq!(last_seq, s.add_changes(vec![])); assert_eq!(last_seq + 1, s.add_changes(vec![Change::Text("a".into())])); } #[test] fn resize_delta_flush() { let mut s = Surface::new(4, 3); s.add_change("a"); let (seq, _) = s.get_changes(0); s.resize(2, 2); let full = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text("a".to_string()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(0), }, Change::CursorVisibility(CursorVisibility::Visible), ]; let (_seq, changes) = s.get_changes(seq); // The resize causes get_changes to return a full repaint assert_eq!(full, &*changes); } #[test] fn dont_lose_first_char_on_attr_change() { let mut s = Surface::new(2, 2); s.add_change(Change::Attribute(AttributeChange::Foreground( AnsiColor::Maroon.into(), ))); s.add_change("ab"); let (_seq, changes) = s.get_changes(0); assert_eq!( &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::AllAttributes( CellAttributes::default() .set_foreground(AnsiColor::Maroon) .clone() ), Change::Text("ab".into()), Change::CursorPosition { x: Position::Absolute(2), y: Position::Absolute(0), }, Change::CursorVisibility(CursorVisibility::Visible), ], &*changes ); } #[test] fn resize_cursor_position() { let mut s = Surface::new(4, 4); s.add_change(" a"); s.add_change(Change::CursorPosition { x: Position::Absolute(3), y: Position::Absolute(3), }); assert_eq!(s.xpos, 3); assert_eq!(s.ypos, 3); s.resize(2, 2); assert_eq!(s.xpos, 1); assert_eq!(s.ypos, 1); let full = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text(" a".to_string()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }, Change::CursorVisibility(CursorVisibility::Visible), ]; let (_seq, changes) = s.get_changes(0); assert_eq!(full, &*changes); } #[test] fn delta_change() { let mut s = Surface::new(4, 3); // flushing nothing should be a NOP s.flush_changes_older_than(0); // check that using an invalid index doesn't panic s.flush_changes_older_than(1); let initial = &[ Change::CursorVisibility(CursorVisibility::Hidden), Change::ClearScreen(Default::default()), Change::Text("a".to_string()), Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(0), }, Change::CursorVisibility(CursorVisibility::Visible), ]; let seq_pos = { let next_seq = s.add_change("a"); let (seq, changes) = s.get_changes(0); assert_eq!(seq, next_seq + 1); assert_eq!(initial, &*changes); seq }; let seq_pos = { let next_seq = s.add_change("b"); let (seq, changes) = s.get_changes(seq_pos); assert_eq!(seq, next_seq + 1); assert_eq!(&[Change::Text("b".to_string())], &*changes); seq }; // prep some deltas for the loop to test below { s.add_change(Change::Attribute(AttributeChange::Intensity( Intensity::Bold, ))); s.add_change("c"); s.add_change(Change::Attribute(AttributeChange::Intensity( Intensity::Normal, ))); s.add_change("d"); } // Do this three times to ennsure that the behavior is consistent // across multiple flush calls for _ in 0..3 { { let (_seq, changes) = s.get_changes(seq_pos); assert_eq!( &[ Change::Attribute(AttributeChange::Intensity(Intensity::Bold)), Change::Text("c".to_string()), Change::Attribute(AttributeChange::Intensity(Intensity::Normal)), Change::Text("d".to_string()), ], &*changes ); } // Flush the changes so that the next iteration is run on a pruned // set of changes. It should not change the outcome of the body // of the loop. s.flush_changes_older_than(seq_pos); } } #[test] fn diff_screens() { let mut s = Surface::new(4, 3); s.add_change("w00t"); s.add_change("foo"); s.add_change("baar"); s.add_change("baz"); assert_eq!( s.screen_chars_to_string(), "foob\n\ aarb\n\ az \n" ); let s2 = Surface::new(2, 2); { // We want to sample the top left corner let changes = s2.diff_region(0, 0, 2, 2, &s, 0, 0); assert_eq!( vec![ Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(0), }, Change::AllAttributes(CellAttributes::default()), Change::Text("fo".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(1), }, Change::Text("aa".into()), ], changes ); } // Throw in some attribute changes too s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(1), }); s.add_change(Change::Attribute(AttributeChange::Intensity( Intensity::Bold, ))); s.add_change("XO"); { let changes = s2.diff_region(0, 0, 2, 2, &s, 1, 1); assert_eq!( vec![ Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(0), }, Change::AllAttributes( CellAttributes::default() .set_intensity(Intensity::Bold) .clone(), ), Change::Text("XO".into()), Change::CursorPosition { x: Position::Absolute(0), y: Position::Absolute(1), }, Change::AllAttributes(CellAttributes::default()), Change::Text("z".into()), /* There's no change for the final character * position because it is a space in both regions. */ ], changes ); } } #[test] fn draw_screens() { let mut s = Surface::new(4, 4); let mut s1 = Surface::new(2, 2); s1.add_change("1234"); let mut s2 = Surface::new(2, 2); s2.add_change("XYZA"); s.draw_from_screen(&s1, 0, 0); s.draw_from_screen(&s2, 2, 2); assert_eq!( s.screen_chars_to_string(), "12 \n\ 34 \n\ \x20\x20XY\n\ \x20\x20ZA\n" ); } #[test] fn draw_colored_region() { let mut dest = Surface::new(4, 4); dest.add_change("A"); let mut src = Surface::new(2, 2); src.add_change(Change::ClearScreen(AnsiColor::Blue.into())); dest.draw_from_screen(&src, 2, 2); assert_eq!( dest.screen_chars_to_string(), "A \n\ \x20 \n\ \x20 \n\ \x20 \n" ); let blue_space = Cell::new( ' ', CellAttributes::default() .set_background(AnsiColor::Blue) .clone(), ); assert_eq!( dest.screen_cells(), [ [ Cell::new('A', CellAttributes::default()), Cell::default(), Cell::default(), Cell::default(), ], [ Cell::default(), Cell::default(), Cell::default(), Cell::default(), ], [ Cell::default(), Cell::default(), blue_space.clone(), blue_space.clone(), ], [ Cell::default(), Cell::default(), blue_space.clone(), blue_space.clone(), ] ] ); assert_eq!(dest.xpos, 1); assert_eq!(dest.ypos, 0); assert_eq!(dest.attributes, Default::default()); dest.add_change("B"); assert_eq!( dest.screen_chars_to_string(), "AB \n\ \x20 \n\ \x20 \n\ \x20 \n" ); } #[test] fn copy_region() { let mut s = Surface::new(4, 3); s.add_change("w00t"); s.add_change("foo"); s.add_change("baar"); s.add_change("baz"); assert_eq!( s.screen_chars_to_string(), "foob\n\ aarb\n\ az \n" ); // Copy top left to bottom left s.copy_region(0, 0, 2, 2, 2, 1); assert_eq!( s.screen_chars_to_string(), "foob\n\ aafo\n\ azaa\n" ); } #[test] fn double_width() { let mut s = Surface::new(4, 1); s.add_change("🤷12"); assert_eq!(s.screen_chars_to_string(), "🤷12\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(1), y: Position::Absolute(0), }); s.add_change("a🤷"); assert_eq!(s.screen_chars_to_string(), " a🤷\n"); s.add_change(Change::CursorPosition { x: Position::Absolute(2), y: Position::Absolute(0), }); s.add_change("x"); assert_eq!(s.screen_chars_to_string(), " ax \n"); } #[test] fn draw_double_width() { let mut s = Surface::new(4, 1); s.add_change("ã‹ a"); assert_eq!(s.screen_chars_to_string(), "ã‹ a\n"); let mut s2 = Surface::new(4, 1); s2.draw_from_screen(&s, 0, 0); // Verify no issue when the second visible cells on both sides // are identical (' 's) but they are at different cell indices. assert_eq!(s2.screen_chars_to_string(), "ã‹ a\n"); let s3 = Surface::new(4, 1); s2.draw_from_screen(&s3, 0, 0); // Verify same but in other direction assert_eq!(s2.screen_chars_to_string(), " \n"); let mut s4 = Surface::new(4, 1); s4.add_change("abcd"); s.draw_from_screen(&s4, 0, 0); // Verify that all overlapping cells are updated when cell widths // differ on each side. assert_eq!(s.screen_chars_to_string(), "abcd\n"); } #[test] fn diff_cursor_double_width() { let mut s = Surface::new(3, 1); s.add_change("ã‹a"); let s2 = Surface::new(3, 1); let changes = s2.diff_region(0, 0, 3, 1, &s, 0, 0); assert_eq!( changes .iter() .filter(|change| matches!(change, Change::CursorPosition { .. })) .count(), 1 ); } #[test] fn zero_width() { let mut s = Surface::new(4, 1); // https://en.wikipedia.org/wiki/Zero-width_space s.add_change("A\u{200b}B"); assert_eq!(s.screen_chars_to_string(), "A\u{200b}B \n"); } #[test] fn images() { // a dummy image blob with nonsense content let data = Arc::new(ImageData::with_raw_data(vec![])); let mut s = Surface::new(2, 2); s.add_change(Change::Image(Image { top_left: TextureCoordinate::new_f32(0.0, 0.0), bottom_right: TextureCoordinate::new_f32(1.0, 1.0), image: data.clone(), width: 4, height: 2, })); // We're checking that we slice the image up and assign the correct // texture coordinates for each cell. The width and height are // different from each other to help ensure that the right terms // are used by add_image() function. assert_eq!( s.screen_cells(), [ [ Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.0, 0.0), TextureCoordinate::new_f32(0.25, 0.5), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.25, 0.0), TextureCoordinate::new_f32(0.5, 0.5), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.5, 0.0), TextureCoordinate::new_f32(0.75, 0.5), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.75, 0.0), TextureCoordinate::new_f32(1.0, 0.5), data.clone() ))) .clone() ), ], [ Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.0, 0.5), TextureCoordinate::new_f32(0.25, 1.0), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.25, 0.5), TextureCoordinate::new_f32(0.5, 1.0), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.5, 0.5), TextureCoordinate::new_f32(0.75, 1.0), data.clone() ))) .clone() ), Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.75, 0.5), TextureCoordinate::new_f32(1.0, 1.0), data.clone() ))) .clone() ), ], ] ); // Check that starting at not the texture origin coordinates // gives reasonable values in the resultant cell let mut other = Surface::new(1, 1); other.add_change(Change::Image(Image { top_left: TextureCoordinate::new_f32(0.25, 0.3), bottom_right: TextureCoordinate::new_f32(0.75, 0.8), image: data.clone(), width: 1, height: 1, })); assert_eq!( other.screen_cells(), [[Cell::new( ' ', CellAttributes::default() .set_image(Box::new(ImageCell::new( TextureCoordinate::new_f32(0.25, 0.3), TextureCoordinate::new_f32(0.75, 0.8), data.clone() ))) .clone() ),]] ); } } termwiz-0.22.0/src/terminal/buffered.rs000064400000000000000000000107351046102023000161460ustar 00000000000000//! A Terminal buffered with a Surface use crate::surface::{SequenceNo, Surface}; use crate::terminal::Terminal; use crate::Result; use std::ops::{Deref, DerefMut}; /// `BufferedTerminal` is a convenience wrapper around both /// a `Terminal` and a `Surface`. It enables easier use of /// the output optimization features available to `Surface` /// and internally keeps track of the sequence number. /// `BufferedTerminal` derefs to `Surface` and makes available /// the surface API. /// The `flush` method is used to compute the optimized set /// of changes and actually render them to the underlying /// `Terminal`. No output will be visible until it is flushed! pub struct BufferedTerminal { terminal: T, surface: Surface, seqno: SequenceNo, } impl BufferedTerminal { /// Create a new `BufferedTerminal` with a `Surface` of /// a matching size. pub fn new(mut terminal: T) -> Result { let size = terminal.get_screen_size()?; let surface = Surface::new(size.cols, size.rows); Ok(Self { terminal, surface, seqno: 0, }) } /// Get a mutable reference to the underlying terminal instance pub fn terminal(&mut self) -> &mut T { &mut self.terminal } /// Compute the set of changes needed to update the screen to /// match the current contents of the embedded `Surface` and /// send them to the `Terminal`. /// If some other process has output over the terminal screen, /// or other artifacts are present, this routine has no way to /// detect the lose of synchronization. /// Applications typically build in a refresh function (CTRL-L /// is common for unix applications) to request a repaint. /// You can use the `repaint` function for that situation. pub fn flush(&mut self) -> Result<()> { { let (seq, changes) = self.surface.get_changes(self.seqno); // If we encounter an error during rendering, we want to // reset the sequence number so that a subsequent paint // renders all. self.seqno = 0; self.terminal.render(&changes)?; //self.terminal.flush()?; self.seqno = seq; } self.surface.flush_changes_older_than(self.seqno); Ok(()) } /// Clears the screen and re-draws the surface contents onto /// the Terminal. pub fn repaint(&mut self) -> Result<()> { self.seqno = 0; self.flush() } /// Check to see if the Terminal has been resized by its user. /// If it has, resize the surface to match the new dimensions /// and return true. If the terminal was resized, the application /// will typically want to apply changes to match the new size /// and follow it up with a `flush` call to update the screen. /// /// Why isn't this automatic? On Unix systems the SIGWINCH signal /// is used to indicate that a terminal size has changed. This notification /// is completely out of band from the interactions with the underlying /// terminal device, and thus requires a function such as this one to /// be called after receipt of SIGWINCH, or just speculatively from time /// to time. /// /// Attaching signal handlers unilaterally from a library is undesirable, /// as the embedding application may have strong opinions about how /// best to do such a thing, so we do not automatically configure a /// signal handler. /// /// On Windows it is possible to receive notification about window /// resizing by processing input events. Enabling those requires /// manipulating the input mode and establishing a handler to /// consume the input records. Such a thing is possible, but is /// better suited for a higher level abstraction than this basic /// `BufferedTerminal` interface. pub fn check_for_resize(&mut self) -> Result { let size = self.terminal.get_screen_size()?; let (width, height) = self.surface.dimensions(); if (width != size.cols) || (height != size.rows) { self.surface.resize(size.cols, size.rows); Ok(true) } else { Ok(false) } } } impl Deref for BufferedTerminal { type Target = Surface; fn deref(&self) -> &Surface { &self.surface } } impl DerefMut for BufferedTerminal { fn deref_mut(&mut self) -> &mut Surface { &mut self.surface } } termwiz-0.22.0/src/terminal/mod.rs000064400000000000000000000116431046102023000151420ustar 00000000000000//! An abstraction over a terminal device use crate::caps::probed::ProbeCapabilities; use crate::caps::Capabilities; use crate::input::InputEvent; use crate::surface::Change; use crate::{format_err, Result}; use num_traits::NumCast; use std::fmt::Display; use std::time::Duration; #[cfg(unix)] pub mod unix; #[cfg(windows)] pub mod windows; pub mod buffered; #[cfg(unix)] pub use self::unix::{UnixTerminal, UnixTerminalWaker as TerminalWaker}; #[cfg(windows)] pub use self::windows::{WindowsTerminal, WindowsTerminalWaker as TerminalWaker}; /// Represents the size of the terminal screen. /// The number of rows and columns of character cells are expressed. /// Some implementations populate the size of those cells in pixels. // On Windows, GetConsoleFontSize() can return the size of a cell in // logical units and we can probably use this to populate xpixel, ypixel. // GetConsoleScreenBufferInfo() can return the rows and cols. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ScreenSize { /// The number of rows of text pub rows: usize, /// The number of columns per row pub cols: usize, /// The width of a cell in pixels. Some implementations never /// set this to anything other than zero. pub xpixel: usize, /// The height of a cell in pixels. Some implementations never /// set this to anything other than zero. pub ypixel: usize, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Blocking { DoNotWait, Wait, } /// `Terminal` abstracts over some basic terminal capabilities. /// If the `set_raw_mode` or `set_cooked_mode` functions are used in /// any combination, the implementation is required to restore the /// terminal mode that was in effect when it was created. pub trait Terminal { /// Raw mode disables input line buffering, allowing data to be /// read as the user presses keys, disables local echo, so keys /// pressed by the user do not implicitly render to the terminal /// output, and disables canonicalization of unix newlines to CRLF. fn set_raw_mode(&mut self) -> Result<()>; fn set_cooked_mode(&mut self) -> Result<()>; /// Enter the alternate screen. The alternate screen will be left /// automatically when the `Terminal` is dropped. fn enter_alternate_screen(&mut self) -> Result<()>; /// Exit the alternate screen. fn exit_alternate_screen(&mut self) -> Result<()>; /// Queries the current screen size, returning width, height. fn get_screen_size(&mut self) -> Result; /// Returns a capability probing helper that will use escape /// sequences to attempt to probe information from the terminal fn probe_capabilities(&mut self) -> Option { None } /// Sets the current screen size fn set_screen_size(&mut self, size: ScreenSize) -> Result<()>; /// Render a series of changes to the terminal output fn render(&mut self, changes: &[Change]) -> Result<()>; /// Flush any buffered output fn flush(&mut self) -> Result<()>; /// Check for a parsed input event. /// `wait` indicates the behavior in the case that no input is /// immediately available. If wait is `None` then `poll_input` /// will not return until an event is available. If wait is /// `Some(duration)` then `poll_input` will wait up to the given /// duration for an event before returning with a value of /// `Ok(None)`. If wait is `Some(Duration::ZERO)` then the /// poll is non-blocking. /// /// The possible values returned as `InputEvent`s depend on the /// mode of the terminal. Most values are not returned unless /// the terminal is set to raw mode. fn poll_input(&mut self, wait: Option) -> Result>; fn waker(&self) -> TerminalWaker; } /// `SystemTerminal` is a concrete implementation of `Terminal`. /// Ideally you wouldn't reference `SystemTerminal` in consuming /// code. This type is exposed for convenience if you are doing /// something unusual and want easier access to the constructors. #[cfg(unix)] pub type SystemTerminal = UnixTerminal; #[cfg(windows)] pub type SystemTerminal = WindowsTerminal; /// Construct a new instance of Terminal. /// The terminal will have a renderer that is influenced by the configuration /// in the provided `Capabilities` instance. /// The terminal will explicitly open `/dev/tty` on Unix systems and /// `CONIN$` and `CONOUT$` on Windows systems, so that it should yield a /// functioning console with minimal headaches. /// If you have a more advanced use case you will want to look to the /// constructors for `UnixTerminal` and `WindowsTerminal` and call whichever /// one is most suitable for your needs. pub fn new_terminal(caps: Capabilities) -> Result { SystemTerminal::new(caps) } pub(crate) fn cast(n: T) -> Result { num_traits::cast(n).ok_or_else(|| format_err!("{} is out of bounds for this system", n)) } termwiz-0.22.0/src/terminal/unix.rs000064400000000000000000000421631046102023000153470ustar 00000000000000use crate::render::RenderTty; use crate::terminal::ProbeCapabilities; use crate::{bail, Context, Result}; use filedescriptor::{poll, pollfd, FileDescriptor, POLLIN}; use libc::{self, winsize}; use signal_hook::{self, SigId}; use std::collections::VecDeque; use std::error::Error as _; use std::fs::OpenOptions; use std::io::{stdin, stdout, Error as IoError, ErrorKind, Read, Write}; use std::mem; use std::os::unix::io::AsRawFd; use std::os::unix::net::UnixStream; use std::sync::{Arc, Mutex}; use std::time::Duration; use termios::{ cfmakeraw, tcdrain, tcflush, tcsetattr, Termios, TCIFLUSH, TCIOFLUSH, TCOFLUSH, TCSADRAIN, TCSAFLUSH, TCSANOW, }; use crate::caps::Capabilities; use crate::escape::csi::{DecPrivateMode, DecPrivateModeCode, Mode, XtermKeyModifierResource, CSI}; use crate::input::{InputEvent, InputParser}; use crate::render::terminfo::TerminfoRenderer; use crate::surface::Change; use crate::terminal::{cast, Blocking, ScreenSize, Terminal}; const BUF_SIZE: usize = 4096; pub enum Purge { InputQueue, OutputQueue, InputAndOutputQueue, } pub enum SetAttributeWhen { /// changes are applied immediately Now, /// Apply once the current output queue has drained AfterDrainOutputQueue, /// Wait for the current output queue to drain, then /// discard any unread input AfterDrainOutputQueuePurgeInputQueue, } pub trait UnixTty { fn get_size(&mut self) -> Result; fn set_size(&mut self, size: winsize) -> Result<()>; fn get_termios(&mut self) -> Result; fn set_termios(&mut self, termios: &Termios, when: SetAttributeWhen) -> Result<()>; /// Waits until all written data has been transmitted. fn drain(&mut self) -> Result<()>; fn purge(&mut self, purge: Purge) -> Result<()>; } pub struct TtyReadHandle { fd: FileDescriptor, } impl TtyReadHandle { fn new(fd: FileDescriptor) -> Self { Self { fd } } fn set_blocking(&mut self, blocking: Blocking) -> Result<()> { self.fd.set_non_blocking(blocking == Blocking::DoNotWait)?; Ok(()) } } impl Read for TtyReadHandle { fn read(&mut self, buf: &mut [u8]) -> std::result::Result { let size = unsafe { libc::read(self.fd.as_raw_fd(), buf.as_mut_ptr() as *mut _, buf.len()) }; if size == -1 { Err(IoError::last_os_error()) } else { Ok(size as usize) } } } pub struct TtyWriteHandle { fd: FileDescriptor, write_buffer: Vec, } impl TtyWriteHandle { fn new(fd: FileDescriptor) -> Self { Self { fd, write_buffer: Vec::with_capacity(BUF_SIZE), } } fn flush_local_buffer(&mut self) -> std::result::Result<(), IoError> { if !self.write_buffer.is_empty() { self.fd.write_all(&self.write_buffer)?; self.write_buffer.clear(); } Ok(()) } fn modify_other_keys(&mut self, level: i64) -> std::io::Result<()> { write!( self, "{}", CSI::Mode(Mode::XtermKeyMode { resource: XtermKeyModifierResource::OtherKeys, value: Some(level), }) ) } } impl Write for TtyWriteHandle { fn write(&mut self, buf: &[u8]) -> std::result::Result { if self.write_buffer.len() + buf.len() > self.write_buffer.capacity() { self.flush()?; } if buf.len() >= self.write_buffer.capacity() { self.fd.write(buf) } else { self.write_buffer.write(buf) } } fn flush(&mut self) -> std::result::Result<(), IoError> { self.flush_local_buffer()?; self.drain() .map_err(|e| IoError::new(ErrorKind::Other, format!("{}", e)))?; Ok(()) } } impl RenderTty for TtyWriteHandle { fn get_size_in_cells(&mut self) -> Result<(usize, usize)> { let size = self.get_size()?; Ok((size.ws_col as usize, size.ws_row as usize)) } } impl UnixTty for TtyWriteHandle { fn get_size(&mut self) -> Result { let mut size: winsize = unsafe { mem::zeroed() }; if unsafe { libc::ioctl(self.fd.as_raw_fd(), libc::TIOCGWINSZ as _, &mut size) } != 0 { bail!("failed to ioctl(TIOCGWINSZ): {}", IoError::last_os_error()); } Ok(size) } fn set_size(&mut self, size: winsize) -> Result<()> { if unsafe { libc::ioctl( self.fd.as_raw_fd(), libc::TIOCSWINSZ as _, &size as *const _, ) } != 0 { bail!( "failed to ioctl(TIOCSWINSZ): {:?}", IoError::last_os_error() ); } Ok(()) } fn get_termios(&mut self) -> Result { Termios::from_fd(self.fd.as_raw_fd()).context("get_termios failed") } fn set_termios(&mut self, termios: &Termios, when: SetAttributeWhen) -> Result<()> { let when = match when { SetAttributeWhen::Now => TCSANOW, SetAttributeWhen::AfterDrainOutputQueue => TCSADRAIN, SetAttributeWhen::AfterDrainOutputQueuePurgeInputQueue => TCSAFLUSH, }; tcsetattr(self.fd.as_raw_fd(), when, termios).context("set_termios failed") } fn drain(&mut self) -> Result<()> { tcdrain(self.fd.as_raw_fd()).context("tcdrain failed") } fn purge(&mut self, purge: Purge) -> Result<()> { let param = match purge { Purge::InputQueue => TCIFLUSH, Purge::OutputQueue => TCOFLUSH, Purge::InputAndOutputQueue => TCIOFLUSH, }; tcflush(self.fd.as_raw_fd(), param).context("tcflush failed") } } /// A unix style terminal pub struct UnixTerminal { read: TtyReadHandle, write: TtyWriteHandle, saved_termios: Termios, renderer: TerminfoRenderer, input_parser: InputParser, input_queue: VecDeque, sigwinch_id: SigId, sigwinch_pipe: UnixStream, wake_pipe: UnixStream, wake_pipe_write: Arc>, caps: Capabilities, in_alternate_screen: bool, } impl UnixTerminal { /// Attempt to create an instance from the stdin and stdout of the /// process. This will fail unless both are associated with a tty. /// Note that this will duplicate the underlying file descriptors /// and will no longer participate in the stdin/stdout locking /// provided by the rust standard library. pub fn new_from_stdio(caps: Capabilities) -> Result { Self::new_with(caps, &stdin(), &stdout()) } pub fn new_with( caps: Capabilities, read: &A, write: &B, ) -> Result { let mut read = TtyReadHandle::new(FileDescriptor::dup(read)?); let mut write = TtyWriteHandle::new(FileDescriptor::dup(write)?); let saved_termios = write.get_termios()?; let renderer = TerminfoRenderer::new(caps.clone()); let input_parser = InputParser::new(); let input_queue = VecDeque::new(); let (sigwinch_pipe, sigwinch_pipe_write) = UnixStream::pair()?; let sigwinch_id = signal_hook::low_level::pipe::register(libc::SIGWINCH, sigwinch_pipe_write)?; sigwinch_pipe.set_nonblocking(true)?; let (wake_pipe, wake_pipe_write) = UnixStream::pair()?; wake_pipe.set_nonblocking(true)?; wake_pipe_write.set_nonblocking(true)?; read.set_blocking(Blocking::Wait)?; Ok(UnixTerminal { caps, read, write, saved_termios, renderer, input_parser, input_queue, sigwinch_pipe, sigwinch_id, wake_pipe, wake_pipe_write: Arc::new(Mutex::new(wake_pipe_write)), in_alternate_screen: false, }) } /// Attempt to explicitly open a handle to the terminal device /// (/dev/tty) and build a `UnixTerminal` from there. This will /// yield a terminal even if the stdio streams have been redirected, /// provided that the process has an associated controlling terminal. pub fn new(caps: Capabilities) -> Result { let file = OpenOptions::new().read(true).write(true).open("/dev/tty")?; Self::new_with(caps, &file, &file) } /// Test whether we caught delivery of SIGWINCH. /// If so, yield an `InputEvent` with the current size of the tty. fn caught_sigwinch(&mut self) -> Result> { let mut buf = [0u8; 64]; match self.sigwinch_pipe.read(&mut buf) { Ok(0) => Ok(None), Ok(_) => { let size = self.write.get_size()?; Ok(Some(InputEvent::Resized { rows: cast(size.ws_row)?, cols: cast(size.ws_col)?, })) } Err(ref e) if e.kind() == ErrorKind::WouldBlock || e.kind() == ErrorKind::Interrupted => { Ok(None) } Err(e) => bail!("failed to read sigwinch pipe {}", e), } } } #[derive(Clone)] pub struct UnixTerminalWaker { pipe: Arc>, } impl UnixTerminalWaker { pub fn wake(&self) -> std::result::Result<(), IoError> { let mut pipe = self.pipe.lock().unwrap(); match pipe.write(b"W") { Err(e) => match e.kind() { ErrorKind::WouldBlock => Ok(()), _ => Err(e), }, Ok(_) => Ok(()), } } } impl Terminal for UnixTerminal { fn set_raw_mode(&mut self) -> Result<()> { let mut raw = self.write.get_termios()?; cfmakeraw(&mut raw); self.write .set_termios(&raw, SetAttributeWhen::AfterDrainOutputQueuePurgeInputQueue) .context("failed to set raw mode")?; macro_rules! decset { ($variant:ident) => { write!( self.write, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) )?; }; } if self.caps.bracketed_paste() { decset!(BracketedPaste); } if self.caps.mouse_reporting() { decset!(AnyEventMouse); decset!(SGRMouse); } self.write.modify_other_keys(2)?; self.write.flush()?; Ok(()) } fn set_cooked_mode(&mut self) -> Result<()> { self.write.modify_other_keys(1)?; self.write .set_termios(&self.saved_termios, SetAttributeWhen::Now) } fn enter_alternate_screen(&mut self) -> Result<()> { if !self.in_alternate_screen { write!( self.write, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = true; } Ok(()) } fn exit_alternate_screen(&mut self) -> Result<()> { if self.in_alternate_screen { write!( self.write, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = false; } Ok(()) } fn get_screen_size(&mut self) -> Result { let size = self.write.get_size()?; Ok(ScreenSize { rows: cast(size.ws_row)?, cols: cast(size.ws_col)?, xpixel: cast(size.ws_xpixel)?, ypixel: cast(size.ws_ypixel)?, }) } fn probe_capabilities(&mut self) -> Option { Some(ProbeCapabilities::new(&mut self.read, &mut self.write)) } fn set_screen_size(&mut self, size: ScreenSize) -> Result<()> { let size = winsize { ws_row: cast(size.rows)?, ws_col: cast(size.cols)?, ws_xpixel: cast(size.xpixel)?, ws_ypixel: cast(size.ypixel)?, }; self.write.set_size(size) } fn render(&mut self, changes: &[Change]) -> Result<()> { self.renderer.render_to(changes, &mut self.write) } fn flush(&mut self) -> Result<()> { self.write.flush().context("flush failed") } fn poll_input(&mut self, wait: Option) -> Result> { if let Some(event) = self.input_queue.pop_front() { return Ok(Some(event)); } // Some unfortunately verbose code here. In order to safely hook and process // SIGWINCH we need to use the self-pipe trick to deliver signals to a pipe // so that we can use poll(2) to wait for events on both the tty input and // the sigwinch pipe at the same time. In theory we could do away with this // and use sigaction to register SIGWINCH without SA_RESTART set; that way // we could do a blocking read and have it get EINTR on a resize. // Doing such a thing may introduce more problems for other components in // the rust crate ecosystem if they're not ready to deal with EINTR, so // we opt to take on the complexity here to make things overall easier to // integrate. let mut pfd = [ pollfd { fd: self.sigwinch_pipe.as_raw_fd(), events: POLLIN, revents: 0, }, pollfd { fd: self.read.fd.as_raw_fd(), events: POLLIN, revents: 0, }, pollfd { fd: self.wake_pipe.as_raw_fd(), events: POLLIN, revents: 0, }, ]; if let Err(err) = poll(&mut pfd, wait) { return match err .source() .ok_or_else(|| anyhow::anyhow!("error has no source! {:#}", err))? .downcast_ref::() { Some(err) => { if err.kind() == ErrorKind::Interrupted { // SIGWINCH may have been the source of the interrupt. // Check for that now so that we reduce the latency of // processing the resize if let Some(resize) = self.caught_sigwinch()? { Ok(Some(resize)) } else { Ok(None) } } else { bail!("poll(2) error: {}", err) } } None => bail!("poll(2) error: {}", err), }; }; if pfd[0].revents != 0 { // SIGWINCH received via our pipe? if let Some(resize) = self.caught_sigwinch()? { return Ok(Some(resize)); } } if pfd[1].revents != 0 { let mut buf = [0u8; 64]; match self.read.read(&mut buf) { Ok(n) => { let input_queue = &mut self.input_queue; self.input_parser.parse( &buf[0..n], |evt| input_queue.push_back(evt), n == buf.len(), ); return Ok(self.input_queue.pop_front()); } Err(ref e) if e.kind() == ErrorKind::WouldBlock || e.kind() == ErrorKind::Interrupted => {} Err(e) => bail!("failed to read input {}", e), } } if pfd[2].revents != 0 { let mut buf = [0u8; 64]; if let Ok(n) = self.wake_pipe.read(&mut buf) { if n > 0 { return Ok(Some(InputEvent::Wake)); } } } Ok(None) } fn waker(&self) -> UnixTerminalWaker { UnixTerminalWaker { pipe: self.wake_pipe_write.clone(), } } } impl Drop for UnixTerminal { fn drop(&mut self) { macro_rules! decreset { ($variant:ident) => { write!( self.write, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) ) .unwrap(); }; } self.render(&[Change::CursorVisibility( crate::surface::CursorVisibility::Visible, )]) .ok(); if self.caps.bracketed_paste() { decreset!(BracketedPaste); } if self.caps.mouse_reporting() { decreset!(SGRMouse); decreset!(AnyEventMouse); } self.write.modify_other_keys(0).unwrap(); self.exit_alternate_screen().unwrap(); self.write.flush().unwrap(); signal_hook::low_level::unregister(self.sigwinch_id); self.write .set_termios(&self.saved_termios, SetAttributeWhen::Now) .expect("failed to restore original termios state"); } } termwiz-0.22.0/src/terminal/windows.rs000064400000000000000000000662641046102023000160660ustar 00000000000000use crate::escape::csi::{DecPrivateMode, DecPrivateModeCode, Mode, CSI}; use crate::istty::IsTty; use crate::terminal::ProbeCapabilities; use crate::{bail, ensure, format_err, Result}; use filedescriptor::{FileDescriptor, OwnedHandle}; use std::cmp::{max, min}; use std::collections::VecDeque; use std::fs::OpenOptions; use std::io::{stdin, stdout, Error as IoError, Read, Result as IoResult, Write}; use std::os::windows::io::{AsRawHandle, FromRawHandle}; use std::sync::Arc; use std::time::Duration; use std::{mem, ptr}; use winapi::shared::winerror::WAIT_TIMEOUT; use winapi::um::consoleapi; use winapi::um::synchapi::{CreateEventW, SetEvent, WaitForMultipleObjects}; use winapi::um::winbase::{INFINITE, WAIT_FAILED, WAIT_OBJECT_0}; use winapi::um::wincon::{ FillConsoleOutputAttribute, FillConsoleOutputCharacterW, GetConsoleScreenBufferInfo, ReadConsoleOutputW, ScrollConsoleScreenBufferW, SetConsoleCP, SetConsoleCursorPosition, SetConsoleOutputCP, SetConsoleScreenBufferSize, SetConsoleTextAttribute, SetConsoleWindowInfo, WriteConsoleOutputW, CHAR_INFO, CONSOLE_SCREEN_BUFFER_INFO, COORD, DISABLE_NEWLINE_AUTO_RETURN, ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_MOUSE_INPUT, ENABLE_PROCESSED_INPUT, ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_VIRTUAL_TERMINAL_PROCESSING, ENABLE_WINDOW_INPUT, INPUT_RECORD, SMALL_RECT, }; use winapi::um::winnls::CP_UTF8; use crate::caps::Capabilities; use crate::input::{InputEvent, InputParser}; use crate::render::terminfo::TerminfoRenderer; use crate::render::windows::WindowsConsoleRenderer; use crate::render::RenderTty; use crate::surface::Change; use crate::terminal::{cast, ScreenSize, Terminal}; const BUF_SIZE: usize = 128; enum Renderer { Terminfo(TerminfoRenderer), Windows(WindowsConsoleRenderer), } pub trait ConsoleInputHandle { fn set_input_mode(&mut self, mode: u32) -> Result<()>; fn get_input_mode(&mut self) -> Result; fn set_input_cp(&mut self, cp: u32) -> Result<()>; fn get_input_cp(&mut self) -> u32; fn get_number_of_input_events(&mut self) -> Result; fn read_console_input(&mut self, num_events: usize) -> Result>; } pub trait ConsoleOutputHandle { fn set_output_mode(&mut self, mode: u32) -> Result<()>; fn get_output_mode(&mut self) -> Result; fn set_output_cp(&mut self, cp: u32) -> Result<()>; fn get_output_cp(&mut self) -> u32; fn fill_char(&mut self, text: char, x: i16, y: i16, len: u32) -> Result; fn fill_attr(&mut self, attr: u16, x: i16, y: i16, len: u32) -> Result; fn set_attr(&mut self, attr: u16) -> Result<()>; fn set_cursor_position(&mut self, x: i16, y: i16) -> Result<()>; fn get_buffer_info(&mut self) -> Result; fn get_buffer_contents(&mut self) -> Result>; fn set_buffer_contents(&mut self, buffer: &[CHAR_INFO]) -> Result<()>; fn set_viewport(&mut self, left: i16, top: i16, right: i16, bottom: i16) -> Result<()>; fn scroll_region( &mut self, left: i16, top: i16, right: i16, bottom: i16, dx: i16, dy: i16, attr: u16, ) -> Result<()>; } struct InputHandle { handle: FileDescriptor, } impl Read for InputHandle { fn read(&mut self, buf: &mut [u8]) -> IoResult { self.handle.read(buf) } } impl ConsoleInputHandle for InputHandle { fn set_input_mode(&mut self, mode: u32) -> Result<()> { if unsafe { consoleapi::SetConsoleMode(self.handle.as_raw_handle() as *mut _, mode) } == 0 { bail!("SetConsoleMode failed: {}", IoError::last_os_error()); } Ok(()) } fn get_input_mode(&mut self) -> Result { let mut mode = 0; if unsafe { consoleapi::GetConsoleMode(self.handle.as_raw_handle() as *mut _, &mut mode) } == 0 { bail!("GetConsoleMode failed: {}", IoError::last_os_error()); } Ok(mode) } fn set_input_cp(&mut self, cp: u32) -> Result<()> { if unsafe { SetConsoleCP(cp) } == 0 { bail!("SetConsoleCP failed: {}", IoError::last_os_error()); } Ok(()) } fn get_input_cp(&mut self) -> u32 { unsafe { consoleapi::GetConsoleCP() } } fn get_number_of_input_events(&mut self) -> Result { let mut num = 0; if unsafe { consoleapi::GetNumberOfConsoleInputEvents( self.handle.as_raw_handle() as *mut _, &mut num, ) } == 0 { bail!( "GetNumberOfConsoleInputEvents failed: {}", IoError::last_os_error() ); } Ok(num as usize) } fn read_console_input(&mut self, num_events: usize) -> Result> { let mut res = Vec::with_capacity(num_events); let empty_record: INPUT_RECORD = unsafe { mem::zeroed() }; res.resize(num_events, empty_record); let mut num = 0; if unsafe { consoleapi::ReadConsoleInputW( self.handle.as_raw_handle() as *mut _, res.as_mut_ptr(), num_events as u32, &mut num, ) } == 0 { bail!("ReadConsoleInput failed: {}", IoError::last_os_error()); } unsafe { res.set_len(num as usize) }; Ok(res) } } struct OutputHandle { handle: FileDescriptor, write_buffer: Vec, } impl OutputHandle { fn new(handle: FileDescriptor) -> Self { Self { handle, write_buffer: Vec::with_capacity(BUF_SIZE), } } } fn dimensions_from_buffer_info(info: CONSOLE_SCREEN_BUFFER_INFO) -> (usize, usize) { let cols = 1 + (info.srWindow.Right - info.srWindow.Left); let rows = 1 + (info.srWindow.Bottom - info.srWindow.Top); (cols as usize, rows as usize) } impl RenderTty for OutputHandle { fn get_size_in_cells(&mut self) -> Result<(usize, usize)> { let info = self.get_buffer_info()?; let (cols, rows) = dimensions_from_buffer_info(info); Ok((cols, rows)) } } struct EventHandle { handle: OwnedHandle, } impl EventHandle { fn new() -> IoResult { let handle = unsafe { CreateEventW(ptr::null_mut(), 0, 0, ptr::null_mut()) }; if handle.is_null() { Err(IoError::last_os_error()) } else { Ok(Self { handle: unsafe { OwnedHandle::from_raw_handle(handle as *mut _) }, }) } } fn set(&self) -> IoResult<()> { let ok = unsafe { SetEvent(self.handle.as_raw_handle() as *mut _) }; if ok == 0 { Err(IoError::last_os_error()) } else { Ok(()) } } } // Handle created by `CreateEventW` is safe to be shared. unsafe impl Sync for EventHandle {} impl Write for OutputHandle { fn write(&mut self, buf: &[u8]) -> IoResult { if self.write_buffer.len() + buf.len() > self.write_buffer.capacity() { self.flush()?; } if buf.len() >= self.write_buffer.capacity() { self.handle.write(buf) } else { self.write_buffer.write(buf) } } fn flush(&mut self) -> IoResult<()> { if !self.write_buffer.is_empty() { self.handle.write_all(&self.write_buffer)?; self.write_buffer.clear(); } Ok(()) } } impl ConsoleOutputHandle for OutputHandle { fn set_output_mode(&mut self, mode: u32) -> Result<()> { if unsafe { consoleapi::SetConsoleMode(self.handle.as_raw_handle() as *mut _, mode) } == 0 { bail!("SetConsoleMode failed: {}", IoError::last_os_error()); } Ok(()) } fn get_output_mode(&mut self) -> Result { let mut mode = 0; if unsafe { consoleapi::GetConsoleMode(self.handle.as_raw_handle() as *mut _, &mut mode) } == 0 { bail!("GetConsoleMode failed: {}", IoError::last_os_error()); } Ok(mode) } fn set_output_cp(&mut self, cp: u32) -> Result<()> { if unsafe { SetConsoleOutputCP(cp) } == 0 { bail!("SetConsoleOutputCP failed: {}", IoError::last_os_error()); } Ok(()) } fn get_output_cp(&mut self) -> u32 { unsafe { consoleapi::GetConsoleOutputCP() } } fn fill_char(&mut self, text: char, x: i16, y: i16, len: u32) -> Result { let mut wrote = 0; if unsafe { FillConsoleOutputCharacterW( self.handle.as_raw_handle() as *mut _, text as u16, len, COORD { X: x, Y: y }, &mut wrote, ) } == 0 { bail!( "FillConsoleOutputCharacterW failed: {}", IoError::last_os_error() ); } Ok(wrote) } fn fill_attr(&mut self, attr: u16, x: i16, y: i16, len: u32) -> Result { let mut wrote = 0; if unsafe { FillConsoleOutputAttribute( self.handle.as_raw_handle() as *mut _, attr, len, COORD { X: x, Y: y }, &mut wrote, ) } == 0 { bail!( "FillConsoleOutputAttribute failed: {}", IoError::last_os_error() ); } Ok(wrote) } fn set_attr(&mut self, attr: u16) -> Result<()> { if unsafe { SetConsoleTextAttribute(self.handle.as_raw_handle() as *mut _, attr) } == 0 { bail!( "SetConsoleTextAttribute failed: {}", IoError::last_os_error() ); } Ok(()) } fn set_cursor_position(&mut self, x: i16, y: i16) -> Result<()> { if unsafe { SetConsoleCursorPosition(self.handle.as_raw_handle() as *mut _, COORD { X: x, Y: y }) } == 0 { bail!( "SetConsoleCursorPosition(x={}, y={}) failed: {}", x, y, IoError::last_os_error() ); } Ok(()) } fn get_buffer_contents(&mut self) -> Result> { let info = self.get_buffer_info()?; let cols = info.dwSize.X as usize; let rows = 1 + info.srWindow.Bottom as usize - info.srWindow.Top as usize; let mut res = vec![ CHAR_INFO { Attributes: 0, Char: unsafe { mem::zeroed() } }; cols * rows ]; let mut read_region = SMALL_RECT { Left: 0, Right: info.dwSize.X - 1, Top: info.srWindow.Top, Bottom: info.srWindow.Bottom, }; unsafe { if ReadConsoleOutputW( self.handle.as_raw_handle() as *mut _, res.as_mut_ptr(), COORD { X: cols as i16, Y: rows as i16, }, COORD { X: 0, Y: 0 }, &mut read_region, ) == 0 { bail!("ReadConsoleOutputW failed: {}", IoError::last_os_error()); } } Ok(res) } fn set_buffer_contents(&mut self, buffer: &[CHAR_INFO]) -> Result<()> { let info = self.get_buffer_info()?; let cols = info.dwSize.X as usize; let rows = 1 + info.srWindow.Bottom as usize - info.srWindow.Top as usize; ensure!( rows * cols == buffer.len(), "buffer size doesn't match screen size" ); let mut write_region = SMALL_RECT { Left: 0, Right: info.dwSize.X - 1, Top: info.srWindow.Top, Bottom: info.srWindow.Bottom, }; unsafe { if WriteConsoleOutputW( self.handle.as_raw_handle() as *mut _, buffer.as_ptr(), COORD { X: cols as i16, Y: rows as i16, }, COORD { X: 0, Y: 0 }, &mut write_region, ) == 0 { bail!("WriteConsoleOutputW failed: {}", IoError::last_os_error()); } } Ok(()) } fn get_buffer_info(&mut self) -> Result { let mut info: CONSOLE_SCREEN_BUFFER_INFO = unsafe { mem::zeroed() }; let ok = unsafe { GetConsoleScreenBufferInfo(self.handle.as_raw_handle() as *mut _, &mut info as *mut _) }; if ok == 0 { bail!( "GetConsoleScreenBufferInfo failed: {}", IoError::last_os_error() ); } Ok(info) } fn set_viewport(&mut self, left: i16, top: i16, right: i16, bottom: i16) -> Result<()> { let rect = SMALL_RECT { Left: left, Top: top, Right: right, Bottom: bottom, }; if unsafe { SetConsoleWindowInfo(self.handle.as_raw_handle() as *mut _, 1, &rect) } == 0 { bail!("SetConsoleWindowInfo failed: {}", IoError::last_os_error()); } Ok(()) } fn scroll_region( &mut self, left: i16, top: i16, right: i16, bottom: i16, dx: i16, dy: i16, attr: u16, ) -> Result<()> { let scroll_rect = SMALL_RECT { Left: max(left, left - dx), Top: max(top, top - dy), Right: min(right, right - dx), Bottom: min(bottom, bottom - dy), }; let clip_rect = SMALL_RECT { Left: left, Top: top, Right: right, Bottom: bottom, }; let fill = unsafe { let mut fill = CHAR_INFO { Char: mem::zeroed(), Attributes: attr, }; *fill.Char.UnicodeChar_mut() = ' ' as u16; fill }; if unsafe { ScrollConsoleScreenBufferW( self.handle.as_raw_handle() as *mut _, &scroll_rect, &clip_rect, COORD { X: max(left, left + dx), Y: max(left, top + dy), }, &fill, ) } == 0 { bail!( "ScrollConsoleScreenBufferW failed: {}", IoError::last_os_error() ); } Ok(()) } } pub struct WindowsTerminal { input_handle: InputHandle, output_handle: OutputHandle, waker_handle: Arc, saved_input_mode: u32, saved_output_mode: u32, renderer: Renderer, input_parser: InputParser, input_queue: VecDeque, saved_input_cp: u32, saved_output_cp: u32, in_alternate_screen: bool, caps: Capabilities, } impl Drop for WindowsTerminal { fn drop(&mut self) { if matches!(&self.renderer, Renderer::Terminfo(_)) { macro_rules! decreset { ($variant:ident) => { write!( self.output_handle, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) ) .unwrap(); }; } self.render(&[Change::CursorVisibility( crate::surface::CursorVisibility::Visible, )]) .ok(); decreset!(BracketedPaste); decreset!(SGRMouse); decreset!(AnyEventMouse); } self.exit_alternate_screen().unwrap(); self.output_handle.flush().unwrap(); self.input_handle .set_input_mode(self.saved_input_mode) .expect("failed to restore console input mode"); self.input_handle .set_input_cp(self.saved_input_cp) .expect("failed to restore console input codepage"); self.output_handle .set_output_mode(self.saved_output_mode) .expect("failed to restore console output mode"); self.output_handle .set_output_cp(self.saved_output_cp) .expect("failed to restore console output codepage"); } } impl WindowsTerminal { /// Attempt to create an instance from the stdin and stdout of the /// process. This will fail unless both are associated with a tty. /// Note that this will duplicate the underlying file descriptors /// and will no longer participate in the stdin/stdout locking /// provided by the rust standard library. pub fn new_from_stdio(caps: Capabilities) -> Result { Self::new_with(caps, stdin(), stdout()) } /// Create an instance using the provided capabilities, read and write /// handles. The read and write handles must be tty handles of this /// will return an error. pub fn new_with( caps: Capabilities, read: A, write: B, ) -> Result { if !read.is_tty() || !write.is_tty() { bail!("stdin and stdout must both be tty handles"); } let mut input_handle = InputHandle { handle: FileDescriptor::dup(&read)?, }; let mut output_handle = OutputHandle::new(FileDescriptor::dup(&write)?); let waker_handle = Arc::new(EventHandle::new()?); let saved_input_mode = input_handle.get_input_mode()?; let saved_output_mode = output_handle.get_output_mode()?; let saved_input_cp = input_handle.get_input_cp(); let saved_output_cp = output_handle.get_output_cp(); // Test whether we have a virtual terminal capable // console device by attempting to set the appropriate flags. let virtual_terminal_available = output_handle .set_output_mode( saved_output_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN, ) .is_ok(); // Allow opting out of that processing fn bypass_virtual_terminal() -> bool { if let Ok(t) = std::env::var("TERMWIZ_BYPASS_VIRTUAL_TERMINAL") { t == "1" } else { false } } let renderer = if caps.terminfo_db().is_some() { Renderer::Terminfo(TerminfoRenderer::new(caps.clone())) } else if virtual_terminal_available && !bypass_virtual_terminal() { Renderer::Terminfo(TerminfoRenderer::new(caps.clone().apply_builtin_terminfo())) } else { Renderer::Windows(WindowsConsoleRenderer::new(caps.clone())) }; let input_parser = InputParser::new(); let mut terminal = Self { input_handle, output_handle, waker_handle, saved_input_mode, saved_output_mode, saved_input_cp, saved_output_cp, renderer, input_parser, input_queue: VecDeque::new(), in_alternate_screen: false, caps, }; terminal.input_handle.set_input_cp(CP_UTF8)?; terminal.output_handle.set_output_cp(CP_UTF8)?; // We already enabled this for output, but let's also turn it // on for input here now. terminal.enable_virtual_terminal_processing_if_needed()?; Ok(terminal) } fn enable_virtual_terminal_processing_if_needed(&mut self) -> Result<()> { match &self.renderer { Renderer::Terminfo(_) => self.enable_virtual_terminal_processing(), Renderer::Windows(_) => Ok(()), } } /// Attempt to explicitly open handles to a console device (CONIN$, /// CONOUT$). This should yield the terminal already associated with /// the process, even if stdio streams have been redirected. pub fn new(caps: Capabilities) -> Result { let read = OpenOptions::new().read(true).write(true).open("CONIN$")?; let write = OpenOptions::new().read(true).write(true).open("CONOUT$")?; Self::new_with(caps, read, write) } pub fn enable_virtual_terminal_processing(&mut self) -> Result<()> { let mode = self.output_handle.get_output_mode()?; self.output_handle.set_output_mode( mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN, )?; let mode = self.input_handle.get_input_mode()?; self.input_handle .set_input_mode(mode | ENABLE_VIRTUAL_TERMINAL_INPUT)?; Ok(()) } } #[derive(Clone)] pub struct WindowsTerminalWaker { handle: Arc, } impl WindowsTerminalWaker { pub fn wake(&self) -> IoResult<()> { self.handle.set()?; Ok(()) } } impl Terminal for WindowsTerminal { fn set_raw_mode(&mut self) -> Result<()> { let mode = self.output_handle.get_output_mode()?; self.output_handle .set_output_mode(mode | DISABLE_NEWLINE_AUTO_RETURN) .ok(); let mode = self.input_handle.get_input_mode()?; self.input_handle.set_input_mode( (mode & !(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT)) | ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT, )?; if matches!(&self.renderer, Renderer::Terminfo(_)) { macro_rules! decset { ($variant:ident) => { write!( self.output_handle, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::$variant ))) )?; }; } if self.caps.bracketed_paste() { decset!(BracketedPaste); } if self.caps.mouse_reporting() { decset!(AnyEventMouse); decset!(SGRMouse); } self.output_handle.flush()?; } Ok(()) } fn set_cooked_mode(&mut self) -> Result<()> { let mode = self.output_handle.get_output_mode()?; self.output_handle .set_output_mode(mode & !DISABLE_NEWLINE_AUTO_RETURN) .ok(); let mode = self.input_handle.get_input_mode()?; self.input_handle.set_input_mode( (mode & !(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)) | ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT, ) } fn enter_alternate_screen(&mut self) -> Result<()> { if matches!(&self.renderer, Renderer::Terminfo(_)) { if !self.in_alternate_screen { write!( self.output_handle, "{}", CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = true; } } else { // TODO: Implement using CreateConsoleScreenBuffer and // SetConsoleActiveScreenBuffer. } Ok(()) } fn exit_alternate_screen(&mut self) -> Result<()> { // TODO: Implement using SetConsoleActiveScreenBuffer. if matches!(&self.renderer, Renderer::Terminfo(_)) { if self.in_alternate_screen { write!( self.output_handle, "{}", CSI::Mode(Mode::ResetDecPrivateMode(DecPrivateMode::Code( DecPrivateModeCode::ClearAndEnableAlternateScreen ))) )?; self.in_alternate_screen = false; } } else { // TODO: Implement using CreateConsoleScreenBuffer and // SetConsoleActiveScreenBuffer. } Ok(()) } fn get_screen_size(&mut self) -> Result { let info = self.output_handle.get_buffer_info()?; let (cols, rows) = dimensions_from_buffer_info(info); Ok(ScreenSize { rows: cast(rows)?, cols: cast(cols)?, xpixel: 0, ypixel: 0, }) } fn probe_capabilities(&mut self) -> Option { Some(ProbeCapabilities::new( &mut self.input_handle, &mut self.output_handle, )) } fn set_screen_size(&mut self, size: ScreenSize) -> Result<()> { // FIXME: take into account the visible window size here; // this probably changes the size of everything including scrollback let size = COORD { X: cast(size.cols)?, Y: cast(size.rows)?, }; let handle = self.output_handle.handle.as_raw_handle(); if unsafe { SetConsoleScreenBufferSize(handle as *mut _, size) } != 1 { bail!( "failed to SetConsoleScreenBufferSize: {}", IoError::last_os_error() ); } Ok(()) } fn render(&mut self, changes: &[Change]) -> Result<()> { match &mut self.renderer { Renderer::Terminfo(r) => r.render_to(changes, &mut self.output_handle), Renderer::Windows(r) => r.render_to(changes, &mut self.output_handle), } } fn flush(&mut self) -> Result<()> { self.output_handle .flush() .map_err(|e| format_err!("flush failed: {}", e)) } fn poll_input(&mut self, wait: Option) -> Result> { loop { if let Some(event) = self.input_queue.pop_front() { return Ok(Some(event)); } let mut pending = self.input_handle.get_number_of_input_events()?; if pending == 0 { let mut handles = [ self.input_handle.handle.as_raw_handle() as *mut _, self.waker_handle.handle.as_raw_handle() as *mut _, ]; let result = unsafe { WaitForMultipleObjects( 2, handles.as_mut_ptr(), 0, wait.map(|wait| wait.as_millis() as u32).unwrap_or(INFINITE), ) }; if result == WAIT_OBJECT_0 + 0 { pending = self.input_handle.get_number_of_input_events()?; } else if result == WAIT_OBJECT_0 + 1 { return Ok(Some(InputEvent::Wake)); } else if result == WAIT_FAILED { bail!( "failed to WaitForMultipleObjects: {}", IoError::last_os_error() ); } else if result == WAIT_TIMEOUT { return Ok(None); } else { return Ok(None); } } let records = self.input_handle.read_console_input(pending)?; let input_queue = &mut self.input_queue; self.input_parser .decode_input_records(&records, &mut |evt| input_queue.push_back(evt)); } } fn waker(&self) -> WindowsTerminalWaker { WindowsTerminalWaker { handle: self.waker_handle.clone(), } } } termwiz-0.22.0/src/tmux_cc/mod.rs000064400000000000000000000566721046102023000150040ustar 00000000000000use anyhow::Context; use parser::Rule; use pest::iterators::{Pair, Pairs}; use pest::Parser as _; pub type TmuxWindowId = u64; pub type TmuxPaneId = u64; pub type TmuxSessionId = u64; mod parser { use pest_derive::Parser; #[derive(Parser)] #[grammar = "tmux_cc/tmux.pest"] pub struct TmuxParser; } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Guarded { pub error: bool, pub timestamp: i64, pub number: u64, pub flags: i64, pub output: String, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct WindowLayout { pub layout_id: String, pub width: u64, pub height: u64, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Event { Begin { timestamp: i64, number: u64, flags: i64, }, End { timestamp: i64, number: u64, flags: i64, }, Error { timestamp: i64, number: u64, flags: i64, }, Guarded(Guarded), Output { pane: TmuxPaneId, text: String, }, Exit { reason: Option, }, SessionsChanged, SessionChanged { session: TmuxSessionId, name: String, }, SessionRenamed { name: String, }, SessionWindowChanged { session: TmuxSessionId, window: TmuxWindowId, }, ClientSessionChanged { client_name: String, session: TmuxSessionId, session_name: String, }, ClientDetached { client_name: String, }, PaneModeChanged { pane: TmuxPaneId, }, WindowAdd { window: TmuxWindowId, }, WindowClose { window: TmuxWindowId, }, WindowPaneChanged { window: TmuxWindowId, pane: TmuxPaneId, }, WindowRenamed { window: TmuxWindowId, name: String, }, LayoutChange { window: TmuxWindowId, layout: WindowLayout, visible_layout: Option, raw_flags: Option, }, } fn parse_pane_id(pair: Pair) -> anyhow::Result { match pair.as_rule() { Rule::pane_id => { let mut pairs = pair.into_inner(); pairs .next() .unwrap() .as_str() .parse() .context("pane_id is somehow not digits") } _ => anyhow::bail!("parse_pane_id can only parse Rule::pane_id, got {:?}", pair), } } fn parse_window_id(pair: Pair) -> anyhow::Result { match pair.as_rule() { Rule::window_id => { let mut pairs = pair.into_inner(); pairs .next() .unwrap() .as_str() .parse() .context("window_id is somehow not digits") } _ => anyhow::bail!( "parse_window_id can only parse Rule::window_id, got {:?}", pair ), } } fn parse_session_id(pair: Pair) -> anyhow::Result { match pair.as_rule() { Rule::session_id => { let mut pairs = pair.into_inner(); pairs .next() .unwrap() .as_str() .parse() .context("session_id is somehow not digits") } _ => anyhow::bail!( "parse_session_id can only parse Rule::session_id, got {:?}", pair ), } } /// Parses a %begin, %end, %error guard line tuple fn parse_guard(mut pairs: Pairs) -> anyhow::Result<(i64, u64, i64)> { let timestamp = pairs.next().unwrap().as_str().parse::()?; let number = pairs.next().unwrap().as_str().parse::()?; let flags = pairs.next().unwrap().as_str().parse::()?; Ok((timestamp, number, flags)) } /// Parses a window_layout line, for example "b25d,80x24,0,0,0" fn parse_window_layout(pair: Pair) -> Option { match pair.as_rule() { Rule::window_layout => { let mut pairs = pair.into_inner(); let layout_id_option = pairs.next()?.as_str().parse::().ok(); let width_option = pairs.next()?.as_str().parse::().ok(); let height_option = pairs.next()?.as_str().parse::().ok(); if let (Some(layout_id), Some(width), Some(height)) = (layout_id_option, width_option, height_option) { return Some(WindowLayout { layout_id, width, height, }); } return None; } _ => None, } } fn parse_line(line: &str) -> anyhow::Result { let mut pairs = parser::TmuxParser::parse(Rule::line_entire, line)?; let pair = pairs.next().ok_or_else(|| anyhow::anyhow!("no pairs!?"))?; match pair.as_rule() { Rule::begin => { let (timestamp, number, flags) = parse_guard(pair.into_inner())?; Ok(Event::Begin { timestamp, number, flags, }) } Rule::end => { let (timestamp, number, flags) = parse_guard(pair.into_inner())?; Ok(Event::End { timestamp, number, flags, }) } Rule::error => { let (timestamp, number, flags) = parse_guard(pair.into_inner())?; Ok(Event::Error { timestamp, number, flags, }) } Rule::exit => { let mut pairs = pair.into_inner(); let reason = pairs.next().map(|pair| pair.as_str().to_owned()); Ok(Event::Exit { reason }) } Rule::sessions_changed => Ok(Event::SessionsChanged), Rule::pane_mode_changed => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().unwrap())?; Ok(Event::PaneModeChanged { pane }) } Rule::window_add => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().unwrap())?; Ok(Event::WindowAdd { window }) } Rule::window_close => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().unwrap())?; Ok(Event::WindowClose { window }) } Rule::window_pane_changed => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().unwrap())?; let pane = parse_pane_id(pairs.next().unwrap())?; Ok(Event::WindowPaneChanged { window, pane }) } Rule::window_renamed => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().unwrap())?; let name = unvis(pairs.next().unwrap().as_str())?; Ok(Event::WindowRenamed { window, name }) } Rule::output => { let mut pairs = pair.into_inner(); let pane = parse_pane_id(pairs.next().unwrap())?; let text = unvis(pairs.next().unwrap().as_str())?; Ok(Event::Output { pane, text }) } Rule::session_changed => { let mut pairs = pair.into_inner(); let session = parse_session_id(pairs.next().unwrap())?; let name = unvis(pairs.next().unwrap().as_str())?; Ok(Event::SessionChanged { session, name }) } Rule::client_session_changed => { let mut pairs = pair.into_inner(); let client_name = unvis(pairs.next().unwrap().as_str())?; let session = parse_session_id(pairs.next().unwrap())?; let session_name = unvis(pairs.next().unwrap().as_str())?; Ok(Event::ClientSessionChanged { client_name, session, session_name, }) } Rule::client_detached => { let mut pairs = pair.into_inner(); let client_name = unvis(pairs.next().unwrap().as_str())?; Ok(Event::ClientDetached { client_name }) } Rule::session_renamed => { let mut pairs = pair.into_inner(); let name = unvis(pairs.next().unwrap().as_str())?; Ok(Event::SessionRenamed { name }) } Rule::session_window_changed => { let mut pairs = pair.into_inner(); let session = parse_session_id(pairs.next().unwrap())?; let window = parse_window_id(pairs.next().unwrap())?; Ok(Event::SessionWindowChanged { session, window }) } Rule::layout_change => { let mut pairs = pair.into_inner(); let window = parse_window_id(pairs.next().unwrap())?; let layout = pairs.next().and_then(parse_window_layout).unwrap(); let visible_layout = pairs.next().and_then(parse_window_layout); let raw_flags = pairs.next().map(|r| r.as_str().to_owned()); Ok(Event::LayoutChange { window, layout, visible_layout, raw_flags, }) } Rule::pane_id | Rule::word | Rule::client_name | Rule::window_id | Rule::session_id | Rule::window_layout | Rule::any_text | Rule::line | Rule::line_entire | Rule::EOI | Rule::number => unreachable!(), } } /// Decode OpenBSD `vis` encoded strings /// See: https://github.com/tmux/tmux/blob/486ce9b09855ae30a2bf5e576cb6f7ad37792699/compat/unvis.c pub fn unvis(s: &str) -> anyhow::Result { enum State { Ground, Start, Meta, Meta1, Ctrl(u8), Octal2(u8), Octal3(u8), } let mut state = State::Ground; let mut result: Vec = vec![]; let mut bytes = s.as_bytes().iter(); fn is_octal(b: u8) -> bool { b >= b'0' && b <= b'7' } fn unvis_byte(b: u8, state: &mut State, result: &mut Vec) -> anyhow::Result { match state { State::Ground => { if b == b'\\' { *state = State::Start; } else { result.push(b); } } State::Start => { match b { b'\\' => { result.push(b'\\'); *state = State::Ground; } b'0' | b'1' | b'2' | b'3' | b'4' | b'5' | b'6' | b'7' => { let value = b - b'0'; *state = State::Octal2(value); } b'M' => { *state = State::Meta; } b'^' => { *state = State::Ctrl(0); } b'n' => { result.push(b'\n'); *state = State::Ground; } b'r' => { result.push(b'\r'); *state = State::Ground; } b'b' => { result.push(b'\x08'); *state = State::Ground; } b'a' => { result.push(b'\x07'); *state = State::Ground; } b'v' => { result.push(b'\x0b'); *state = State::Ground; } b't' => { result.push(b'\t'); *state = State::Ground; } b'f' => { result.push(b'\x0c'); *state = State::Ground; } b's' => { result.push(b' '); *state = State::Ground; } b'E' => { result.push(b'\x1b'); *state = State::Ground; } b'\n' => { // Hidden newline // result.push(b'\n'); *state = State::Ground; } b'$' => { // Hidden marker *state = State::Ground; } _ => { // Invalid syntax anyhow::bail!("Invalid \\ escape: {}", b); } } } State::Meta => { if b == b'-' { *state = State::Meta1; } else if b == b'^' { *state = State::Ctrl(0o200); } else { anyhow::bail!("invalid \\M escape: {}", b); } } State::Meta1 => { result.push(b | 0o200); *state = State::Ground; } State::Ctrl(c) => { if b == b'?' { result.push(*c | 0o177); } else { result.push((b & 0o37) | *c); } *state = State::Ground; } State::Octal2(prior) => { if is_octal(b) { // It's the second in a 2 or 3 byte octal sequence let value = (*prior << 3) + (b - b'0'); *state = State::Octal3(value); } else { // Prior character was a single octal value result.push(*prior); *state = State::Ground; // re-process the current byte return Ok(true); } } State::Octal3(prior) => { if is_octal(b) { // It's the third in a 3 byte octal sequence let value = (*prior << 3) + (b - b'0'); result.push(value); *state = State::Ground; } else { // Prior was a 2-byte octal sequence result.push(*prior); *state = State::Ground; // re-process the current byte return Ok(true); } } } // Don't process this byte again Ok(false) } while let Some(&b) = bytes.next() { let again = unvis_byte(b, &mut state, &mut result)?; if again { unvis_byte(b, &mut state, &mut result)?; } } String::from_utf8(result) .map_err(|err| anyhow::anyhow!("Unescaped string is not valid UTF8: {}", err)) } pub struct Parser { buffer: Vec, begun: Option, } impl Parser { pub fn new() -> Self { Self { buffer: vec![], begun: None, } } pub fn advance_byte(&mut self, c: u8) -> anyhow::Result> { if c == b'\n' { self.process_line() } else { self.buffer.push(c); Ok(None) } } pub fn advance_string(&mut self, s: &str) -> anyhow::Result> { self.advance_bytes(s.as_bytes()) } pub fn advance_bytes(&mut self, bytes: &[u8]) -> anyhow::Result> { let mut events = vec![]; for (i, &b) in bytes.iter().enumerate() { match self.advance_byte(b) { Ok(option_event) => { if let Some(e) = option_event { events.push(e); } } Err(err) => { // concat remained bytes after digested bytes return Err(anyhow::anyhow!(format!( "{}{}", err, String::from_utf8_lossy(&bytes[i..]) ))); } } } Ok(events) } fn process_guarded_line(&mut self, line: String) -> anyhow::Result> { let result = match parse_line(&line) { Ok(Event::End { timestamp, number, flags, }) => { if let Some(begun) = self.begun.take() { if begun.timestamp == timestamp && begun.number == number && begun.flags == flags { Some(Event::Guarded(begun)) } else { log::error!("mismatched %end; expected {:?} but got {}", begun, line); None } } else { log::error!("unexpected %end with no %begin ({})", line); None } } Ok(Event::Error { timestamp, number, flags, }) => { if let Some(mut begun) = self.begun.take() { if begun.timestamp == timestamp && begun.number == number && begun.flags == flags { begun.error = true; Some(Event::Guarded(begun)) } else { log::error!("mismatched %error; expected {:?} but got {}", begun, line); None } } else { log::error!("unexpected %error with no %begin ({})", line); None } } _ => { let begun = self.begun.as_mut().unwrap(); begun.output.push_str(&line); begun.output.push('\n'); None } }; self.buffer.clear(); return Ok(result); } fn process_line(&mut self) -> anyhow::Result> { if self.buffer.last() == Some(&b'\r') { self.buffer.pop(); } let result = match std::str::from_utf8(&self.buffer) { Ok(line) => { if self.begun.is_some() { let line = line.to_owned(); return self.process_guarded_line(line); } match parse_line(line) { Ok(Event::Begin { timestamp, number, flags, }) => { if self.begun.is_some() { log::error!("expected %end or %error before %begin ({})", line); } self.begun.replace(Guarded { timestamp, number, flags, error: false, output: String::new(), }); None } Ok(event) => Some(event), Err(err) => { log::error!("Unrecognized tmux cc line: {}", err); return Err(anyhow::anyhow!(line.to_owned())); } } } Err(err) => { log::error!("Failed to parse line from tmux: {}", err); None } }; self.buffer.clear(); Ok(result) } } #[cfg(test)] mod tests { use super::*; use k9::assert_equal as assert_eq; #[test] fn test_parse_line() { let _ = env_logger::Builder::new() .is_test(true) .filter_level(log::LevelFilter::Trace) .try_init(); assert_eq!( Event::Begin { timestamp: 12345, number: 321, flags: 0, }, parse_line("%begin 12345 321 0").unwrap() ); assert_eq!( Event::End { timestamp: 12345, number: 321, flags: 0, }, parse_line("%end 12345 321 0").unwrap() ); } #[test] fn test_parse_sequence() { let input = b"%sessions-changed %pane-mode-changed %0 %begin 1604279270 310 0 stuff in here %end 1604279270 310 0 %window-add @1 %sessions-changed %session-changed $1 1 %client-session-changed /dev/pts/5 $1 home %client-detached /dev/pts/10 %layout-change @1 b25d,80x24,0,0,0 %layout-change @1 cafd,120x29,0,0,0 cafd,120x29,0,0,0 * %output %1 \\033[1m\\033[7m%\\033[27m\\033[1m\\033[0m \\015 \\015 %output %1 \\033kwez@cube-localdomain:~\\033\\134\\033]2;wez@cube-localdomain:~\\033\\134 %output %1 \\033]7;file://cube-localdomain/home/wez\\033\\134 %output %1 \\033[K\\033[?2004h %exit %exit I said so "; let mut p = Parser::new(); let events = p.advance_bytes(input).unwrap(); assert_eq!( vec![ Event::SessionsChanged, Event::PaneModeChanged { pane: 0 }, Event::Guarded(Guarded { timestamp: 1604279270, number: 310, flags: 0, error: false, output: "stuff\nin\nhere\n".to_owned() }), Event::WindowAdd { window: 1 }, Event::SessionsChanged, Event::SessionChanged { session: 1, name: "1".to_owned(), }, Event::ClientSessionChanged { client_name: "/dev/pts/5".to_owned(), session: 1, session_name: "home".to_owned() }, Event::ClientDetached { client_name: "/dev/pts/10".to_owned() }, Event::LayoutChange { window: 1, layout: WindowLayout { layout_id: "b25d".to_owned(), width: 80, height: 24 }, visible_layout: None, raw_flags: None }, Event::LayoutChange { window: 1, layout: WindowLayout { layout_id: "cafd".to_owned(), width: 120, height: 29 }, visible_layout: Some(WindowLayout { layout_id: "cafd".to_owned(), width: 120, height: 29 }), raw_flags: Some("*".to_owned()) }, Event::Output { pane: 1, text: "\x1b[1m\x1b[7m%\x1b[27m\x1b[1m\x1b[0m \r \r".to_owned() }, Event::Output { pane: 1, text: "\x1bkwez@cube-localdomain:~\x1b\\\x1b]2;wez@cube-localdomain:~\x1b\\" .to_owned() }, Event::Output { pane: 1, text: "\x1b]7;file://cube-localdomain/home/wez\x1b\\".to_owned(), }, Event::Output { pane: 1, text: "\x1b[K\x1b[?2004h".to_owned(), }, Event::Exit { reason: None }, Event::Exit { reason: Some("I said so".to_owned()) }, ], events ); } } termwiz-0.22.0/src/tmux_cc/tmux.pest000064400000000000000000000033331046102023000155330ustar 00000000000000number = { ASCII_DIGIT+ } any_text = { ANY* } word = { (ASCII_ALPHANUMERIC | "/")+ } pane_id = { "%" ~ number } window_id = { "@" ~ number } session_id = { "$" ~ number } client_name = { word } window_layout = { word ~ "," ~ number ~ "x" ~ number ~ "," ~ number ~ "," ~ number ~ "," ~ number } begin = { "%begin " ~ number ~ " " ~ number ~ " " ~ number } end = { "%end " ~ number ~ " " ~ number ~ " " ~ number } error = { "%error " ~ number ~ " " ~ number ~ " " ~ number } client_session_changed = { "%client-session-changed " ~ client_name ~ " " ~ session_id ~ " " ~any_text } client_detached = { "%client-detached " ~ client_name } output = { "%output " ~ pane_id ~ " " ~ any_text } exit = { "%exit" ~ (" " ~ any_text)? } sessions_changed = { "%sessions-changed" } pane_mode_changed = { "%pane-mode-changed " ~ pane_id } window_add = { "%window-add " ~ window_id } window_close = { "%window-close " ~ window_id } window_pane_changed = { "%window-pane-changed " ~ window_id ~ " " ~ pane_id } window_renamed = { "%window-renamed " ~ window_id ~ " " ~ any_text } session_changed = { "%session-changed " ~ session_id ~ " " ~ any_text } session_renamed = { "%session-renamed " ~ any_text } session_window_changed = { "%session-window-changed " ~ session_id ~ " " ~ window_id } layout_change = { "%layout-change " ~ window_id ~ " " ~ (window_layout ~ " " ~ window_layout ~ " " ~any_text | window_layout) } line = _{ ( client_session_changed | client_detached | begin | end | error | exit | output | pane_mode_changed | session_changed | session_renamed | session_window_changed | sessions_changed | window_add | window_close | window_pane_changed | window_renamed | layout_change ) } line_entire = _{ SOI ~ line ~ EOI } termwiz-0.22.0/src/widechar_width.rs000064400000000000000000001202141046102023000155300ustar 00000000000000/** * widechar_width.rs for Unicode 15.0.0 * See https://github.com/ridiculousfish/widecharwidth/ * * SHA1 file hashes: * ( * the hashes for generate.py and the template are git object hashes, * use `git log --all --find-object=` in the widecharwidth repository * to see which commit they correspond to, * or run `git hash-object` on the file to compare. * The other hashes are simple `sha1sum` style hashes. * ) * * generate.py: 6d63502e0a28f40351524953141ea802a79dced9 * template.js: 7921c1fe6bcb4ce17108929b599bfda097caedb7 * UnicodeData.txt: 3e1900295af0978ad6be3153de4c97d55198ab4b * EastAsianWidth.txt: 2637ce61d024cb25c768023fa4d7594b53474919 * emoji-data.txt: 7754a51be6ebe38f906e4fe948720e0f3b78bfd7 */ type R = (u32, u32); #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[repr(u8)] pub enum WcWidth { /// The character is single-width One, /// The character is double-width Two, /// The character is not printable. NonPrint, /// The character is a zero-width combiner. Combining, /// The character is East-Asian ambiguous width. Ambiguous, /// The character is for private use. PrivateUse, /// The character is unassigned. Unassigned, /// Width is 1 in Unicode 8, 2 in Unicode 9+. WidenedIn9, /// The character is a noncharacter. NonCharacter, } /// Simple ASCII characters - used a lot, so we check them first. const ASCII_TABLE: &'static [R] = &[(0x00020, 0x0007E)]; /// Private usage range. const PRIVATE_TABLE: &'static [R] = &[(0x0E000, 0x0F8FF), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD)]; /// Nonprinting characters. const NONPRINT_TABLE: &'static [R] = &[ (0x00000, 0x0001F), (0x0007F, 0x0009F), (0x000AD, 0x000AD), (0x00600, 0x00605), (0x0061C, 0x0061C), (0x006DD, 0x006DD), (0x0070F, 0x0070F), (0x00890, 0x00891), (0x008E2, 0x008E2), (0x0180E, 0x0180E), (0x0200B, 0x0200F), (0x02028, 0x0202E), (0x02060, 0x02064), (0x02066, 0x0206F), (0x0D800, 0x0DFFF), (0x0FEFF, 0x0FEFF), (0x0FFF9, 0x0FFFB), (0x110BD, 0x110BD), (0x110CD, 0x110CD), (0x13430, 0x1343F), (0x1BCA0, 0x1BCA3), (0x1D173, 0x1D17A), (0xE0001, 0xE0001), (0xE0020, 0xE007F), ]; /// Width 0 combining marks. const COMBINING_TABLE: &'static [R] = &[ (0x00300, 0x0036F), (0x00483, 0x00489), (0x00591, 0x005BD), (0x005BF, 0x005BF), (0x005C1, 0x005C2), (0x005C4, 0x005C5), (0x005C7, 0x005C7), (0x00610, 0x0061A), (0x0064B, 0x0065F), (0x00670, 0x00670), (0x006D6, 0x006DC), (0x006DF, 0x006E4), (0x006E7, 0x006E8), (0x006EA, 0x006ED), (0x00711, 0x00711), (0x00730, 0x0074A), (0x007A6, 0x007B0), (0x007EB, 0x007F3), (0x007FD, 0x007FD), (0x00816, 0x00819), (0x0081B, 0x00823), (0x00825, 0x00827), (0x00829, 0x0082D), (0x00859, 0x0085B), (0x00898, 0x0089F), (0x008CA, 0x008E1), (0x008E3, 0x00903), (0x0093A, 0x0093C), (0x0093E, 0x0094F), (0x00951, 0x00957), (0x00962, 0x00963), (0x00981, 0x00983), (0x009BC, 0x009BC), (0x009BE, 0x009C4), (0x009C7, 0x009C8), (0x009CB, 0x009CD), (0x009D7, 0x009D7), (0x009E2, 0x009E3), (0x009FE, 0x009FE), (0x00A01, 0x00A03), (0x00A3C, 0x00A3C), (0x00A3E, 0x00A42), (0x00A47, 0x00A48), (0x00A4B, 0x00A4D), (0x00A51, 0x00A51), (0x00A70, 0x00A71), (0x00A75, 0x00A75), (0x00A81, 0x00A83), (0x00ABC, 0x00ABC), (0x00ABE, 0x00AC5), (0x00AC7, 0x00AC9), (0x00ACB, 0x00ACD), (0x00AE2, 0x00AE3), (0x00AFA, 0x00AFF), (0x00B01, 0x00B03), (0x00B3C, 0x00B3C), (0x00B3E, 0x00B44), (0x00B47, 0x00B48), (0x00B4B, 0x00B4D), (0x00B55, 0x00B57), (0x00B62, 0x00B63), (0x00B82, 0x00B82), (0x00BBE, 0x00BC2), (0x00BC6, 0x00BC8), (0x00BCA, 0x00BCD), (0x00BD7, 0x00BD7), (0x00C00, 0x00C04), (0x00C3C, 0x00C3C), (0x00C3E, 0x00C44), (0x00C46, 0x00C48), (0x00C4A, 0x00C4D), (0x00C55, 0x00C56), (0x00C62, 0x00C63), (0x00C81, 0x00C83), (0x00CBC, 0x00CBC), (0x00CBE, 0x00CC4), (0x00CC6, 0x00CC8), (0x00CCA, 0x00CCD), (0x00CD5, 0x00CD6), (0x00CE2, 0x00CE3), (0x00CF3, 0x00CF3), (0x00D00, 0x00D03), (0x00D3B, 0x00D3C), (0x00D3E, 0x00D44), (0x00D46, 0x00D48), (0x00D4A, 0x00D4D), (0x00D57, 0x00D57), (0x00D62, 0x00D63), (0x00D81, 0x00D83), (0x00DCA, 0x00DCA), (0x00DCF, 0x00DD4), (0x00DD6, 0x00DD6), (0x00DD8, 0x00DDF), (0x00DF2, 0x00DF3), (0x00E31, 0x00E31), (0x00E34, 0x00E3A), (0x00E47, 0x00E4E), (0x00EB1, 0x00EB1), (0x00EB4, 0x00EBC), (0x00EC8, 0x00ECE), (0x00F18, 0x00F19), (0x00F35, 0x00F35), (0x00F37, 0x00F37), (0x00F39, 0x00F39), (0x00F3E, 0x00F3F), (0x00F71, 0x00F84), (0x00F86, 0x00F87), (0x00F8D, 0x00F97), (0x00F99, 0x00FBC), (0x00FC6, 0x00FC6), (0x0102B, 0x0103E), (0x01056, 0x01059), (0x0105E, 0x01060), (0x01062, 0x01064), (0x01067, 0x0106D), (0x01071, 0x01074), (0x01082, 0x0108D), (0x0108F, 0x0108F), (0x0109A, 0x0109D), (0x0135D, 0x0135F), (0x01712, 0x01715), (0x01732, 0x01734), (0x01752, 0x01753), (0x01772, 0x01773), (0x017B4, 0x017D3), (0x017DD, 0x017DD), (0x0180B, 0x0180D), (0x0180F, 0x0180F), (0x01885, 0x01886), (0x018A9, 0x018A9), (0x01920, 0x0192B), (0x01930, 0x0193B), (0x01A17, 0x01A1B), (0x01A55, 0x01A5E), (0x01A60, 0x01A7C), (0x01A7F, 0x01A7F), (0x01AB0, 0x01ACE), (0x01B00, 0x01B04), (0x01B34, 0x01B44), (0x01B6B, 0x01B73), (0x01B80, 0x01B82), (0x01BA1, 0x01BAD), (0x01BE6, 0x01BF3), (0x01C24, 0x01C37), (0x01CD0, 0x01CD2), (0x01CD4, 0x01CE8), (0x01CED, 0x01CED), (0x01CF4, 0x01CF4), (0x01CF7, 0x01CF9), (0x01DC0, 0x01DFF), (0x020D0, 0x020F0), (0x02CEF, 0x02CF1), (0x02D7F, 0x02D7F), (0x02DE0, 0x02DFF), (0x0302A, 0x0302F), (0x03099, 0x0309A), (0x0A66F, 0x0A672), (0x0A674, 0x0A67D), (0x0A69E, 0x0A69F), (0x0A6F0, 0x0A6F1), (0x0A802, 0x0A802), (0x0A806, 0x0A806), (0x0A80B, 0x0A80B), (0x0A823, 0x0A827), (0x0A82C, 0x0A82C), (0x0A880, 0x0A881), (0x0A8B4, 0x0A8C5), (0x0A8E0, 0x0A8F1), (0x0A8FF, 0x0A8FF), (0x0A926, 0x0A92D), (0x0A947, 0x0A953), (0x0A980, 0x0A983), (0x0A9B3, 0x0A9C0), (0x0A9E5, 0x0A9E5), (0x0AA29, 0x0AA36), (0x0AA43, 0x0AA43), (0x0AA4C, 0x0AA4D), (0x0AA7B, 0x0AA7D), (0x0AAB0, 0x0AAB0), (0x0AAB2, 0x0AAB4), (0x0AAB7, 0x0AAB8), (0x0AABE, 0x0AABF), (0x0AAC1, 0x0AAC1), (0x0AAEB, 0x0AAEF), (0x0AAF5, 0x0AAF6), (0x0ABE3, 0x0ABEA), (0x0ABEC, 0x0ABED), (0x0FB1E, 0x0FB1E), (0x0FE00, 0x0FE0F), (0x0FE20, 0x0FE2F), (0x101FD, 0x101FD), (0x102E0, 0x102E0), (0x10376, 0x1037A), (0x10A01, 0x10A03), (0x10A05, 0x10A06), (0x10A0C, 0x10A0F), (0x10A38, 0x10A3A), (0x10A3F, 0x10A3F), (0x10AE5, 0x10AE6), (0x10D24, 0x10D27), (0x10EAB, 0x10EAC), (0x10EFD, 0x10EFF), (0x10F46, 0x10F50), (0x10F82, 0x10F85), (0x11000, 0x11002), (0x11038, 0x11046), (0x11070, 0x11070), (0x11073, 0x11074), (0x1107F, 0x11082), (0x110B0, 0x110BA), (0x110C2, 0x110C2), (0x11100, 0x11102), (0x11127, 0x11134), (0x11145, 0x11146), (0x11173, 0x11173), (0x11180, 0x11182), (0x111B3, 0x111C0), (0x111C9, 0x111CC), (0x111CE, 0x111CF), (0x1122C, 0x11237), (0x1123E, 0x1123E), (0x11241, 0x11241), (0x112DF, 0x112EA), (0x11300, 0x11303), (0x1133B, 0x1133C), (0x1133E, 0x11344), (0x11347, 0x11348), (0x1134B, 0x1134D), (0x11357, 0x11357), (0x11362, 0x11363), (0x11366, 0x1136C), (0x11370, 0x11374), (0x11435, 0x11446), (0x1145E, 0x1145E), (0x114B0, 0x114C3), (0x115AF, 0x115B5), (0x115B8, 0x115C0), (0x115DC, 0x115DD), (0x11630, 0x11640), (0x116AB, 0x116B7), (0x1171D, 0x1172B), (0x1182C, 0x1183A), (0x11930, 0x11935), (0x11937, 0x11938), (0x1193B, 0x1193E), (0x11940, 0x11940), (0x11942, 0x11943), (0x119D1, 0x119D7), (0x119DA, 0x119E0), (0x119E4, 0x119E4), (0x11A01, 0x11A0A), (0x11A33, 0x11A39), (0x11A3B, 0x11A3E), (0x11A47, 0x11A47), (0x11A51, 0x11A5B), (0x11A8A, 0x11A99), (0x11C2F, 0x11C36), (0x11C38, 0x11C3F), (0x11C92, 0x11CA7), (0x11CA9, 0x11CB6), (0x11D31, 0x11D36), (0x11D3A, 0x11D3A), (0x11D3C, 0x11D3D), (0x11D3F, 0x11D45), (0x11D47, 0x11D47), (0x11D8A, 0x11D8E), (0x11D90, 0x11D91), (0x11D93, 0x11D97), (0x11EF3, 0x11EF6), (0x11F00, 0x11F01), (0x11F03, 0x11F03), (0x11F34, 0x11F3A), (0x11F3E, 0x11F42), (0x13440, 0x13440), (0x13447, 0x13455), (0x16AF0, 0x16AF4), (0x16B30, 0x16B36), (0x16F4F, 0x16F4F), (0x16F51, 0x16F87), (0x16F8F, 0x16F92), (0x16FE4, 0x16FE4), (0x16FF0, 0x16FF1), (0x1BC9D, 0x1BC9E), (0x1CF00, 0x1CF2D), (0x1CF30, 0x1CF46), (0x1D165, 0x1D169), (0x1D16D, 0x1D172), (0x1D17B, 0x1D182), (0x1D185, 0x1D18B), (0x1D1AA, 0x1D1AD), (0x1D242, 0x1D244), (0x1DA00, 0x1DA36), (0x1DA3B, 0x1DA6C), (0x1DA75, 0x1DA75), (0x1DA84, 0x1DA84), (0x1DA9B, 0x1DA9F), (0x1DAA1, 0x1DAAF), (0x1E000, 0x1E006), (0x1E008, 0x1E018), (0x1E01B, 0x1E021), (0x1E023, 0x1E024), (0x1E026, 0x1E02A), (0x1E08F, 0x1E08F), (0x1E130, 0x1E136), (0x1E2AE, 0x1E2AE), (0x1E2EC, 0x1E2EF), (0x1E4EC, 0x1E4EF), (0x1E8D0, 0x1E8D6), (0x1E944, 0x1E94A), (0xE0100, 0xE01EF), ]; /// Width 0 combining letters. const COMBININGLETTERS_TABLE: &'static [R] = &[(0x01160, 0x011FF), (0x0D7B0, 0x0D7FF)]; /// Width 2 characters. const DOUBLEWIDE_TABLE: &'static [R] = &[ (0x01100, 0x0115F), (0x02329, 0x0232A), (0x02E80, 0x02E99), (0x02E9B, 0x02EF3), (0x02F00, 0x02FD5), (0x02FF0, 0x02FFB), (0x03000, 0x0303E), (0x03041, 0x03096), (0x03099, 0x030FF), (0x03105, 0x0312F), (0x03131, 0x0318E), (0x03190, 0x031E3), (0x031F0, 0x0321E), (0x03220, 0x03247), (0x03250, 0x04DBF), (0x04E00, 0x0A48C), (0x0A490, 0x0A4C6), (0x0A960, 0x0A97C), (0x0AC00, 0x0D7A3), (0x0F900, 0x0FAFF), (0x0FE10, 0x0FE19), (0x0FE30, 0x0FE52), (0x0FE54, 0x0FE66), (0x0FE68, 0x0FE6B), (0x0FF01, 0x0FF60), (0x0FFE0, 0x0FFE6), (0x16FE0, 0x16FE4), (0x16FF0, 0x16FF1), (0x17000, 0x187F7), (0x18800, 0x18CD5), (0x18D00, 0x18D08), (0x1AFF0, 0x1AFF3), (0x1AFF5, 0x1AFFB), (0x1AFFD, 0x1AFFE), (0x1B000, 0x1B122), (0x1B132, 0x1B132), (0x1B150, 0x1B152), (0x1B155, 0x1B155), (0x1B164, 0x1B167), (0x1B170, 0x1B2FB), (0x1F200, 0x1F200), (0x1F202, 0x1F202), (0x1F210, 0x1F219), (0x1F21B, 0x1F22E), (0x1F230, 0x1F231), (0x1F237, 0x1F237), (0x1F23B, 0x1F23B), (0x1F240, 0x1F248), (0x1F260, 0x1F265), (0x1F57A, 0x1F57A), (0x1F5A4, 0x1F5A4), (0x1F6D1, 0x1F6D2), (0x1F6D5, 0x1F6D7), (0x1F6DC, 0x1F6DF), (0x1F6F4, 0x1F6FC), (0x1F7E0, 0x1F7EB), (0x1F7F0, 0x1F7F0), (0x1F90C, 0x1F90F), (0x1F919, 0x1F93A), (0x1F93C, 0x1F945), (0x1F947, 0x1F97F), (0x1F985, 0x1F9BF), (0x1F9C1, 0x1F9FF), (0x1FA70, 0x1FA7C), (0x1FA80, 0x1FA88), (0x1FA90, 0x1FABD), (0x1FABF, 0x1FAC5), (0x1FACE, 0x1FADB), (0x1FAE0, 0x1FAE8), (0x1FAF0, 0x1FAF8), (0x20000, 0x2FFFD), (0x30000, 0x3FFFD), ]; /// Ambiguous-width characters. const AMBIGUOUS_TABLE: &'static [R] = &[ (0x000A1, 0x000A1), (0x000A4, 0x000A4), (0x000A7, 0x000A8), (0x000AA, 0x000AA), (0x000AD, 0x000AE), (0x000B0, 0x000B4), (0x000B6, 0x000BA), (0x000BC, 0x000BF), (0x000C6, 0x000C6), (0x000D0, 0x000D0), (0x000D7, 0x000D8), (0x000DE, 0x000E1), (0x000E6, 0x000E6), (0x000E8, 0x000EA), (0x000EC, 0x000ED), (0x000F0, 0x000F0), (0x000F2, 0x000F3), (0x000F7, 0x000FA), (0x000FC, 0x000FC), (0x000FE, 0x000FE), (0x00101, 0x00101), (0x00111, 0x00111), (0x00113, 0x00113), (0x0011B, 0x0011B), (0x00126, 0x00127), (0x0012B, 0x0012B), (0x00131, 0x00133), (0x00138, 0x00138), (0x0013F, 0x00142), (0x00144, 0x00144), (0x00148, 0x0014B), (0x0014D, 0x0014D), (0x00152, 0x00153), (0x00166, 0x00167), (0x0016B, 0x0016B), (0x001CE, 0x001CE), (0x001D0, 0x001D0), (0x001D2, 0x001D2), (0x001D4, 0x001D4), (0x001D6, 0x001D6), (0x001D8, 0x001D8), (0x001DA, 0x001DA), (0x001DC, 0x001DC), (0x00251, 0x00251), (0x00261, 0x00261), (0x002C4, 0x002C4), (0x002C7, 0x002C7), (0x002C9, 0x002CB), (0x002CD, 0x002CD), (0x002D0, 0x002D0), (0x002D8, 0x002DB), (0x002DD, 0x002DD), (0x002DF, 0x002DF), (0x00300, 0x0036F), (0x00391, 0x003A1), (0x003A3, 0x003A9), (0x003B1, 0x003C1), (0x003C3, 0x003C9), (0x00401, 0x00401), (0x00410, 0x0044F), (0x00451, 0x00451), (0x02010, 0x02010), (0x02013, 0x02016), (0x02018, 0x02019), (0x0201C, 0x0201D), (0x02020, 0x02022), (0x02024, 0x02027), (0x02030, 0x02030), (0x02032, 0x02033), (0x02035, 0x02035), (0x0203B, 0x0203B), (0x0203E, 0x0203E), (0x02074, 0x02074), (0x0207F, 0x0207F), (0x02081, 0x02084), (0x020AC, 0x020AC), (0x02103, 0x02103), (0x02105, 0x02105), (0x02109, 0x02109), (0x02113, 0x02113), (0x02116, 0x02116), (0x02121, 0x02122), (0x02126, 0x02126), (0x0212B, 0x0212B), (0x02153, 0x02154), (0x0215B, 0x0215E), (0x02160, 0x0216B), (0x02170, 0x02179), (0x02189, 0x02189), (0x02190, 0x02199), (0x021B8, 0x021B9), (0x021D2, 0x021D2), (0x021D4, 0x021D4), (0x021E7, 0x021E7), (0x02200, 0x02200), (0x02202, 0x02203), (0x02207, 0x02208), (0x0220B, 0x0220B), (0x0220F, 0x0220F), (0x02211, 0x02211), (0x02215, 0x02215), (0x0221A, 0x0221A), (0x0221D, 0x02220), (0x02223, 0x02223), (0x02225, 0x02225), (0x02227, 0x0222C), (0x0222E, 0x0222E), (0x02234, 0x02237), (0x0223C, 0x0223D), (0x02248, 0x02248), (0x0224C, 0x0224C), (0x02252, 0x02252), (0x02260, 0x02261), (0x02264, 0x02267), (0x0226A, 0x0226B), (0x0226E, 0x0226F), (0x02282, 0x02283), (0x02286, 0x02287), (0x02295, 0x02295), (0x02299, 0x02299), (0x022A5, 0x022A5), (0x022BF, 0x022BF), (0x02312, 0x02312), (0x02460, 0x024E9), (0x024EB, 0x0254B), (0x02550, 0x02573), (0x02580, 0x0258F), (0x02592, 0x02595), (0x025A0, 0x025A1), (0x025A3, 0x025A9), (0x025B2, 0x025B3), (0x025B6, 0x025B7), (0x025BC, 0x025BD), (0x025C0, 0x025C1), (0x025C6, 0x025C8), (0x025CB, 0x025CB), (0x025CE, 0x025D1), (0x025E2, 0x025E5), (0x025EF, 0x025EF), (0x02605, 0x02606), (0x02609, 0x02609), (0x0260E, 0x0260F), (0x0261C, 0x0261C), (0x0261E, 0x0261E), (0x02640, 0x02640), (0x02642, 0x02642), (0x02660, 0x02661), (0x02663, 0x02665), (0x02667, 0x0266A), (0x0266C, 0x0266D), (0x0266F, 0x0266F), (0x0269E, 0x0269F), (0x026BF, 0x026BF), (0x026C6, 0x026CD), (0x026CF, 0x026D3), (0x026D5, 0x026E1), (0x026E3, 0x026E3), (0x026E8, 0x026E9), (0x026EB, 0x026F1), (0x026F4, 0x026F4), (0x026F6, 0x026F9), (0x026FB, 0x026FC), (0x026FE, 0x026FF), (0x0273D, 0x0273D), (0x02776, 0x0277F), (0x02B56, 0x02B59), (0x03248, 0x0324F), (0x0E000, 0x0F8FF), (0x0FE00, 0x0FE0F), (0x0FFFD, 0x0FFFD), (0x1F100, 0x1F10A), (0x1F110, 0x1F12D), (0x1F130, 0x1F169), (0x1F170, 0x1F18D), (0x1F18F, 0x1F190), (0x1F19B, 0x1F1AC), (0xE0100, 0xE01EF), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD), ]; /// Unassigned characters. const UNASSIGNED_TABLE: &'static [R] = &[ (0x00378, 0x00379), (0x00380, 0x00383), (0x0038B, 0x0038B), (0x0038D, 0x0038D), (0x003A2, 0x003A2), (0x00530, 0x00530), (0x00557, 0x00558), (0x0058B, 0x0058C), (0x00590, 0x00590), (0x005C8, 0x005CF), (0x005EB, 0x005EE), (0x005F5, 0x005FF), (0x0070E, 0x0070E), (0x0074B, 0x0074C), (0x007B2, 0x007BF), (0x007FB, 0x007FC), (0x0082E, 0x0082F), (0x0083F, 0x0083F), (0x0085C, 0x0085D), (0x0085F, 0x0085F), (0x0086B, 0x0086F), (0x0088F, 0x0088F), (0x00892, 0x00897), (0x00984, 0x00984), (0x0098D, 0x0098E), (0x00991, 0x00992), (0x009A9, 0x009A9), (0x009B1, 0x009B1), (0x009B3, 0x009B5), (0x009BA, 0x009BB), (0x009C5, 0x009C6), (0x009C9, 0x009CA), (0x009CF, 0x009D6), (0x009D8, 0x009DB), (0x009DE, 0x009DE), (0x009E4, 0x009E5), (0x009FF, 0x00A00), (0x00A04, 0x00A04), (0x00A0B, 0x00A0E), (0x00A11, 0x00A12), (0x00A29, 0x00A29), (0x00A31, 0x00A31), (0x00A34, 0x00A34), (0x00A37, 0x00A37), (0x00A3A, 0x00A3B), (0x00A3D, 0x00A3D), (0x00A43, 0x00A46), (0x00A49, 0x00A4A), (0x00A4E, 0x00A50), (0x00A52, 0x00A58), (0x00A5D, 0x00A5D), (0x00A5F, 0x00A65), (0x00A77, 0x00A80), (0x00A84, 0x00A84), (0x00A8E, 0x00A8E), (0x00A92, 0x00A92), (0x00AA9, 0x00AA9), (0x00AB1, 0x00AB1), (0x00AB4, 0x00AB4), (0x00ABA, 0x00ABB), (0x00AC6, 0x00AC6), (0x00ACA, 0x00ACA), (0x00ACE, 0x00ACF), (0x00AD1, 0x00ADF), (0x00AE4, 0x00AE5), (0x00AF2, 0x00AF8), (0x00B00, 0x00B00), (0x00B04, 0x00B04), (0x00B0D, 0x00B0E), (0x00B11, 0x00B12), (0x00B29, 0x00B29), (0x00B31, 0x00B31), (0x00B34, 0x00B34), (0x00B3A, 0x00B3B), (0x00B45, 0x00B46), (0x00B49, 0x00B4A), (0x00B4E, 0x00B54), (0x00B58, 0x00B5B), (0x00B5E, 0x00B5E), (0x00B64, 0x00B65), (0x00B78, 0x00B81), (0x00B84, 0x00B84), (0x00B8B, 0x00B8D), (0x00B91, 0x00B91), (0x00B96, 0x00B98), (0x00B9B, 0x00B9B), (0x00B9D, 0x00B9D), (0x00BA0, 0x00BA2), (0x00BA5, 0x00BA7), (0x00BAB, 0x00BAD), (0x00BBA, 0x00BBD), (0x00BC3, 0x00BC5), (0x00BC9, 0x00BC9), (0x00BCE, 0x00BCF), (0x00BD1, 0x00BD6), (0x00BD8, 0x00BE5), (0x00BFB, 0x00BFF), (0x00C0D, 0x00C0D), (0x00C11, 0x00C11), (0x00C29, 0x00C29), (0x00C3A, 0x00C3B), (0x00C45, 0x00C45), (0x00C49, 0x00C49), (0x00C4E, 0x00C54), (0x00C57, 0x00C57), (0x00C5B, 0x00C5C), (0x00C5E, 0x00C5F), (0x00C64, 0x00C65), (0x00C70, 0x00C76), (0x00C8D, 0x00C8D), (0x00C91, 0x00C91), (0x00CA9, 0x00CA9), (0x00CB4, 0x00CB4), (0x00CBA, 0x00CBB), (0x00CC5, 0x00CC5), (0x00CC9, 0x00CC9), (0x00CCE, 0x00CD4), (0x00CD7, 0x00CDC), (0x00CDF, 0x00CDF), (0x00CE4, 0x00CE5), (0x00CF0, 0x00CF0), (0x00CF4, 0x00CFF), (0x00D0D, 0x00D0D), (0x00D11, 0x00D11), (0x00D45, 0x00D45), (0x00D49, 0x00D49), (0x00D50, 0x00D53), (0x00D64, 0x00D65), (0x00D80, 0x00D80), (0x00D84, 0x00D84), (0x00D97, 0x00D99), (0x00DB2, 0x00DB2), (0x00DBC, 0x00DBC), (0x00DBE, 0x00DBF), (0x00DC7, 0x00DC9), (0x00DCB, 0x00DCE), (0x00DD5, 0x00DD5), (0x00DD7, 0x00DD7), (0x00DE0, 0x00DE5), (0x00DF0, 0x00DF1), (0x00DF5, 0x00E00), (0x00E3B, 0x00E3E), (0x00E5C, 0x00E80), (0x00E83, 0x00E83), (0x00E85, 0x00E85), (0x00E8B, 0x00E8B), (0x00EA4, 0x00EA4), (0x00EA6, 0x00EA6), (0x00EBE, 0x00EBF), (0x00EC5, 0x00EC5), (0x00EC7, 0x00EC7), (0x00ECF, 0x00ECF), (0x00EDA, 0x00EDB), (0x00EE0, 0x00EFF), (0x00F48, 0x00F48), (0x00F6D, 0x00F70), (0x00F98, 0x00F98), (0x00FBD, 0x00FBD), (0x00FCD, 0x00FCD), (0x00FDB, 0x00FFF), (0x010C6, 0x010C6), (0x010C8, 0x010CC), (0x010CE, 0x010CF), (0x01249, 0x01249), (0x0124E, 0x0124F), (0x01257, 0x01257), (0x01259, 0x01259), (0x0125E, 0x0125F), (0x01289, 0x01289), (0x0128E, 0x0128F), (0x012B1, 0x012B1), (0x012B6, 0x012B7), (0x012BF, 0x012BF), (0x012C1, 0x012C1), (0x012C6, 0x012C7), (0x012D7, 0x012D7), (0x01311, 0x01311), (0x01316, 0x01317), (0x0135B, 0x0135C), (0x0137D, 0x0137F), (0x0139A, 0x0139F), (0x013F6, 0x013F7), (0x013FE, 0x013FF), (0x0169D, 0x0169F), (0x016F9, 0x016FF), (0x01716, 0x0171E), (0x01737, 0x0173F), (0x01754, 0x0175F), (0x0176D, 0x0176D), (0x01771, 0x01771), (0x01774, 0x0177F), (0x017DE, 0x017DF), (0x017EA, 0x017EF), (0x017FA, 0x017FF), (0x0181A, 0x0181F), (0x01879, 0x0187F), (0x018AB, 0x018AF), (0x018F6, 0x018FF), (0x0191F, 0x0191F), (0x0192C, 0x0192F), (0x0193C, 0x0193F), (0x01941, 0x01943), (0x0196E, 0x0196F), (0x01975, 0x0197F), (0x019AC, 0x019AF), (0x019CA, 0x019CF), (0x019DB, 0x019DD), (0x01A1C, 0x01A1D), (0x01A5F, 0x01A5F), (0x01A7D, 0x01A7E), (0x01A8A, 0x01A8F), (0x01A9A, 0x01A9F), (0x01AAE, 0x01AAF), (0x01ACF, 0x01AFF), (0x01B4D, 0x01B4F), (0x01B7F, 0x01B7F), (0x01BF4, 0x01BFB), (0x01C38, 0x01C3A), (0x01C4A, 0x01C4C), (0x01C89, 0x01C8F), (0x01CBB, 0x01CBC), (0x01CC8, 0x01CCF), (0x01CFB, 0x01CFF), (0x01F16, 0x01F17), (0x01F1E, 0x01F1F), (0x01F46, 0x01F47), (0x01F4E, 0x01F4F), (0x01F58, 0x01F58), (0x01F5A, 0x01F5A), (0x01F5C, 0x01F5C), (0x01F5E, 0x01F5E), (0x01F7E, 0x01F7F), (0x01FB5, 0x01FB5), (0x01FC5, 0x01FC5), (0x01FD4, 0x01FD5), (0x01FDC, 0x01FDC), (0x01FF0, 0x01FF1), (0x01FF5, 0x01FF5), (0x01FFF, 0x01FFF), (0x02065, 0x02065), (0x02072, 0x02073), (0x0208F, 0x0208F), (0x0209D, 0x0209F), (0x020C1, 0x020CF), (0x020F1, 0x020FF), (0x0218C, 0x0218F), (0x02427, 0x0243F), (0x0244B, 0x0245F), (0x02B74, 0x02B75), (0x02B96, 0x02B96), (0x02CF4, 0x02CF8), (0x02D26, 0x02D26), (0x02D28, 0x02D2C), (0x02D2E, 0x02D2F), (0x02D68, 0x02D6E), (0x02D71, 0x02D7E), (0x02D97, 0x02D9F), (0x02DA7, 0x02DA7), (0x02DAF, 0x02DAF), (0x02DB7, 0x02DB7), (0x02DBF, 0x02DBF), (0x02DC7, 0x02DC7), (0x02DCF, 0x02DCF), (0x02DD7, 0x02DD7), (0x02DDF, 0x02DDF), (0x02E5E, 0x02E7F), (0x02E9A, 0x02E9A), (0x02EF4, 0x02EFF), (0x02FD6, 0x02FEF), (0x02FFC, 0x02FFF), (0x03040, 0x03040), (0x03097, 0x03098), (0x03100, 0x03104), (0x03130, 0x03130), (0x0318F, 0x0318F), (0x031E4, 0x031EF), (0x0321F, 0x0321F), (0x03401, 0x04DBE), (0x04E01, 0x09FFE), (0x0A48D, 0x0A48F), (0x0A4C7, 0x0A4CF), (0x0A62C, 0x0A63F), (0x0A6F8, 0x0A6FF), (0x0A7CB, 0x0A7CF), (0x0A7D2, 0x0A7D2), (0x0A7D4, 0x0A7D4), (0x0A7DA, 0x0A7F1), (0x0A82D, 0x0A82F), (0x0A83A, 0x0A83F), (0x0A878, 0x0A87F), (0x0A8C6, 0x0A8CD), (0x0A8DA, 0x0A8DF), (0x0A954, 0x0A95E), (0x0A97D, 0x0A97F), (0x0A9CE, 0x0A9CE), (0x0A9DA, 0x0A9DD), (0x0A9FF, 0x0A9FF), (0x0AA37, 0x0AA3F), (0x0AA4E, 0x0AA4F), (0x0AA5A, 0x0AA5B), (0x0AAC3, 0x0AADA), (0x0AAF7, 0x0AB00), (0x0AB07, 0x0AB08), (0x0AB0F, 0x0AB10), (0x0AB17, 0x0AB1F), (0x0AB27, 0x0AB27), (0x0AB2F, 0x0AB2F), (0x0AB6C, 0x0AB6F), (0x0ABEE, 0x0ABEF), (0x0ABFA, 0x0ABFF), (0x0AC01, 0x0D7A2), (0x0D7A4, 0x0D7AF), (0x0D7C7, 0x0D7CA), (0x0D7FC, 0x0D7FF), (0x0FA6E, 0x0FA6F), (0x0FADA, 0x0FAFF), (0x0FB07, 0x0FB12), (0x0FB18, 0x0FB1C), (0x0FB37, 0x0FB37), (0x0FB3D, 0x0FB3D), (0x0FB3F, 0x0FB3F), (0x0FB42, 0x0FB42), (0x0FB45, 0x0FB45), (0x0FBC3, 0x0FBD2), (0x0FD90, 0x0FD91), (0x0FDC8, 0x0FDCE), (0x0FE1A, 0x0FE1F), (0x0FE53, 0x0FE53), (0x0FE67, 0x0FE67), (0x0FE6C, 0x0FE6F), (0x0FE75, 0x0FE75), (0x0FEFD, 0x0FEFE), (0x0FF00, 0x0FF00), (0x0FFBF, 0x0FFC1), (0x0FFC8, 0x0FFC9), (0x0FFD0, 0x0FFD1), (0x0FFD8, 0x0FFD9), (0x0FFDD, 0x0FFDF), (0x0FFE7, 0x0FFE7), (0x0FFEF, 0x0FFF8), (0x1000C, 0x1000C), (0x10027, 0x10027), (0x1003B, 0x1003B), (0x1003E, 0x1003E), (0x1004E, 0x1004F), (0x1005E, 0x1007F), (0x100FB, 0x100FF), (0x10103, 0x10106), (0x10134, 0x10136), (0x1018F, 0x1018F), (0x1019D, 0x1019F), (0x101A1, 0x101CF), (0x101FE, 0x1027F), (0x1029D, 0x1029F), (0x102D1, 0x102DF), (0x102FC, 0x102FF), (0x10324, 0x1032C), (0x1034B, 0x1034F), (0x1037B, 0x1037F), (0x1039E, 0x1039E), (0x103C4, 0x103C7), (0x103D6, 0x103FF), (0x1049E, 0x1049F), (0x104AA, 0x104AF), (0x104D4, 0x104D7), (0x104FC, 0x104FF), (0x10528, 0x1052F), (0x10564, 0x1056E), (0x1057B, 0x1057B), (0x1058B, 0x1058B), (0x10593, 0x10593), (0x10596, 0x10596), (0x105A2, 0x105A2), (0x105B2, 0x105B2), (0x105BA, 0x105BA), (0x105BD, 0x105FF), (0x10737, 0x1073F), (0x10756, 0x1075F), (0x10768, 0x1077F), (0x10786, 0x10786), (0x107B1, 0x107B1), (0x107BB, 0x107FF), (0x10806, 0x10807), (0x10809, 0x10809), (0x10836, 0x10836), (0x10839, 0x1083B), (0x1083D, 0x1083E), (0x10856, 0x10856), (0x1089F, 0x108A6), (0x108B0, 0x108DF), (0x108F3, 0x108F3), (0x108F6, 0x108FA), (0x1091C, 0x1091E), (0x1093A, 0x1093E), (0x10940, 0x1097F), (0x109B8, 0x109BB), (0x109D0, 0x109D1), (0x10A04, 0x10A04), (0x10A07, 0x10A0B), (0x10A14, 0x10A14), (0x10A18, 0x10A18), (0x10A36, 0x10A37), (0x10A3B, 0x10A3E), (0x10A49, 0x10A4F), (0x10A59, 0x10A5F), (0x10AA0, 0x10ABF), (0x10AE7, 0x10AEA), (0x10AF7, 0x10AFF), (0x10B36, 0x10B38), (0x10B56, 0x10B57), (0x10B73, 0x10B77), (0x10B92, 0x10B98), (0x10B9D, 0x10BA8), (0x10BB0, 0x10BFF), (0x10C49, 0x10C7F), (0x10CB3, 0x10CBF), (0x10CF3, 0x10CF9), (0x10D28, 0x10D2F), (0x10D3A, 0x10E5F), (0x10E7F, 0x10E7F), (0x10EAA, 0x10EAA), (0x10EAE, 0x10EAF), (0x10EB2, 0x10EFC), (0x10F28, 0x10F2F), (0x10F5A, 0x10F6F), (0x10F8A, 0x10FAF), (0x10FCC, 0x10FDF), (0x10FF7, 0x10FFF), (0x1104E, 0x11051), (0x11076, 0x1107E), (0x110C3, 0x110CC), (0x110CE, 0x110CF), (0x110E9, 0x110EF), (0x110FA, 0x110FF), (0x11135, 0x11135), (0x11148, 0x1114F), (0x11177, 0x1117F), (0x111E0, 0x111E0), (0x111F5, 0x111FF), (0x11212, 0x11212), (0x11242, 0x1127F), (0x11287, 0x11287), (0x11289, 0x11289), (0x1128E, 0x1128E), (0x1129E, 0x1129E), (0x112AA, 0x112AF), (0x112EB, 0x112EF), (0x112FA, 0x112FF), (0x11304, 0x11304), (0x1130D, 0x1130E), (0x11311, 0x11312), (0x11329, 0x11329), (0x11331, 0x11331), (0x11334, 0x11334), (0x1133A, 0x1133A), (0x11345, 0x11346), (0x11349, 0x1134A), (0x1134E, 0x1134F), (0x11351, 0x11356), (0x11358, 0x1135C), (0x11364, 0x11365), (0x1136D, 0x1136F), (0x11375, 0x113FF), (0x1145C, 0x1145C), (0x11462, 0x1147F), (0x114C8, 0x114CF), (0x114DA, 0x1157F), (0x115B6, 0x115B7), (0x115DE, 0x115FF), (0x11645, 0x1164F), (0x1165A, 0x1165F), (0x1166D, 0x1167F), (0x116BA, 0x116BF), (0x116CA, 0x116FF), (0x1171B, 0x1171C), (0x1172C, 0x1172F), (0x11747, 0x117FF), (0x1183C, 0x1189F), (0x118F3, 0x118FE), (0x11907, 0x11908), (0x1190A, 0x1190B), (0x11914, 0x11914), (0x11917, 0x11917), (0x11936, 0x11936), (0x11939, 0x1193A), (0x11947, 0x1194F), (0x1195A, 0x1199F), (0x119A8, 0x119A9), (0x119D8, 0x119D9), (0x119E5, 0x119FF), (0x11A48, 0x11A4F), (0x11AA3, 0x11AAF), (0x11AF9, 0x11AFF), (0x11B0A, 0x11BFF), (0x11C09, 0x11C09), (0x11C37, 0x11C37), (0x11C46, 0x11C4F), (0x11C6D, 0x11C6F), (0x11C90, 0x11C91), (0x11CA8, 0x11CA8), (0x11CB7, 0x11CFF), (0x11D07, 0x11D07), (0x11D0A, 0x11D0A), (0x11D37, 0x11D39), (0x11D3B, 0x11D3B), (0x11D3E, 0x11D3E), (0x11D48, 0x11D4F), (0x11D5A, 0x11D5F), (0x11D66, 0x11D66), (0x11D69, 0x11D69), (0x11D8F, 0x11D8F), (0x11D92, 0x11D92), (0x11D99, 0x11D9F), (0x11DAA, 0x11EDF), (0x11EF9, 0x11EFF), (0x11F11, 0x11F11), (0x11F3B, 0x11F3D), (0x11F5A, 0x11FAF), (0x11FB1, 0x11FBF), (0x11FF2, 0x11FFE), (0x1239A, 0x123FF), (0x1246F, 0x1246F), (0x12475, 0x1247F), (0x12544, 0x12F8F), (0x12FF3, 0x12FFF), (0x13456, 0x143FF), (0x14647, 0x167FF), (0x16A39, 0x16A3F), (0x16A5F, 0x16A5F), (0x16A6A, 0x16A6D), (0x16ABF, 0x16ABF), (0x16ACA, 0x16ACF), (0x16AEE, 0x16AEF), (0x16AF6, 0x16AFF), (0x16B46, 0x16B4F), (0x16B5A, 0x16B5A), (0x16B62, 0x16B62), (0x16B78, 0x16B7C), (0x16B90, 0x16E3F), (0x16E9B, 0x16EFF), (0x16F4B, 0x16F4E), (0x16F88, 0x16F8E), (0x16FA0, 0x16FDF), (0x16FE5, 0x16FEF), (0x16FF2, 0x16FFF), (0x17001, 0x187F6), (0x187F8, 0x187FF), (0x18CD6, 0x18CFF), (0x18D01, 0x18D07), (0x18D09, 0x1AFEF), (0x1AFF4, 0x1AFF4), (0x1AFFC, 0x1AFFC), (0x1AFFF, 0x1AFFF), (0x1B123, 0x1B131), (0x1B133, 0x1B14F), (0x1B153, 0x1B154), (0x1B156, 0x1B163), (0x1B168, 0x1B16F), (0x1B2FC, 0x1BBFF), (0x1BC6B, 0x1BC6F), (0x1BC7D, 0x1BC7F), (0x1BC89, 0x1BC8F), (0x1BC9A, 0x1BC9B), (0x1BCA4, 0x1CEFF), (0x1CF2E, 0x1CF2F), (0x1CF47, 0x1CF4F), (0x1CFC4, 0x1CFFF), (0x1D0F6, 0x1D0FF), (0x1D127, 0x1D128), (0x1D1EB, 0x1D1FF), (0x1D246, 0x1D2BF), (0x1D2D4, 0x1D2DF), (0x1D2F4, 0x1D2FF), (0x1D357, 0x1D35F), (0x1D379, 0x1D3FF), (0x1D455, 0x1D455), (0x1D49D, 0x1D49D), (0x1D4A0, 0x1D4A1), (0x1D4A3, 0x1D4A4), (0x1D4A7, 0x1D4A8), (0x1D4AD, 0x1D4AD), (0x1D4BA, 0x1D4BA), (0x1D4BC, 0x1D4BC), (0x1D4C4, 0x1D4C4), (0x1D506, 0x1D506), (0x1D50B, 0x1D50C), (0x1D515, 0x1D515), (0x1D51D, 0x1D51D), (0x1D53A, 0x1D53A), (0x1D53F, 0x1D53F), (0x1D545, 0x1D545), (0x1D547, 0x1D549), (0x1D551, 0x1D551), (0x1D6A6, 0x1D6A7), (0x1D7CC, 0x1D7CD), (0x1DA8C, 0x1DA9A), (0x1DAA0, 0x1DAA0), (0x1DAB0, 0x1DEFF), (0x1DF1F, 0x1DF24), (0x1DF2B, 0x1DFFF), (0x1E007, 0x1E007), (0x1E019, 0x1E01A), (0x1E022, 0x1E022), (0x1E025, 0x1E025), (0x1E02B, 0x1E02F), (0x1E06E, 0x1E08E), (0x1E090, 0x1E0FF), (0x1E12D, 0x1E12F), (0x1E13E, 0x1E13F), (0x1E14A, 0x1E14D), (0x1E150, 0x1E28F), (0x1E2AF, 0x1E2BF), (0x1E2FA, 0x1E2FE), (0x1E300, 0x1E4CF), (0x1E4FA, 0x1E7DF), (0x1E7E7, 0x1E7E7), (0x1E7EC, 0x1E7EC), (0x1E7EF, 0x1E7EF), (0x1E7FF, 0x1E7FF), (0x1E8C5, 0x1E8C6), (0x1E8D7, 0x1E8FF), (0x1E94C, 0x1E94F), (0x1E95A, 0x1E95D), (0x1E960, 0x1EC70), (0x1ECB5, 0x1ED00), (0x1ED3E, 0x1EDFF), (0x1EE04, 0x1EE04), (0x1EE20, 0x1EE20), (0x1EE23, 0x1EE23), (0x1EE25, 0x1EE26), (0x1EE28, 0x1EE28), (0x1EE33, 0x1EE33), (0x1EE38, 0x1EE38), (0x1EE3A, 0x1EE3A), (0x1EE3C, 0x1EE41), (0x1EE43, 0x1EE46), (0x1EE48, 0x1EE48), (0x1EE4A, 0x1EE4A), (0x1EE4C, 0x1EE4C), (0x1EE50, 0x1EE50), (0x1EE53, 0x1EE53), (0x1EE55, 0x1EE56), (0x1EE58, 0x1EE58), (0x1EE5A, 0x1EE5A), (0x1EE5C, 0x1EE5C), (0x1EE5E, 0x1EE5E), (0x1EE60, 0x1EE60), (0x1EE63, 0x1EE63), (0x1EE65, 0x1EE66), (0x1EE6B, 0x1EE6B), (0x1EE73, 0x1EE73), (0x1EE78, 0x1EE78), (0x1EE7D, 0x1EE7D), (0x1EE7F, 0x1EE7F), (0x1EE8A, 0x1EE8A), (0x1EE9C, 0x1EEA0), (0x1EEA4, 0x1EEA4), (0x1EEAA, 0x1EEAA), (0x1EEBC, 0x1EEEF), (0x1EEF2, 0x1EFFF), (0x1F02C, 0x1F02F), (0x1F094, 0x1F09F), (0x1F0AF, 0x1F0B0), (0x1F0C0, 0x1F0C0), (0x1F0D0, 0x1F0D0), (0x1F0F6, 0x1F0FF), (0x1F1AE, 0x1F1E5), (0x1F203, 0x1F20F), (0x1F23C, 0x1F23F), (0x1F249, 0x1F24F), (0x1F252, 0x1F25F), (0x1F266, 0x1F2FF), (0x1F6D8, 0x1F6DB), (0x1F6ED, 0x1F6EF), (0x1F6FD, 0x1F6FF), (0x1F777, 0x1F77A), (0x1F7DA, 0x1F7DF), (0x1F7EC, 0x1F7EF), (0x1F7F1, 0x1F7FF), (0x1F80C, 0x1F80F), (0x1F848, 0x1F84F), (0x1F85A, 0x1F85F), (0x1F888, 0x1F88F), (0x1F8AE, 0x1F8AF), (0x1F8B2, 0x1F8FF), (0x1FA54, 0x1FA5F), (0x1FA6E, 0x1FA6F), (0x1FA7D, 0x1FA7F), (0x1FA89, 0x1FA8F), (0x1FABE, 0x1FABE), (0x1FAC6, 0x1FACD), (0x1FADC, 0x1FADF), (0x1FAE9, 0x1FAEF), (0x1FAF9, 0x1FAFF), (0x1FB93, 0x1FB93), (0x1FBCB, 0x1FBEF), (0x1FBFA, 0x1FFFD), (0x20001, 0x2A6DE), (0x2A6E0, 0x2A6FF), (0x2A701, 0x2B738), (0x2B73A, 0x2B73F), (0x2B741, 0x2B81C), (0x2B81E, 0x2B81F), (0x2B821, 0x2CEA0), (0x2CEA2, 0x2CEAF), (0x2CEB1, 0x2EBDF), (0x2EBE1, 0x2F7FF), (0x2FA1E, 0x2FFFD), (0x30001, 0x31349), (0x3134B, 0x3134F), (0x31351, 0x323AE), (0x323B0, 0x3FFFD), (0x40000, 0x4FFFD), (0x50000, 0x5FFFD), (0x60000, 0x6FFFD), (0x70000, 0x7FFFD), (0x80000, 0x8FFFD), (0x90000, 0x9FFFD), (0xA0000, 0xAFFFD), (0xB0000, 0xBFFFD), (0xC0000, 0xCFFFD), (0xD0000, 0xDFFFD), (0xE0000, 0xE0000), (0xE0002, 0xE001F), (0xE0080, 0xE00FF), (0xE01F0, 0xEFFFD), ]; /// Non-characters. const NONCHAR_TABLE: &'static [R] = &[ (0x0FDD0, 0x0FDEF), (0x0FFFE, 0x0FFFF), (0x1FFFE, 0x1FFFF), (0x2FFFE, 0x2FFFF), (0x3FFFE, 0x3FFFF), (0x4FFFE, 0x4FFFF), (0x5FFFE, 0x5FFFF), (0x6FFFE, 0x6FFFF), (0x7FFFE, 0x7FFFF), (0x8FFFE, 0x8FFFF), (0x9FFFE, 0x9FFFF), (0xAFFFE, 0xAFFFF), (0xBFFFE, 0xBFFFF), (0xCFFFE, 0xCFFFF), (0xDFFFE, 0xDFFFF), (0xEFFFE, 0xEFFFF), (0xFFFFE, 0xFFFFF), (0x10FFFE, 0x10FFFF), ]; /// Characters that were widened from width 1 to 2 in Unicode 9. const WIDENED_TABLE: &'static [R] = &[ (0x0231A, 0x0231B), (0x023E9, 0x023EC), (0x023F0, 0x023F0), (0x023F3, 0x023F3), (0x025FD, 0x025FE), (0x02614, 0x02615), (0x02648, 0x02653), (0x0267F, 0x0267F), (0x02693, 0x02693), (0x026A1, 0x026A1), (0x026AA, 0x026AB), (0x026BD, 0x026BE), (0x026C4, 0x026C5), (0x026CE, 0x026CE), (0x026D4, 0x026D4), (0x026EA, 0x026EA), (0x026F2, 0x026F3), (0x026F5, 0x026F5), (0x026FA, 0x026FA), (0x026FD, 0x026FD), (0x02705, 0x02705), (0x0270A, 0x0270B), (0x02728, 0x02728), (0x0274C, 0x0274C), (0x0274E, 0x0274E), (0x02753, 0x02755), (0x02757, 0x02757), (0x02795, 0x02797), (0x027B0, 0x027B0), (0x027BF, 0x027BF), (0x02B1B, 0x02B1C), (0x02B50, 0x02B50), (0x02B55, 0x02B55), (0x1F004, 0x1F004), (0x1F0CF, 0x1F0CF), (0x1F18E, 0x1F18E), (0x1F191, 0x1F19A), (0x1F201, 0x1F201), (0x1F21A, 0x1F21A), (0x1F22F, 0x1F22F), (0x1F232, 0x1F236), (0x1F238, 0x1F23A), (0x1F250, 0x1F251), (0x1F300, 0x1F320), (0x1F32D, 0x1F335), (0x1F337, 0x1F37C), (0x1F37E, 0x1F393), (0x1F3A0, 0x1F3CA), (0x1F3CF, 0x1F3D3), (0x1F3E0, 0x1F3F0), (0x1F3F4, 0x1F3F4), (0x1F3F8, 0x1F43E), (0x1F440, 0x1F440), (0x1F442, 0x1F4FC), (0x1F4FF, 0x1F53D), (0x1F54B, 0x1F54E), (0x1F550, 0x1F567), (0x1F595, 0x1F596), (0x1F5FB, 0x1F64F), (0x1F680, 0x1F6C5), (0x1F6CC, 0x1F6CC), (0x1F6D0, 0x1F6D0), (0x1F6EB, 0x1F6EC), (0x1F910, 0x1F918), (0x1F980, 0x1F984), (0x1F9C0, 0x1F9C0), ]; fn in_table(arr: &[R], c: u32) -> bool { arr.binary_search_by(|(start, end)| { if c >= *start && c <= *end { std::cmp::Ordering::Equal } else { start.cmp(&c) } }) .is_ok() } impl WcWidth { /// Return the width of character c pub fn from_char(c: char) -> Self { let c = c as u32; if in_table(&ASCII_TABLE, c) { return Self::One; } if in_table(&PRIVATE_TABLE, c) { return Self::PrivateUse; } if in_table(&NONPRINT_TABLE, c) { return Self::NonPrint; } if in_table(&NONCHAR_TABLE, c) { return Self::NonCharacter; } if in_table(&COMBINING_TABLE, c) { return Self::Combining; } if in_table(&COMBININGLETTERS_TABLE, c) { return Self::Combining; } if in_table(&DOUBLEWIDE_TABLE, c) { return Self::Two; } if in_table(&AMBIGUOUS_TABLE, c) { return Self::Ambiguous; } if in_table(&UNASSIGNED_TABLE, c) { return Self::Unassigned; } if in_table(&WIDENED_TABLE, c) { return Self::WidenedIn9; } Self::One } /// Returns width for applications that are using unicode 8 or earlier #[inline] pub fn width_unicode_8_or_earlier(self) -> u8 { match self { Self::One => 1, Self::Two => 2, Self::NonPrint | Self::Combining | Self::Unassigned | Self::NonCharacter => 0, Self::Ambiguous | Self::PrivateUse => 1, Self::WidenedIn9 => 1, } } /// Returns width for applications that are using unicode 9 or later #[inline] pub fn width_unicode_9_or_later(self) -> u8 { if self == Self::WidenedIn9 { return 2; } self.width_unicode_8_or_earlier() } } /// An alternative interface that precomputes the values for the first 64k /// codepoints and maintains a table that is 64kb in size. /// Lookups are then a simple O(1) index operation that takes ~1.5ns /// constant time for codepoints in that range, falling back to /// the regular WcWidth::from_char for codepoints outside that range /// (which takes 20-75ns depending on the codepoint and which table /// it is resolved to) pub struct WcLookupTable { pub table: [WcWidth; 65536], } impl WcLookupTable { #[allow(unused)] pub fn new() -> Self { let mut table = [WcWidth::One; 65536]; // Populate the table with data from the other tables in // the reverse order to that used to lookup in // WcWidth::from_char so that the precedence is the // same in the event that there are any overlaps. for &(start, end) in WIDENED_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::WidenedIn9; } } for &(start, end) in UNASSIGNED_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Unassigned; } } for &(start, end) in AMBIGUOUS_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Ambiguous; } } for &(start, end) in DOUBLEWIDE_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Two; } } for &(start, end) in COMBININGLETTERS_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Combining; } } for &(start, end) in COMBINING_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::Combining; } } for &(start, end) in NONCHAR_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::NonCharacter; } } for &(start, end) in NONPRINT_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::NonPrint; } } for &(start, end) in PRIVATE_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::PrivateUse; } } /* Implicit, as we initialized to One for &(start, end) in ASCII_TABLE { for i in start..=end.min(0xffff) { table[i as usize] = WcWidth::One; } } */ Self { table } } /// Classify a char as a WcWidth pub fn classify(&self, c: char) -> WcWidth { let c32 = c as u32; if c32 <= 0xffff { return self.table[c32 as usize]; } WcWidth::from_char(c) } } #[cfg(test)] mod test { use super::*; #[test] fn basics() { assert_eq!(WcWidth::from_char('w'), WcWidth::One); assert_eq!(WcWidth::from_char('\x1f'), WcWidth::NonPrint); assert_eq!(WcWidth::from_char('\u{e001}'), WcWidth::PrivateUse); assert_eq!(WcWidth::from_char('\u{2716}'), WcWidth::One); assert_eq!(WcWidth::from_char('\u{270a}'), WcWidth::WidenedIn9); assert_eq!(WcWidth::from_char('\u{3fffd}'), WcWidth::Two); } } termwiz-0.22.0/src/widgets/layout.rs000064400000000000000000000670521046102023000155400ustar 00000000000000//! This module provides some automatic layout functionality for widgets. //! The parameters are similar to those that you may have encountered //! in HTML, but do not fully recreate the layout model. use crate::{format_err, Error, Result}; use cassowary::strength::{REQUIRED, STRONG, WEAK}; use cassowary::WeightedRelation::*; use cassowary::{AddConstraintError, Expression, Solver, SuggestValueError, Variable}; use std::collections::HashMap; use crate::widgets::{Rect, WidgetId}; /// Expands to an Expression holding the value of the variable, /// or if there is no variable, a constant with the specified /// value. /// Equivalent to Option::unwrap_or(). fn unwrap_variable_or(var: Option, value: f64) -> Expression { // The `v + 0.0` portion "converts" the variable to an Expression. var.map(|v| v + 0.0) .unwrap_or_else(|| Expression::from_constant(value)) } /// Specify whether a width or a height has a preferred fixed size /// or whether it should occupy a percentage of its parent container. /// The default is 100% of the parent container. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum DimensionSpec { /// Occupy a fixed number of cells Fixed(u16), /// Occupy a percentage of the space in the parent container Percentage(u8), } impl Default for DimensionSpec { fn default() -> Self { DimensionSpec::Percentage(100) } } /// Specifies the extent of a width or height. The `spec` field /// holds the preferred size, while the `minimum` and `maximum` /// fields set optional lower and upper bounds. #[derive(Clone, Default, Copy, Debug, PartialEq, Eq)] pub struct Dimension { pub spec: DimensionSpec, pub maximum: Option, pub minimum: Option, } /// Specifies whether the children of a widget are laid out /// vertically (top to bottom) or horizontally (left to right). /// The default is horizontal. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum ChildOrientation { Vertical, Horizontal, } impl Default for ChildOrientation { fn default() -> Self { ChildOrientation::Horizontal } } /// Specifies whether the widget should be aligned to the top, /// middle or bottom of the vertical space in its parent. /// The default is Top. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum VerticalAlignment { Top, Middle, Bottom, } impl Default for VerticalAlignment { fn default() -> Self { VerticalAlignment::Top } } /// Specifies whether the widget should be aligned to the left, /// center or right of the horizontal space in its parent. /// The default is Left. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum HorizontalAlignment { Left, Center, Right, } impl Default for HorizontalAlignment { fn default() -> Self { HorizontalAlignment::Left } } /// Specifies the size constraints for a widget #[derive(Clone, Default, Copy, Debug, PartialEq, Eq)] pub struct Constraints { pub width: Dimension, pub height: Dimension, pub valign: VerticalAlignment, pub halign: HorizontalAlignment, pub child_orientation: ChildOrientation, } impl Constraints { pub fn with_fixed_width_height(width: u16, height: u16) -> Self { *Self::default() .set_fixed_width(width) .set_fixed_height(height) } pub fn set_fixed_width(&mut self, width: u16) -> &mut Self { self.width = Dimension { spec: DimensionSpec::Fixed(width), minimum: Some(width), maximum: Some(width), }; self } pub fn set_pct_width(&mut self, width: u8) -> &mut Self { self.width = Dimension { spec: DimensionSpec::Percentage(width), ..Default::default() }; self } pub fn set_fixed_height(&mut self, height: u16) -> &mut Self { self.height = Dimension { spec: DimensionSpec::Fixed(height), minimum: Some(height), maximum: Some(height), }; self } pub fn set_pct_height(&mut self, height: u8) -> &mut Self { self.height = Dimension { spec: DimensionSpec::Percentage(height), ..Default::default() }; self } pub fn set_valign(&mut self, valign: VerticalAlignment) -> &mut Self { self.valign = valign; self } pub fn set_halign(&mut self, halign: HorizontalAlignment) -> &mut Self { self.halign = halign; self } } /// Holds state used to compute the layout of a tree of widgets pub struct LayoutState { solver: Solver, screen_width: Variable, screen_height: Variable, widget_states: HashMap, } /// Each `WidgetId` has a `WidgetState` associated with it. /// This allows us to look up the `Variable` for each of the /// layout features of a widget by `WidgetId` after the solver /// has computed the layout solution. #[derive(Clone)] struct WidgetState { left: Variable, top: Variable, width: Variable, height: Variable, constraints: Constraints, children: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct LaidOutWidget { pub widget: WidgetId, pub rect: Rect, } fn suggesterr(e: SuggestValueError) -> Error { match e { SuggestValueError::UnknownEditVariable => format_err!("Unknown edit variable"), SuggestValueError::InternalSolverError(e) => format_err!("Internal solver error: {}", e), } } fn adderr(e: AddConstraintError) -> Error { format_err!("{:?}", e) } impl Default for LayoutState { fn default() -> Self { Self::new() } } impl LayoutState { /// Create a new `LayoutState` pub fn new() -> Self { let mut solver = Solver::new(); let screen_width = Variable::new(); let screen_height = Variable::new(); solver .add_edit_variable(screen_width, STRONG) .expect("failed to add screen_width to solver"); solver .add_edit_variable(screen_height, STRONG) .expect("failed to add screen_height to solver"); Self { solver, screen_width, screen_height, widget_states: HashMap::new(), } } /// Creates a WidgetState entry for a widget. pub fn add_widget( &mut self, widget: WidgetId, constraints: &Constraints, children: &[WidgetId], ) { let state = WidgetState { left: Variable::new(), top: Variable::new(), width: Variable::new(), height: Variable::new(), constraints: *constraints, children: children.to_vec(), }; self.widget_states.insert(widget, state); } /// Assign the screen dimensions, compute constraints, solve /// the layout and then apply the size and positioning information /// to the widgets in the widget tree. pub fn compute_constraints( &mut self, screen_width: usize, screen_height: usize, root_widget: WidgetId, ) -> Result> { self.solver .suggest_value(self.screen_width, screen_width as f64) .map_err(suggesterr)?; self.solver .suggest_value(self.screen_height, screen_height as f64) .map_err(suggesterr)?; let width = self.screen_width; let height = self.screen_height; self.update_widget_constraint(root_widget, width, height, None, None)?; // The updates are in an unspecified order, and the coordinates are in // the screen absolute coordinate space, rather than the parent-relative // coordinates that we desire. So we need to either to accumulate the // deltas and then sort them such that we walk the widget tree to apply // them, or just walk the tree and apply them all anyway. The latter // feels easier and probably has a low enough cardinality that it won't // feel too expensive. self.solver.fetch_changes(); let mut results = Vec::new(); self.compute_widget_state(root_widget, 0, 0, &mut results)?; Ok(results) } fn compute_widget_state( &self, widget: WidgetId, parent_left: usize, parent_top: usize, results: &mut Vec, ) -> Result<()> { let state = self .widget_states .get(&widget) .ok_or_else(|| format_err!("widget has no solver state"))?; let width = self.solver.get_value(state.width) as usize; let height = self.solver.get_value(state.height) as usize; let left = self.solver.get_value(state.left) as usize; let top = self.solver.get_value(state.top) as usize; results.push(LaidOutWidget { widget, rect: Rect { x: left - parent_left, y: top - parent_top, width, height, }, }); for child in &state.children { self.compute_widget_state(*child, left, top, results)?; } Ok(()) } fn update_widget_constraint( &mut self, widget: WidgetId, parent_width: Variable, parent_height: Variable, parent_left: Option, parent_top: Option, ) -> Result { let state = self .widget_states .get(&widget) .ok_or_else(|| format_err!("widget has no solver state"))? .clone(); let is_root_widget = parent_left.is_none(); let parent_left = unwrap_variable_or(parent_left, 0.0); let parent_top = unwrap_variable_or(parent_top, 0.0); // First, we should fit inside the parent container self.solver .add_constraint( (state.left + state.width) | LE(REQUIRED) | (parent_left.clone() + parent_width), ) .map_err(adderr)?; self.solver .add_constraint(state.left | GE(REQUIRED) | parent_left) .map_err(adderr)?; self.solver .add_constraint( (state.top + state.height) | LE(REQUIRED) | (parent_top.clone() + parent_height), ) .map_err(adderr)?; self.solver .add_constraint(state.top | GE(REQUIRED) | parent_top) .map_err(adderr)?; if is_root_widget { // We handle alignment on the root widget specially here; // for non-root widgets, we handle it when assessing children match state.constraints.halign { HorizontalAlignment::Left => self .solver .add_constraint(state.left | EQ(STRONG) | 0.0) .map_err(adderr)?, HorizontalAlignment::Right => self .solver .add_constraint(state.left | EQ(STRONG) | (parent_width - state.width)) .map_err(adderr)?, HorizontalAlignment::Center => self .solver .add_constraint(state.left | EQ(STRONG) | ((parent_width - state.width) / 2.0)) .map_err(adderr)?, } match state.constraints.valign { VerticalAlignment::Top => self .solver .add_constraint(state.top | EQ(STRONG) | 0.0) .map_err(adderr)?, VerticalAlignment::Bottom => self .solver .add_constraint(state.top | EQ(STRONG) | (parent_height - state.height)) .map_err(adderr)?, VerticalAlignment::Middle => self .solver .add_constraint(state.top | EQ(STRONG) | ((parent_height - state.height) / 2.0)) .map_err(adderr)?, } } match state.constraints.width.spec { DimensionSpec::Fixed(width) => { self.solver .add_constraint(state.width | EQ(STRONG) | f64::from(width)) .map_err(adderr)?; } DimensionSpec::Percentage(pct) => { self.solver .add_constraint( state.width | EQ(STRONG) | (f64::from(pct) * parent_width / 100.0), ) .map_err(adderr)?; } } self.solver .add_constraint( state.width | GE(STRONG) | f64::from(state.constraints.width.minimum.unwrap_or(1).max(1)), ) .map_err(adderr)?; if let Some(max_width) = state.constraints.width.maximum { self.solver .add_constraint(state.width | LE(STRONG) | f64::from(max_width)) .map_err(adderr)?; } match state.constraints.height.spec { DimensionSpec::Fixed(height) => { self.solver .add_constraint(state.height | EQ(STRONG) | f64::from(height)) .map_err(adderr)?; } DimensionSpec::Percentage(pct) => { self.solver .add_constraint( state.height | EQ(STRONG) | (f64::from(pct) * parent_height / 100.0), ) .map_err(adderr)?; } } self.solver .add_constraint( state.height | GE(STRONG) | f64::from(state.constraints.height.minimum.unwrap_or(1).max(1)), ) .map_err(adderr)?; if let Some(max_height) = state.constraints.height.maximum { self.solver .add_constraint(state.height | LE(STRONG) | f64::from(max_height)) .map_err(adderr)?; } let has_children = !state.children.is_empty(); if has_children { let mut left_edge: Expression = state.left + 0.0; let mut top_edge: Expression = state.top + 0.0; let mut width_constraint = Expression::from_constant(0.0); let mut height_constraint = Expression::from_constant(0.0); for child in &state.children { let child_state = self.update_widget_constraint( *child, state.width, state.height, Some(state.left), Some(state.top), )?; match child_state.constraints.halign { HorizontalAlignment::Left => self .solver .add_constraint(child_state.left | EQ(STRONG) | left_edge.clone()) .map_err(adderr)?, HorizontalAlignment::Right => self .solver .add_constraint( (child_state.left + child_state.width) | EQ(STRONG) | (state.left + state.width), ) .map_err(adderr)?, HorizontalAlignment::Center => self .solver .add_constraint( child_state.left | EQ(STRONG) | (state.left + (state.width - child_state.width) / 2.0), ) .map_err(adderr)?, } match child_state.constraints.valign { VerticalAlignment::Top => self .solver .add_constraint(child_state.top | EQ(STRONG) | top_edge.clone()) .map_err(adderr)?, VerticalAlignment::Bottom => self .solver .add_constraint( (child_state.top + child_state.height) | EQ(STRONG) | (state.top + state.height), ) .map_err(adderr)?, VerticalAlignment::Middle => self .solver .add_constraint( child_state.top | EQ(STRONG) | (state.top + (state.height - child_state.height) / 2.0), ) .map_err(adderr)?, } match state.constraints.child_orientation { ChildOrientation::Horizontal => { left_edge = child_state.left + child_state.width; width_constraint = width_constraint + child_state.width; } ChildOrientation::Vertical => { top_edge = child_state.top + child_state.height; height_constraint = height_constraint + child_state.height; } } } // This constraint encourages the contents to fill out to the width // of the container, rather than clumping left self.solver .add_constraint(left_edge | EQ(STRONG) | (state.left + state.width)) .map_err(adderr)?; self.solver .add_constraint(state.width | GE(WEAK) | width_constraint) .map_err(adderr)?; // This constraint encourages the contents to fill out to the height // of the container, rather than clumping top self.solver .add_constraint(top_edge | EQ(STRONG) | (state.top + state.height)) .map_err(adderr)?; self.solver .add_constraint(state.height | GE(WEAK) | height_constraint) .map_err(adderr)?; } Ok(state) } } #[cfg(test)] mod test { use super::*; #[test] fn single_widget_unspec() { let mut layout = LayoutState::new(); let main_id = WidgetId::new(); layout.add_widget(main_id, &Constraints::default(), &[]); let results = layout.compute_constraints(40, 12, main_id).unwrap(); assert_eq!( results, vec![LaidOutWidget { widget: main_id, rect: Rect { x: 0, y: 0, width: 40, height: 12, }, }] ); } #[test] fn two_children_pct() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b]); layout.add_widget(a, Constraints::default().set_pct_width(50), &[]); layout.add_widget(b, Constraints::default().set_pct_width(50), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 50, height: 100, }, }, LaidOutWidget { widget: b, rect: Rect { x: 50, y: 0, width: 50, height: 100, }, }, ] ); } #[test] fn three_children_pct() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let c = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b, c]); layout.add_widget(a, Constraints::default().set_pct_width(20), &[]); layout.add_widget(b, Constraints::default().set_pct_width(20), &[]); layout.add_widget(c, Constraints::default().set_pct_width(20), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 20, height: 100, }, }, LaidOutWidget { widget: b, rect: Rect { x: 20, y: 0, width: 20, height: 100, }, }, LaidOutWidget { widget: c, rect: Rect { x: 40, y: 0, width: 20, height: 100, }, }, ] ); } #[test] fn two_children_a_b() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b]); layout.add_widget(a, &Constraints::with_fixed_width_height(5, 2), &[]); layout.add_widget(b, &Constraints::with_fixed_width_height(3, 2), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 5, height: 2, }, }, LaidOutWidget { widget: b, rect: Rect { x: 5, y: 0, width: 3, height: 2, }, }, ] ); } #[test] fn two_children_b_a() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[b, a]); layout.add_widget(a, &Constraints::with_fixed_width_height(5, 2), &[]); layout.add_widget(b, &Constraints::with_fixed_width_height(3, 2), &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 100, height: 100, }, }, LaidOutWidget { widget: b, rect: Rect { x: 0, y: 0, width: 3, height: 2, }, }, LaidOutWidget { widget: a, rect: Rect { x: 3, y: 0, width: 5, height: 2, }, }, ] ); } #[test] fn two_children_overflow() { let root = WidgetId::new(); let a = WidgetId::new(); let b = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &Constraints::default(), &[a, b]); layout.add_widget(a, &Constraints::with_fixed_width_height(5, 2), &[]); layout.add_widget(b, &Constraints::with_fixed_width_height(3, 2), &[]); let results = layout.compute_constraints(6, 2, root).unwrap(); assert_eq!( results, vec![ LaidOutWidget { widget: root, rect: Rect { x: 0, y: 0, width: 8, height: 2, }, }, LaidOutWidget { widget: a, rect: Rect { x: 0, y: 0, width: 5, height: 2, }, }, LaidOutWidget { widget: b, rect: Rect { x: 5, y: 0, width: 3, height: 2, }, }, ] ); } macro_rules! single_constrain { ($name:ident, $constraint:expr, $width:expr, $height:expr, $x:expr, $y:expr) => { #[test] fn $name() { let root = WidgetId::new(); let mut layout = LayoutState::new(); layout.add_widget(root, &$constraint, &[]); let results = layout.compute_constraints(100, 100, root).unwrap(); assert_eq!( results, vec![LaidOutWidget { widget: root, rect: Rect { x: $x, y: $y, width: $width, height: $height, }, }] ); } }; } single_constrain!( single_constrained_widget_top, Constraints::with_fixed_width_height(10, 2), 10, 2, 0, 0 ); single_constrain!( single_constrained_widget_bottom, Constraints::with_fixed_width_height(10, 2) .set_valign(VerticalAlignment::Bottom) .clone(), 10, 2, 0, 98 ); single_constrain!( single_constrained_widget_middle, Constraints::with_fixed_width_height(10, 2) .set_valign(VerticalAlignment::Middle) .clone(), 10, 2, 0, 49 ); single_constrain!( single_constrained_widget_right, Constraints::with_fixed_width_height(10, 2) .set_halign(HorizontalAlignment::Right) .clone(), 10, 2, 90, 0 ); single_constrain!( single_constrained_widget_bottom_center, Constraints::with_fixed_width_height(10, 2) .set_valign(VerticalAlignment::Bottom) .set_halign(HorizontalAlignment::Center) .clone(), 10, 2, 45, 98 ); } termwiz-0.22.0/src/widgets/mod.rs000064400000000000000000000424031046102023000147730ustar 00000000000000// Ideally this would be scoped to WidgetId, but I can't seem to find the // right place for it to take effect #![allow(clippy::new_without_default)] use crate::color::ColorAttribute; use crate::input::InputEvent; use crate::surface::{Change, CursorShape, CursorVisibility, Position, SequenceNo, Surface}; use crate::Result; use fnv::FnvHasher; use std::collections::{HashMap, VecDeque}; use std::hash::BuildHasherDefault; /// fnv is a more appropriate hasher for the WidgetIds we use in this module. type FnvHashMap = HashMap>; pub mod layout; /// Describes an event that may need to be processed by the widget pub enum WidgetEvent { Input(InputEvent), } #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct CursorShapeAndPosition { pub shape: CursorShape, pub coords: ParentRelativeCoords, pub color: ColorAttribute, pub visibility: CursorVisibility, } #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct Rect { pub x: usize, pub y: usize, pub width: usize, pub height: usize, } pub struct RenderArgs<'a> { /// The id of the current widget pub id: WidgetId, pub is_focused: bool, pub cursor: &'a mut CursorShapeAndPosition, pub surface: &'a mut Surface, } /// UpdateArgs provides access to the widget and UI state during /// a call to `Widget::update_state` pub struct UpdateArgs<'a> { /// The id of the current widget pub id: WidgetId, pub cursor: &'a mut CursorShapeAndPosition, } /// Implementing the `Widget` trait allows for defining a potentially /// interactive component in a UI layout. pub trait Widget { /// Draw the widget to the RenderArgs::surface, and optionally /// update RenderArgs::cursor to reflect the cursor position and /// display attributes. fn render(&mut self, args: &mut RenderArgs); /// Override this to have your widget specify its layout constraints. /// You may wish to have your widget constructor receive a `Constraints` /// instance to make this more easily configurable in more generic widgets. fn get_size_constraints(&self) -> layout::Constraints { Default::default() } /// Override this to allow your widget to respond to keyboard, mouse and /// other widget events. /// Return `true` if your widget handled the event, or `false` to allow /// the event to propagate to the widget parent. fn process_event(&mut self, _event: &WidgetEvent, _args: &mut UpdateArgs) -> bool { false } } /// Relative to the top left of the parent container #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct ParentRelativeCoords { pub x: usize, pub y: usize, } impl ParentRelativeCoords { pub fn new(x: usize, y: usize) -> Self { Self { x, y } } } impl From<(usize, usize)> for ParentRelativeCoords { fn from(coords: (usize, usize)) -> ParentRelativeCoords { ParentRelativeCoords::new(coords.0, coords.1) } } /// Relative to the top left of the screen #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct ScreenRelativeCoords { pub x: usize, pub y: usize, } impl ScreenRelativeCoords { pub fn new(x: usize, y: usize) -> Self { Self { x, y } } pub fn offset_by(&self, rel: &ParentRelativeCoords) -> Self { Self { x: self.x + rel.x, y: self.y + rel.y, } } } static WIDGET_ID: ::std::sync::atomic::AtomicUsize = ::std::sync::atomic::AtomicUsize::new(0); /// The `WidgetId` uniquely describes an instance of a widget. /// Creating a new `WidgetId` generates a new unique identifier which can /// be safely copied and moved around; each copy refers to the same widget. /// The intent is that you set up the identifiers once and re-use them, /// rather than generating new ids on each iteration of the UI loop so that /// the widget state is maintained correctly by the Ui. #[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct WidgetId(usize); impl WidgetId { pub fn new() -> Self { WidgetId(WIDGET_ID.fetch_add(1, ::std::sync::atomic::Ordering::Relaxed)) } } impl Default for WidgetId { fn default() -> Self { Self::new() } } struct RenderData<'widget> { surface: Surface, cursor: CursorShapeAndPosition, coordinates: ParentRelativeCoords, widget: Box, } #[derive(Default)] struct Graph { root: Option, children: FnvHashMap>, parent: FnvHashMap, } impl Graph { fn add(&mut self, parent: Option) -> WidgetId { let id = WidgetId::new(); if self.root.is_none() { self.root = Some(id); } self.children.insert(id, Vec::new()); if let Some(parent) = parent { self.parent.insert(id, parent); self.children.get_mut(&parent).unwrap().push(id); } id } fn children(&self, id: WidgetId) -> &[WidgetId] { self.children .get(&id) .map(|v| v.as_slice()) .unwrap_or_else(|| &[]) } } /// Manages the widgets on the display #[derive(Default)] pub struct Ui<'widget> { graph: Graph, render: FnvHashMap>, input_queue: VecDeque, focused: Option, } impl<'widget> Ui<'widget> { pub fn new() -> Self { Default::default() } pub fn add(&mut self, parent: Option, w: W) -> WidgetId { let id = self.graph.add(parent); self.render.insert( id, RenderData { surface: Surface::new(1, 1), cursor: Default::default(), coordinates: Default::default(), widget: Box::new(w), }, ); if parent.is_none() && self.focused.is_none() { self.focused = Some(id); } id } pub fn set_root(&mut self, w: W) -> WidgetId { self.add(None, w) } pub fn add_child(&mut self, parent: WidgetId, w: W) -> WidgetId { self.add(Some(parent), w) } fn do_deliver(&mut self, id: WidgetId, event: &WidgetEvent) -> bool { let render_data = self.render.get_mut(&id).unwrap(); let mut args = UpdateArgs { id, cursor: &mut render_data.cursor, }; render_data.widget.process_event(event, &mut args) } fn deliver_event(&mut self, mut id: WidgetId, event: &WidgetEvent) { loop { let handled = match event { WidgetEvent::Input(InputEvent::Resized { .. }) => true, WidgetEvent::Input(InputEvent::Mouse(m)) => { let mut m = m.clone(); // convert from screen to widget coords let coords = self.to_widget_coords( id, &ScreenRelativeCoords::new(m.x as usize, m.y as usize), ); m.x = coords.x as u16; m.y = coords.y as u16; self.do_deliver(id, &WidgetEvent::Input(InputEvent::Mouse(m))) } WidgetEvent::Input(InputEvent::Paste(_)) | WidgetEvent::Input(InputEvent::PixelMouse(_)) | WidgetEvent::Input(InputEvent::Key(_)) | WidgetEvent::Input(InputEvent::Wake) => self.do_deliver(id, event), }; if handled { return; } id = match self.graph.parent.get(&id) { Some(parent) => *parent, None => return, }; } } /// find the best matching widget that is under the mouse cursor. /// We're looking for the latest, deepest widget that contains the input /// coordinates. fn hovered_widget(&self, coords: &ScreenRelativeCoords) -> Option { let root = match self.graph.root { Some(id) => id, _ => return None, }; let depth = 0; let mut best = (depth, root); self.hovered_recursive(root, depth, coords.x, coords.y, &mut best); Some(best.1) } /// Recursive helper for hovered_widget(). The `best` tuple holds the /// best (depth, widget) pair. Depth is incremented each time the function /// recurses. fn hovered_recursive( &self, widget: WidgetId, depth: usize, x: usize, y: usize, best: &mut (usize, WidgetId), ) { let render = &self.render[&widget]; // only consider the dimensions if this node is at the same or a deeper // depth. If so, then we check to see if the coords are within the bounds. if depth >= best.0 && x >= render.coordinates.x && y >= render.coordinates.y { let (width, height) = render.surface.dimensions(); if (x - render.coordinates.x < width) && (y - render.coordinates.y < height) { *best = (depth, widget); } } for child in self.graph.children(widget) { self.hovered_recursive( *child, depth + 1, x + render.coordinates.x, y + render.coordinates.y, best, ); } } pub fn process_event_queue(&mut self) -> Result<()> { while let Some(event) = self.input_queue.pop_front() { match event { WidgetEvent::Input(InputEvent::Resized { rows, cols }) => { self.compute_layout(cols, rows)?; } WidgetEvent::Input(InputEvent::Mouse(ref m)) => { if let Some(hover) = self.hovered_widget(&ScreenRelativeCoords::new(m.x as usize, m.y as usize)) { self.deliver_event(hover, &event); } } WidgetEvent::Input(InputEvent::Key(_)) | WidgetEvent::Input(InputEvent::Paste(_)) | WidgetEvent::Input(InputEvent::PixelMouse(_)) | WidgetEvent::Input(InputEvent::Wake) => { if let Some(focus) = self.focused { self.deliver_event(focus, &event); } } } } Ok(()) } /// Queue up an event. Events are processed by the appropriate /// `Widget::update_state` method. Events may be re-processed to /// simplify handling for widgets. eg: a TODO: is to synthesize double /// and triple click events. pub fn queue_event(&mut self, event: WidgetEvent) { self.input_queue.push_back(event); } /// Assign keyboard focus to the specified widget. pub fn set_focus(&mut self, id: WidgetId) { self.focused = Some(id); } /// Helper for applying the surfaces from the widgets to the target /// screen in the correct order (from the root to the leaves) fn render_recursive( &mut self, id: WidgetId, screen: &mut Surface, abs_coords: &ScreenRelativeCoords, ) -> Result<()> { let coords = { let render_data = self.render.get_mut(&id).unwrap(); let surface = &mut render_data.surface; { let mut args = RenderArgs { id, cursor: &mut render_data.cursor, surface, is_focused: self.focused.map(|f| f == id).unwrap_or(false), }; render_data.widget.render(&mut args); } screen.draw_from_screen( surface, abs_coords.x + render_data.coordinates.x, abs_coords.y + render_data.coordinates.y, ); surface.flush_changes_older_than(SequenceNo::max_value()); render_data.coordinates }; for child in self.graph.children(id).to_vec() { self.render_recursive( child, screen, &ScreenRelativeCoords::new(coords.x + abs_coords.x, coords.y + abs_coords.y), )?; } Ok(()) } /// Reconsider the layout constraints and apply them. /// Returns true if the layout was changed, false if no changes were made. fn compute_layout(&mut self, width: usize, height: usize) -> Result { let mut layout = layout::LayoutState::new(); let root = self.graph.root.unwrap(); self.add_widget_to_layout(&mut layout, root)?; let mut changed = false; // Clippy is dead wrong about this iterator being an identity_conversion #[cfg_attr(feature = "cargo-clippy", allow(clippy::identity_conversion))] for result in layout.compute_constraints(width, height, root)? { let render_data = self.render.get_mut(&result.widget).unwrap(); let coords = ParentRelativeCoords::new(result.rect.x, result.rect.y); if coords != render_data.coordinates { render_data.coordinates = coords; changed = true; } if (result.rect.width, result.rect.height) != render_data.surface.dimensions() { render_data .surface .resize(result.rect.width, result.rect.height); changed = true; } } Ok(changed) } /// Recursive helper for building up the LayoutState fn add_widget_to_layout( &mut self, layout: &mut layout::LayoutState, widget: WidgetId, ) -> Result<()> { let constraints = self.render[&widget].widget.get_size_constraints(); let children = self.graph.children(widget).to_vec(); layout.add_widget(widget, &constraints, &children); for child in children { self.add_widget_to_layout(layout, child)?; } Ok(()) } /// Apply the current state of the widgets to the screen. /// This has the side effect of clearing out any unconsumed input queue. /// Returns true if the Ui may need to be updated again; for example, /// if the most recent update operation changed layout. pub fn render_to_screen(&mut self, screen: &mut Surface) -> Result { if let Some(root) = self.graph.root { let (width, height) = screen.dimensions(); // Render from scratch into a fresh screen buffer let mut alt_screen = Surface::new(width, height); self.render_recursive(root, &mut alt_screen, &ScreenRelativeCoords::new(0, 0))?; // Now compute a delta and apply it to the actual screen let diff = screen.diff_screens(&alt_screen); screen.add_changes(diff); } // TODO: garbage collect unreachable WidgetId's from self.state if let Some(id) = self.focused { let cursor = &self.render[&id].cursor; let coords = self.to_screen_coords(id, &cursor.coords); screen.add_changes(vec![ Change::CursorShape(cursor.shape), Change::CursorColor(cursor.color), Change::CursorVisibility(cursor.visibility), Change::CursorPosition { x: Position::Absolute(coords.x), y: Position::Absolute(coords.y), }, ]); } let (width, height) = screen.dimensions(); self.compute_layout(width, height) } fn coord_walk usize>( &self, widget: WidgetId, mut x: usize, mut y: usize, f: F, ) -> (usize, usize) { let mut widget = widget; loop { let render = &self.render[&widget]; x = f(x, render.coordinates.x); y = f(y, render.coordinates.y); widget = match self.graph.parent.get(&widget) { Some(parent) => *parent, None => break, }; } (x, y) } /// Convert coordinates that are relative to widget into coordinates /// that are relative to the screen origin (top left). pub fn to_screen_coords( &self, widget: WidgetId, coords: &ParentRelativeCoords, ) -> ScreenRelativeCoords { let (x, y) = self.coord_walk(widget, coords.x, coords.y, |a, b| a + b); ScreenRelativeCoords { x, y } } /// Convert coordinates that are relative to the screen origin (top left) /// into coordinates that are relative to the widget. pub fn to_widget_coords( &self, widget: WidgetId, coords: &ScreenRelativeCoords, ) -> ParentRelativeCoords { let (x, y) = self.coord_walk(widget, coords.x, coords.y, |a, b| a - b); ParentRelativeCoords { x, y } } } #[cfg(test)] mod test { use super::*; struct CursorHider {} impl Widget for CursorHider { fn render(&mut self, args: &mut RenderArgs) { args.cursor.visibility = CursorVisibility::Hidden; } } #[test] fn hide_cursor() { let mut ui = Ui::new(); ui.set_root(CursorHider {}); let mut surface = Surface::new(10, 10); assert_eq!(CursorVisibility::Visible, surface.cursor_visibility()); ui.render_to_screen(&mut surface).unwrap(); assert_eq!(CursorVisibility::Hidden, surface.cursor_visibility()); } }