diff --git a/components/collator/src/elements.rs b/components/collator/src/elements.rs index 7a18e286eec..019fe30b670 100644 --- a/components/collator/src/elements.rs +++ b/components/collator/src/elements.rs @@ -23,11 +23,10 @@ use icu_collections::char16trie::TrieResult; use icu_collections::codepointtrie::CodePointTrie; use icu_normalizer::provider::DecompositionDataV1; use icu_normalizer::provider::DecompositionTablesV1; -use icu_normalizer::u24::EMPTY_U24; -use icu_normalizer::u24::U24; use icu_properties::CanonicalCombiningClass; use smallvec::SmallVec; use zerovec::ule::AsULE; +use zerovec::ule::CharULE; use zerovec::ule::RawBytesULE; use zerovec::ZeroSlice; @@ -151,12 +150,14 @@ pub(crate) const FFFD_CE32: CollationElement32 = CollationElement32(FFFD_CE32_VA pub(crate) const EMPTY_U16: &ZeroSlice = ZeroSlice::::from_ule_slice(&::ULE::from_array([])); -const SINGLE_U16: &ZeroSlice = +const SINGLE_REPLACEMENT_CHARACTER_U16: &ZeroSlice = ZeroSlice::::from_ule_slice(&::ULE::from_array([0xFFFD])); -const SINGLE_U24_ARR: [u8; 3] = [0xFD, 0xFF, 00]; -const SINGLE_U24_SLICE: &[U24] = &[U24(SINGLE_U24_ARR)]; -const SINGLE_U24: &ZeroSlice = unsafe { core::mem::transmute(SINGLE_U24_SLICE) }; +pub(crate) const EMPTY_CHAR: &ZeroSlice = ZeroSlice::new_empty(); + +const SINGLE_REPLACEMENT_CHARACTER_CHAR: &ZeroSlice = ZeroSlice::from_ule_slice(&[unsafe { + core::mem::transmute::<[u8; 3], CharULE>([0xFDu8, 0xFFu8, 0u8]) +}]); /// If `opt` is `Some`, unwrap it. If `None`, panic if debug assertions /// are enabled and return `default` if debug assertions are not enabled. @@ -186,12 +187,6 @@ fn char_from_u16(u: u16) -> char { char_from_u32(u32::from(u)) } -/// Convert a `U24` _obtained from data provider data_ to `char`. -#[inline(always)] -fn char_from_u24(u: U24) -> char { - char_from_u32(u.into()) -} - #[inline(always)] fn in_inclusive_range(c: char, start: char, end: char) -> bool { u32::from(c).wrapping_sub(u32::from(start)) <= (u32::from(end) - u32::from(start)) @@ -805,7 +800,7 @@ where /// NFD complex decompositions on the BMP scalars16: &'data ZeroSlice, /// NFD complex decompositions on supplementary planes - scalars32: &'data ZeroSlice, + scalars32: &'data ZeroSlice, /// If numeric mode is enabled, the 8 high bits of the numeric primary. /// `None` if disabled. numeric_primary: Option, @@ -1101,7 +1096,7 @@ where let len = usize::from(trail_or_complex >> 13) + 2; for u in unwrap_or_gigo( self.scalars16.get_subslice(offset..offset + len), - SINGLE_U16, // single instead of empty for consistency with the other code path + SINGLE_REPLACEMENT_CHARACTER_U16, // single instead of empty for consistency with the other code path ) .iter() { @@ -1113,13 +1108,12 @@ where } else { let len = usize::from(trail_or_complex >> 13) + 1; let offset32 = offset - self.scalars16.len(); - for u in unwrap_or_gigo( + for ch in unwrap_or_gigo( self.scalars32.get_subslice(offset32..offset32 + len), - SINGLE_U24, // single instead of empty for consistency with the other code path + SINGLE_REPLACEMENT_CHARACTER_CHAR, // single instead of empty for consistency with the other code path ) .iter() { - let ch = char_from_u24(u); let trie_value = self.trie.get(u32::from(ch)); self.upcoming .push(CharacterAndClassAndTrieValue::new_with_non_special_decomposition_trie_val(ch, trie_value)); @@ -1499,28 +1493,22 @@ where .scalars32 .get_subslice(offset32..offset32 + len) .and_then(|slice| slice.split_first()) - .map_or_else( - || { - // GIGO case - debug_assert!(false); - (REPLACEMENT_CHARACTER, EMPTY_U24) - }, - |(first, tail)| (char_from_u24(first), tail), - ); + .unwrap_or_else(|| { + // GIGO case + debug_assert!(false); + (REPLACEMENT_CHARACTER, EMPTY_CHAR) + }); c = starter; if trail_or_complex & 0x1000 != 0 { - for u in tail.iter() { - let char_from_u = char_from_u24(u); - let trie_value = self.trie.get(u32::from(char_from_u)); + for ch in tail.iter() { + let trie_value = self.trie.get(u32::from(ch)); let ccc = ccc_from_trie_value(trie_value); - combining_characters - .push(CharacterAndClass::new(char_from_u, ccc)); + combining_characters.push(CharacterAndClass::new(ch, ccc)); } } else { let mut it = tail.iter(); - while let Some(u) = it.next() { - let ch = char_from_u24(u); + while let Some(ch) = it.next() { let ccc = ccc_from_trie_value(self.trie.get(u32::from(ch))); if ccc != CanonicalCombiningClass::NotReordered { // As of Unicode 14, this branch is never taken. @@ -1535,8 +1523,7 @@ where // sort the right characters. self.maybe_gather_combining(); - while let Some(u) = it.next_back() { - let tail_char = char_from_u24(u); + while let Some(tail_char) = it.next_back() { let trie_value = self.trie.get(u32::from(tail_char)); self.prepend_and_sort_non_starter_prefix_of_suffix(CharacterAndClassAndTrieValue::new_with_non_special_decomposition_trie_val(tail_char, trie_value)); } diff --git a/components/normalizer/src/lib.rs b/components/normalizer/src/lib.rs index 4839f9ad5e9..94d45b1a3d9 100644 --- a/components/normalizer/src/lib.rs +++ b/components/normalizer/src/lib.rs @@ -70,7 +70,6 @@ extern crate alloc; pub mod error; pub mod properties; pub mod provider; -pub mod u24; use crate::error::NormalizerError; use crate::provider::CanonicalDecompositionDataV1Marker; @@ -94,8 +93,6 @@ use provider::CompatibilityDecompositionTablesV1Marker; use provider::DecompositionSupplementV1; use provider::DecompositionTablesV1; use smallvec::SmallVec; -use u24::EMPTY_U24; -use u24::U24; use utf16_iter::Utf16CharsEx; use utf8_iter::Utf8CharsEx; use write16::Write16; @@ -242,15 +239,11 @@ fn char_from_u16(u: u16) -> char { char_from_u32(u32::from(u)) } -/// Convert a `U24` _obtained from data provider data_ to `char`. -#[inline(always)] -fn char_from_u24(u: U24) -> char { - char_from_u32(u.into()) -} - const EMPTY_U16: &ZeroSlice = ZeroSlice::::from_ule_slice(&::ULE::from_array([])); +const EMPTY_CHAR: &ZeroSlice = ZeroSlice::new_empty(); + #[inline(always)] fn in_inclusive_range(c: char, start: char, end: char) -> bool { u32::from(c).wrapping_sub(u32::from(start)) <= (u32::from(end) - u32::from(start)) @@ -517,9 +510,9 @@ where trie: &'data CodePointTrie<'data, u32>, supplementary_trie: Option<&'data CodePointTrie<'data, u32>>, scalars16: &'data ZeroSlice, - scalars24: &'data ZeroSlice, + scalars24: &'data ZeroSlice, supplementary_scalars16: &'data ZeroSlice, - supplementary_scalars24: &'data ZeroSlice, + supplementary_scalars24: &'data ZeroSlice, half_width_voicing_marks_become_non_starters: bool, /// The lowest character for which either of the following does /// not hold: @@ -589,7 +582,7 @@ where supplementary_scalars24: if let Some(supplementary) = supplementary_tables { &supplementary.scalars24 } else { - EMPTY_U24 + EMPTY_CHAR }, half_width_voicing_marks_become_non_starters, decomposition_passthrough_bound: u32::from(decomposition_passthrough_bound), @@ -647,32 +640,28 @@ where &mut self, low: u16, offset: usize, - slice32: &ZeroSlice, + slice32: &ZeroSlice, ) -> (char, usize) { let len = usize::from(low >> 13) + 1; let (starter, tail) = slice32 .get_subslice(offset..offset + len) .and_then(|slice| slice.split_first()) - .map_or_else( - || { - // GIGO case - debug_assert!(false); - (REPLACEMENT_CHARACTER, EMPTY_U24) - }, - |(first, trail)| (char_from_u24(first), trail), - ); + .unwrap_or_else(|| { + // GIGO case + debug_assert!(false); + (REPLACEMENT_CHARACTER, EMPTY_CHAR) + }); if low & 0x1000 != 0 { // All the rest are combining - for u in tail.iter() { + for ch in tail.iter() { self.buffer - .push(CharacterAndClass::new_with_placeholder(char_from_u24(u))); + .push(CharacterAndClass::new_with_placeholder(ch)); } (starter, 0) } else { let mut i = 0; let mut combining_start = 0; - for u in tail.iter() { - let ch = char_from_u24(u); + for ch in tail.iter() { let trie_value = self.trie.get(u32::from(ch)); self.buffer.push(CharacterAndClass::new_with_trie_value( CharacterAndTrieValue::new(ch, trie_value), diff --git a/components/normalizer/src/properties.rs b/components/normalizer/src/properties.rs index ba70d43a679..9b1b9165872 100644 --- a/components/normalizer/src/properties.rs +++ b/components/normalizer/src/properties.rs @@ -12,7 +12,6 @@ //! glyph-availability-guided custom normalizer. use crate::char_from_u16; -use crate::char_from_u24; use crate::error::NormalizerError; use crate::in_inclusive_range; use crate::provider::CanonicalCompositionsV1Marker; @@ -269,13 +268,11 @@ impl CanonicalDecomposition { break; } let offset24 = offset - tables.scalars16.len(); - if let Some(first) = tables.scalars24.get(offset24) { - let first_c = char_from_u24(first); + if let Some(first_c) = tables.scalars24.get(offset24) { if len == 1 { return Decomposed::Singleton(first_c); } - if let Some(second) = tables.scalars24.get(offset24 + 1) { - let second_c = char_from_u24(second); + if let Some(second_c) = tables.scalars24.get(offset24 + 1) { return Decomposed::Expansion(first_c, second_c); } } @@ -305,7 +302,7 @@ impl CanonicalDecomposition { let offset = usize::from(trail_or_complex - 1); if let Some(first) = non_recursive.scalars24.get(offset) { if let Some(second) = non_recursive.scalars24.get(offset + 1) { - return Decomposed::Expansion(char_from_u24(first), char_from_u24(second)); + return Decomposed::Expansion(first, second); } } // GIGO case diff --git a/components/normalizer/src/provider.rs b/components/normalizer/src/provider.rs index 8f775217a98..6fdc366b517 100644 --- a/components/normalizer/src/provider.rs +++ b/components/normalizer/src/provider.rs @@ -15,8 +15,6 @@ use zerovec::ZeroVec; #[cfg(feature = "serde")] use serde; -use crate::u24::U24; - /// Main data for NFD #[icu_provider::data_struct(CanonicalDecompositionDataV1Marker = "normalizer/nfd@1")] #[derive(Debug, PartialEq, Clone)] @@ -87,7 +85,7 @@ pub struct DecompositionTablesV1<'data> { /// Decompositions with at least one character outside /// the BMP #[cfg_attr(feature = "serde", serde(borrow))] - pub scalars24: ZeroVec<'data, U24>, + pub scalars24: ZeroVec<'data, char>, } /// Non-Hangul canonical compositions @@ -116,5 +114,5 @@ pub struct NonRecursiveDecompositionSupplementV1<'data> { /// Decompositions with at least one character outside /// the BMP #[cfg_attr(feature = "serde", serde(borrow))] - pub scalars24: ZeroVec<'data, U24>, + pub scalars24: ZeroVec<'data, char>, } diff --git a/components/normalizer/src/u24.rs b/components/normalizer/src/u24.rs deleted file mode 100644 index b4c2a7a03e2..00000000000 --- a/components/normalizer/src/u24.rs +++ /dev/null @@ -1,101 +0,0 @@ -// This file is part of ICU4X. For terms of use, please see the file -// called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). - -//! Little-endian unaligned 24-bit unsigned integer. - -use core::convert::TryFrom; -use zerovec::{ - ule::{AsULE, ULE}, - ZeroSlice, ZeroVecError, -}; - -/// Little-endian unaligned 24-bit unsigned integer. -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr( - feature = "datagen", - derive(serde::Serialize, databake::Bake), - databake(path = icu_normalizer::u24), -)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] -#[allow(clippy::exhaustive_structs)] // newtype -pub struct U24(pub [u8; 3]); - -impl U24 { - fn to_u32(self) -> u32 { - u32::from(self.0[0]) | (u32::from(self.0[1]) << 8) | (u32::from(self.0[2]) << 16) - } -} - -impl AsULE for U24 { - type ULE = U24; - - fn to_unaligned(self) -> Self::ULE { - self - } - - fn from_unaligned(unaligned: Self::ULE) -> Self { - unaligned - } -} - -unsafe impl ULE for U24 { - fn validate_byte_slice(bytes: &[u8]) -> Result<(), ZeroVecError> { - if bytes.len() % 3 == 0 { - Ok(()) - } else { - Err(ZeroVecError::length::(bytes.len())) - } - } -} - -impl From for u32 { - fn from(u: U24) -> Self { - u.to_u32() - } -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -#[non_exhaustive] -/// Error -pub enum U24Error { - /// Value is out of range of a U24 - Limit, -} - -impl TryFrom for U24 { - type Error = U24Error; - - fn try_from(value: u32) -> Result { - if (value & 0xFF000000) != 0 { - Err(U24Error::Limit) - } else { - Ok(Self([ - (value as u8), - ((value >> 8) as u8), - ((value >> 16) as u8), - ])) - } - } -} - -impl PartialOrd for U24 { - fn partial_cmp(&self, other: &Self) -> Option { - let self_u32 = self.to_u32(); - let other_u32 = other.to_u32(); - self_u32.partial_cmp(&other_u32) - } -} - -impl Ord for U24 { - fn cmp(&self, other: &Self) -> core::cmp::Ordering { - let self_u32 = self.to_u32(); - let other_u32 = other.to_u32(); - self_u32.cmp(&other_u32) - } -} - -/// Slice that we need to transmute -const EMPTY_U24_SLICE: &[U24] = &[]; -/// An empty `&ZeroSlice` -pub const EMPTY_U24: &ZeroSlice = unsafe { core::mem::transmute(EMPTY_U24_SLICE) }; diff --git a/provider/datagen/src/transform/icuexport/normalizer/mod.rs b/provider/datagen/src/transform/icuexport/normalizer/mod.rs index 4990df4d5df..90a56e2e167 100644 --- a/provider/datagen/src/transform/icuexport/normalizer/mod.rs +++ b/provider/datagen/src/transform/icuexport/normalizer/mod.rs @@ -8,7 +8,6 @@ use icu_collections::char16trie::Char16Trie; use icu_collections::codepointtrie::CodePointTrie; use icu_normalizer::provider::*; -use icu_normalizer::u24::U24; use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::convert::TryFrom; @@ -92,7 +91,7 @@ macro_rules! normalization_tables_provider { DecompositionTables, $file_name, { - let mut scalars24: Vec = Vec::new(); + let mut scalars24: Vec = Vec::new(); for &u in toml_data.scalars32.iter() { scalars24.push( u.try_into() @@ -142,7 +141,7 @@ macro_rules! normalization_non_recursive_decomposition_supplement_provider { { let trie = CodePointTrie::::try_from(&toml_data.trie) .map_err(|e| DataError::custom("trie conversion").with_display_context(&e))?; - let mut scalars24: Vec = Vec::new(); + let mut scalars24: Vec = Vec::new(); for &u in toml_data.scalars32.iter() { scalars24.push( u.try_into() diff --git a/provider/testdata/data/json/fingerprints.csv b/provider/testdata/data/json/fingerprints.csv index 7f57b88bf03..f1c95a246b9 100644 --- a/provider/testdata/data/json/fingerprints.csv +++ b/provider/testdata/data/json/fingerprints.csv @@ -700,11 +700,11 @@ list/unit@1, und, 267B, ab8cc47b97781d052232b4c5ea96b5fa6a0370262ae18cba539dd349 locid_transform/aliases@1, und, 18500B, 231601ea4c6b6ce73165ffbc5c0d9d448625d677cee0733cb00af2ec32a5d2ef locid_transform/likelysubtags@1, und, 87515B, 6f6ee5eacd835e2eeb53e32e42a85fb9f6ef3957cd38436e635c8b9c0f3d373d normalizer/comp@1, und, 29836B, 634be78f876811cd829efa0d9e2ff29d28b8f13696b527df30c7ef6f36820a47 -normalizer/decomp@1, und, 14173B, 66fd25e3d24e47221553fa678ef708042894b525adba013315cfe51c6b86b062 +normalizer/decomp@1, und, 13620B, f9910c9b0fa1ef6938f3a66ad0e52b74ac18dc7ca3ce665f2d0867ebec782807 normalizer/nfd@1, und, 84721B, 8709d9531bd1f1d1c3f8c5ba1713e3742248c75c33b296ecb28526c530ec47ea -normalizer/nfdex@1, und, 13997B, c5f7bb6ad0fbb2d1cbba25d47ed7536f221e3f41c180c0e136e0e49d68b5c448 +normalizer/nfdex@1, und, 9053B, b9bbfc1916200621e10e2fad1801d8787d6a1bd49e4eeea1e6de4bc01b3a4673 normalizer/nfkd@1, und, 65273B, 4642829a0c78f6289cb59d16263ef24f580447ecd1f9fa996539d07b8ba17a29 -normalizer/nfkdex@1, und, 33907B, f572e5400a4b0e0fa4bb4e74a23dd4259ac129df4f7fd99286df039b0b959dd0 +normalizer/nfkdex@1, und, 26054B, 62d4d8e58f93cf60f16a5172dd633d6f9b70033b5ac74ecac8284b46b5d5114d normalizer/uts46d@1, und, 90843B, 085881397b380a2443a7e532504dc92c61534e267340e444aee1b72318240401 plurals/cardinal@1, ar, 116B, 70b9c317d4a0610bea253ee36b3b03558caef37fe31191594c78c740eddae8db plurals/cardinal@1, bn, 92B, e9b39fe9dc7f558686241506e6ec8f9b043e088af3c72a7176d8ed20c95c84f0 diff --git a/provider/testdata/data/json/normalizer/decomp@1/und.json b/provider/testdata/data/json/normalizer/decomp@1/und.json index f709c5a86ae..ee8957a347b 100644 --- a/provider/testdata/data/json/normalizer/decomp@1/und.json +++ b/provider/testdata/data/json/normalizer/decomp@1/und.json @@ -1199,95 +1199,23 @@ ] }, "scalars24": [ - [ - 188, - 209, - 1 - ], - [ - 111, - 209, - 1 - ], - [ - 187, - 209, - 1 - ], - [ - 111, - 209, - 1 - ], - [ - 188, - 209, - 1 - ], - [ - 110, - 209, - 1 - ], - [ - 187, - 209, - 1 - ], - [ - 110, - 209, - 1 - ], - [ - 95, - 209, - 1 - ], - [ - 114, - 209, - 1 - ], - [ - 95, - 209, - 1 - ], - [ - 113, - 209, - 1 - ], - [ - 95, - 209, - 1 - ], - [ - 112, - 209, - 1 - ], - [ - 95, - 209, - 1 - ], - [ - 111, - 209, - 1 - ], - [ - 95, - 209, - 1 - ], - [ - 110, - 209, - 1 - ] + "๐†ผ", + "๐…ฏ", + "๐†ป", + "๐…ฏ", + "๐†ผ", + "๐…ฎ", + "๐†ป", + "๐…ฎ", + "๐…Ÿ", + "๐…ฒ", + "๐…Ÿ", + "๐…ฑ", + "๐…Ÿ", + "๐…ฐ", + "๐…Ÿ", + "๐…ฏ", + "๐…Ÿ", + "๐…ฎ" ] } diff --git a/provider/testdata/data/json/normalizer/nfdex@1/und.json b/provider/testdata/data/json/normalizer/nfdex@1/und.json index c1b013bc9e2..c20dc64e0bf 100644 --- a/provider/testdata/data/json/normalizer/nfdex@1/und.json +++ b/provider/testdata/data/json/normalizer/nfdex@1/und.json @@ -780,830 +780,170 @@ 772 ], "scalars24": [ - [ - 0, - 166, - 2 - ], - [ - 145, - 162, - 2 - ], - [ - 14, - 162, - 2 - ], - [ - 5, - 161, - 2 - ], - [ - 206, - 160, - 2 - ], - [ - 48, - 155, - 2 - ], - [ - 182, - 149, - 2 - ], - [ - 150, - 148, - 2 - ], - [ - 10, - 148, - 2 - ], - [ - 26, - 146, - 2 - ], - [ - 69, - 145, - 2 - ], - [ - 119, - 141, - 2 - ], - [ - 250, - 139, - 2 - ], - [ - 46, - 135, - 2 - ], - [ - 237, - 133, - 2 - ], - [ - 210, - 133, - 2 - ], - [ - 222, - 8, - 2 - ], - [ - 4, - 8, - 2 - ], - [ - 47, - 127, - 2 - ], - [ - 168, - 124, - 2 - ], - [ - 102, - 121, - 2 - ], - [ - 174, - 120, - 2 - ], - [ - 103, - 118, - 2 - ], - [ - 210, - 112, - 2 - ], - [ - 177, - 111, - 2 - ], - [ - 44, - 111, - 2 - ], - [ - 202, - 115, - 2 - ], - [ - 213, - 108, - 2 - ], - [ - 107, - 109, - 2 - ], - [ - 54, - 108, - 2 - ], - [ - 60, - 107, - 2 - ], - [ - 156, - 51, - 2 - ], - [ - 147, - 51, - 2 - ], - [ - 181, - 103, - 2 - ], - [ - 167, - 103, - 2 - ], - [ - 95, - 51, - 2 - ], - [ - 168, - 101, - 2 - ], - [ - 35, - 101, - 2 - ], - [ - 218, - 100, - 2 - ], - [ - 62, - 99, - 2 - ], - [ - 217, - 98, - 2 - ], - [ - 71, - 98, - 2 - ], - [ - 40, - 98, - 2 - ], - [ - 134, - 95, - 2 - ], - [ - 128, - 92, - 2 - ], - [ - 171, - 91, - 2 - ], - [ - 167, - 90, - 2 - ], - [ - 124, - 89, - 2 - ], - [ - 197, - 86, - 2 - ], - [ - 154, - 86, - 2 - ], - [ - 38, - 86, - 2 - ], - [ - 29, - 84, - 2 - ], - [ - 51, - 81, - 2 - ], - [ - 25, - 81, - 2 - ], - [ - 242, - 80, - 2 - ], - [ - 243, - 80, - 2 - ], - [ - 68, - 80, - 2 - ], - [ - 184, - 79, - 2 - ], - [ - 161, - 79, - 2 - ], - [ - 159, - 33, - 2 - ], - [ - 146, - 76, - 2 - ], - [ - 54, - 76, - 2 - ], - [ - 20, - 72, - 2 - ], - [ - 53, - 71, - 2 - ], - [ - 8, - 70, - 2 - ], - [ - 171, - 67, - 2 - ], - [ - 99, - 66, - 2 - ], - [ - 37, - 5, - 2 - ], - [ - 142, - 63, - 2 - ], - [ - 94, - 63, - 2 - ], - [ - 209, - 62, - 2 - ], - [ - 30, - 61, - 2 - ], - [ - 188, - 60, - 2 - ], - [ - 250, - 58, - 2 - ], - [ - 11, - 29, - 2 - ], - [ - 141, - 58, - 2 - ], - [ - 167, - 56, - 2 - ], - [ - 163, - 54, - 2 - ], - [ - 109, - 52, - 2 - ], - [ - 195, - 51, - 2 - ], - [ - 10, - 48, - 2 - ], - [ - 241, - 43, - 2 - ], - [ - 12, - 43, - 2 - ], - [ - 212, - 38, - 2 - ], - [ - 218, - 97, - 2 - ], - [ - 184, - 50, - 2 - ], - [ - 49, - 35, - 2 - ], - [ - 146, - 163, - 2 - ], - [ - 131, - 33, - 2 - ], - [ - 230, - 29, - 2 - ], - [ - 228, - 29, - 2 - ], - [ - 24, - 27, - 2 - ], - [ - 200, - 25, - 2 - ], - [ - 234, - 22, - 2 - ], - [ - 168, - 22, - 2 - ], - [ - 228, - 20, - 2 - ], - [ - 99, - 11, - 2 - ], - [ - 44, - 10, - 2 - ], - [ - 223, - 145, - 2 - ], - [ - 75, - 5, - 2 - ], - [ - 28, - 5, - 2 - ], - [ - 58, - 6, - 2 - ], - [ - 34, - 1, - 2 - ], - [ - 186, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 111, - 209, - 1 - ], - [ - 185, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 111, - 209, - 1 - ], - [ - 186, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 110, - 209, - 1 - ], - [ - 185, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 110, - 209, - 1 - ], - [ - 88, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 114, - 209, - 1 - ], - [ - 88, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 113, - 209, - 1 - ], - [ - 88, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 112, - 209, - 1 - ], - [ - 88, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 111, - 209, - 1 - ], - [ - 88, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 110, - 209, - 1 - ], - [ - 87, - 209, - 1 - ], - [ - 101, - 209, - 1 - ], - [ - 53, - 25, - 1 - ], - [ - 48, - 25, - 1 - ], - [ - 185, - 21, - 1 - ], - [ - 175, - 21, - 1 - ], - [ - 184, - 21, - 1 - ], - [ - 175, - 21, - 1 - ], - [ - 185, - 20, - 1 - ], - [ - 189, - 20, - 1 - ], - [ - 185, - 20, - 1 - ], - [ - 176, - 20, - 1 - ], - [ - 185, - 20, - 1 - ], - [ - 186, - 20, - 1 - ], - [ - 71, - 19, - 1 - ], - [ - 87, - 19, - 1 - ], - [ - 71, - 19, - 1 - ], - [ - 62, - 19, - 1 - ], - [ - 50, - 17, - 1 - ], - [ - 39, - 17, - 1 - ], - [ - 49, - 17, - 1 - ], - [ - 39, - 17, - 1 - ], - [ - 165, - 16, - 1 - ], - [ - 186, - 16, - 1 - ], - [ - 155, - 16, - 1 - ], - [ - 186, - 16, - 1 - ], - [ - 153, - 16, - 1 - ], - [ - 186, - 16, - 1 - ], - [ - 211, - 126, - 2 - ], - [ - 208, - 92, - 2 - ], - [ - 73, - 82, - 2 - ], - [ - 213, - 51, - 2 - ], - [ - 68, - 40, - 2 - ], - [ - 74, - 40, - 2 - ], - [ - 238, - 66, - 2 - ] + "๐ช˜€", + "๐ชŠ‘", + "๐ชˆŽ", + "๐ช„…", + "๐ชƒŽ", + "๐ฉฌฐ", + "๐ฉ–ถ", + "๐ฉ’–", + "๐ฉŠ", + "๐ฉˆš", + "๐ฉ……", + "๐จตท", + "๐จฏบ", + "๐จœฎ", + "๐จ—ญ", + "๐จ—’", + "๐ ฃž", + "๐  „", + "๐งผฏ", + "๐งฒจ", + "๐งฅฆ", + "๐งขฎ", + "๐ง™ง", + "๐งƒ’", + "๐ฆพฑ", + "๐ฆผฌ", + "๐งŠ", + "๐ฆณ•", + "๐ฆตซ", + "๐ฆฐถ", + "๐ฆฌผ", + "๐ฃŽœ", + "๐ฃŽ“", + "๐ฆžต", + "๐ฆžง", + "๐ฃŸ", + "๐ฆ–จ", + "๐ฆ”ฃ", + "๐ฆ“š", + "๐ฆŒพ", + "๐ฆ‹™", + "๐ฆ‰‡", + "๐ฆˆจ", + "๐ฅพ†", + "๐ฅฒ€", + "๐ฅฎซ", + "๐ฅชง", + "๐ฅฅผ", + "๐ฅ›…", + "๐ฅšš", + "๐ฅ˜ฆ", + "๐ฅ", + "๐ฅ„ณ", + "๐ฅ„™", + "๐ฅƒฒ", + "๐ฅƒณ", + "๐ฅ„", + "๐คพธ", + "๐คพก", + "๐ข†Ÿ", + "๐คฒ’", + "๐คฐถ", + "๐ค ”", + "๐คœต", + "๐ค˜ˆ", + "๐คŽซ", + "๐ค‰ฃ", + "๐ ”ฅ", + "๐ฃพŽ", + "๐ฃฝž", + "๐ฃป‘", + "๐ฃดž", + "๐ฃฒผ", + "๐ฃซบ", + "๐กด‹", + "๐ฃช", + "๐ฃขง", + "๐ฃšฃ", + "๐ฃ‘ญ", + "๐ฃƒ", + "๐ฃ€Š", + "๐ขฏฑ", + "๐ขฌŒ", + "๐ข›”", + "๐ฆ‡š", + "๐ฃŠธ", + "๐ขŒฑ", + "๐ชŽ’", + "๐ข†ƒ", + "๐กทฆ", + "๐กทค", + "๐กฌ˜", + "๐กงˆ", + "๐ก›ช", + "๐กšจ", + "๐ก“ค", + "๐ ญฃ", + "๐ จฌ", + "๐ฉ‡Ÿ", + "๐ •‹", + "๐ ”œ", + "๐ ˜บ", + "๐ „ข", + "๐†บ", + "๐…ฅ", + "๐…ฏ", + "๐†น", + "๐…ฅ", + "๐…ฏ", + "๐†บ", + "๐…ฅ", + "๐…ฎ", + "๐†น", + "๐…ฅ", + "๐…ฎ", + "๐…˜", + "๐…ฅ", + "๐…ฒ", + "๐…˜", + "๐…ฅ", + "๐…ฑ", + "๐…˜", + "๐…ฅ", + "๐…ฐ", + "๐…˜", + "๐…ฅ", + "๐…ฏ", + "๐…˜", + "๐…ฅ", + "๐…ฎ", + "๐…—", + "๐…ฅ", + "๐‘คต", + "๐‘คฐ", + "๐‘–น", + "๐‘–ฏ", + "๐‘–ธ", + "๐‘–ฏ", + "๐‘’น", + "๐‘’ฝ", + "๐‘’น", + "๐‘’ฐ", + "๐‘’น", + "๐‘’บ", + "๐‘‡", + "๐‘—", + "๐‘‡", + "๐‘Œพ", + "๐‘„ฒ", + "๐‘„ง", + "๐‘„ฑ", + "๐‘„ง", + "๐‘‚ฅ", + "๐‘‚บ", + "๐‘‚›", + "๐‘‚บ", + "๐‘‚™", + "๐‘‚บ", + "๐งป“", + "๐ฅณ", + "๐ฅ‰‰", + "๐ฃ•", + "๐ขก„", + "๐ขกŠ", + "๐ค‹ฎ" ] } diff --git a/provider/testdata/data/json/normalizer/nfkdex@1/und.json b/provider/testdata/data/json/normalizer/nfkdex@1/und.json index 3d926b7e493..ddef06caeea 100644 --- a/provider/testdata/data/json/normalizer/nfkdex@1/und.json +++ b/provider/testdata/data/json/normalizer/nfkdex@1/und.json @@ -2441,1335 +2441,271 @@ 953 ], "scalars24": [ - [ - 30, - 223, - 1 - ], - [ - 10, - 223, - 1 - ], - [ - 8, - 223, - 1 - ], - [ - 6, - 223, - 1 - ], - [ - 5, - 223, - 1 - ], - [ - 4, - 223, - 1 - ], - [ - 67, - 233, - 1 - ], - [ - 66, - 233, - 1 - ], - [ - 65, - 233, - 1 - ], - [ - 64, - 233, - 1 - ], - [ - 63, - 233, - 1 - ], - [ - 62, - 233, - 1 - ], - [ - 61, - 233, - 1 - ], - [ - 60, - 233, - 1 - ], - [ - 59, - 233, - 1 - ], - [ - 58, - 233, - 1 - ], - [ - 57, - 233, - 1 - ], - [ - 56, - 233, - 1 - ], - [ - 55, - 233, - 1 - ], - [ - 54, - 233, - 1 - ], - [ - 53, - 233, - 1 - ], - [ - 52, - 233, - 1 - ], - [ - 51, - 233, - 1 - ], - [ - 50, - 233, - 1 - ], - [ - 49, - 233, - 1 - ], - [ - 48, - 233, - 1 - ], - [ - 47, - 233, - 1 - ], - [ - 46, - 233, - 1 - ], - [ - 45, - 233, - 1 - ], - [ - 44, - 233, - 1 - ], - [ - 43, - 233, - 1 - ], - [ - 42, - 233, - 1 - ], - [ - 41, - 233, - 1 - ], - [ - 40, - 233, - 1 - ], - [ - 39, - 233, - 1 - ], - [ - 38, - 233, - 1 - ], - [ - 37, - 233, - 1 - ], - [ - 36, - 233, - 1 - ], - [ - 35, - 233, - 1 - ], - [ - 34, - 233, - 1 - ], - [ - 127, - 110, - 1 - ], - [ - 126, - 110, - 1 - ], - [ - 125, - 110, - 1 - ], - [ - 124, - 110, - 1 - ], - [ - 123, - 110, - 1 - ], - [ - 122, - 110, - 1 - ], - [ - 121, - 110, - 1 - ], - [ - 120, - 110, - 1 - ], - [ - 119, - 110, - 1 - ], - [ - 118, - 110, - 1 - ], - [ - 117, - 110, - 1 - ], - [ - 116, - 110, - 1 - ], - [ - 115, - 110, - 1 - ], - [ - 114, - 110, - 1 - ], - [ - 113, - 110, - 1 - ], - [ - 112, - 110, - 1 - ], - [ - 111, - 110, - 1 - ], - [ - 110, - 110, - 1 - ], - [ - 109, - 110, - 1 - ], - [ - 108, - 110, - 1 - ], - [ - 107, - 110, - 1 - ], - [ - 106, - 110, - 1 - ], - [ - 105, - 110, - 1 - ], - [ - 104, - 110, - 1 - ], - [ - 103, - 110, - 1 - ], - [ - 102, - 110, - 1 - ], - [ - 101, - 110, - 1 - ], - [ - 100, - 110, - 1 - ], - [ - 99, - 110, - 1 - ], - [ - 98, - 110, - 1 - ], - [ - 97, - 110, - 1 - ], - [ - 96, - 110, - 1 - ], - [ - 223, - 24, - 1 - ], - [ - 222, - 24, - 1 - ], - [ - 221, - 24, - 1 - ], - [ - 220, - 24, - 1 - ], - [ - 219, - 24, - 1 - ], - [ - 218, - 24, - 1 - ], - [ - 217, - 24, - 1 - ], - [ - 216, - 24, - 1 - ], - [ - 215, - 24, - 1 - ], - [ - 214, - 24, - 1 - ], - [ - 213, - 24, - 1 - ], - [ - 212, - 24, - 1 - ], - [ - 211, - 24, - 1 - ], - [ - 210, - 24, - 1 - ], - [ - 209, - 24, - 1 - ], - [ - 208, - 24, - 1 - ], - [ - 207, - 24, - 1 - ], - [ - 206, - 24, - 1 - ], - [ - 205, - 24, - 1 - ], - [ - 204, - 24, - 1 - ], - [ - 203, - 24, - 1 - ], - [ - 202, - 24, - 1 - ], - [ - 201, - 24, - 1 - ], - [ - 200, - 24, - 1 - ], - [ - 199, - 24, - 1 - ], - [ - 198, - 24, - 1 - ], - [ - 197, - 24, - 1 - ], - [ - 196, - 24, - 1 - ], - [ - 195, - 24, - 1 - ], - [ - 194, - 24, - 1 - ], - [ - 193, - 24, - 1 - ], - [ - 192, - 24, - 1 - ], - [ - 242, - 12, - 1 - ], - [ - 241, - 12, - 1 - ], - [ - 240, - 12, - 1 - ], - [ - 239, - 12, - 1 - ], - [ - 238, - 12, - 1 - ], - [ - 237, - 12, - 1 - ], - [ - 236, - 12, - 1 - ], - [ - 235, - 12, - 1 - ], - [ - 234, - 12, - 1 - ], - [ - 233, - 12, - 1 - ], - [ - 232, - 12, - 1 - ], - [ - 231, - 12, - 1 - ], - [ - 230, - 12, - 1 - ], - [ - 229, - 12, - 1 - ], - [ - 228, - 12, - 1 - ], - [ - 227, - 12, - 1 - ], - [ - 226, - 12, - 1 - ], - [ - 225, - 12, - 1 - ], - [ - 224, - 12, - 1 - ], - [ - 223, - 12, - 1 - ], - [ - 222, - 12, - 1 - ], - [ - 221, - 12, - 1 - ], - [ - 220, - 12, - 1 - ], - [ - 219, - 12, - 1 - ], - [ - 218, - 12, - 1 - ], - [ - 217, - 12, - 1 - ], - [ - 216, - 12, - 1 - ], - [ - 215, - 12, - 1 - ], - [ - 214, - 12, - 1 - ], - [ - 213, - 12, - 1 - ], - [ - 212, - 12, - 1 - ], - [ - 211, - 12, - 1 - ], - [ - 210, - 12, - 1 - ], - [ - 209, - 12, - 1 - ], - [ - 208, - 12, - 1 - ], - [ - 207, - 12, - 1 - ], - [ - 206, - 12, - 1 - ], - [ - 205, - 12, - 1 - ], - [ - 204, - 12, - 1 - ], - [ - 203, - 12, - 1 - ], - [ - 202, - 12, - 1 - ], - [ - 201, - 12, - 1 - ], - [ - 200, - 12, - 1 - ], - [ - 199, - 12, - 1 - ], - [ - 198, - 12, - 1 - ], - [ - 197, - 12, - 1 - ], - [ - 196, - 12, - 1 - ], - [ - 195, - 12, - 1 - ], - [ - 194, - 12, - 1 - ], - [ - 193, - 12, - 1 - ], - [ - 192, - 12, - 1 - ], - [ - 188, - 5, - 1 - ], - [ - 187, - 5, - 1 - ], - [ - 185, - 5, - 1 - ], - [ - 184, - 5, - 1 - ], - [ - 183, - 5, - 1 - ], - [ - 182, - 5, - 1 - ], - [ - 181, - 5, - 1 - ], - [ - 180, - 5, - 1 - ], - [ - 179, - 5, - 1 - ], - [ - 177, - 5, - 1 - ], - [ - 176, - 5, - 1 - ], - [ - 175, - 5, - 1 - ], - [ - 174, - 5, - 1 - ], - [ - 173, - 5, - 1 - ], - [ - 172, - 5, - 1 - ], - [ - 171, - 5, - 1 - ], - [ - 170, - 5, - 1 - ], - [ - 169, - 5, - 1 - ], - [ - 168, - 5, - 1 - ], - [ - 167, - 5, - 1 - ], - [ - 166, - 5, - 1 - ], - [ - 165, - 5, - 1 - ], - [ - 164, - 5, - 1 - ], - [ - 163, - 5, - 1 - ], - [ - 161, - 5, - 1 - ], - [ - 160, - 5, - 1 - ], - [ - 159, - 5, - 1 - ], - [ - 158, - 5, - 1 - ], - [ - 157, - 5, - 1 - ], - [ - 156, - 5, - 1 - ], - [ - 155, - 5, - 1 - ], - [ - 154, - 5, - 1 - ], - [ - 153, - 5, - 1 - ], - [ - 152, - 5, - 1 - ], - [ - 151, - 5, - 1 - ], - [ - 251, - 4, - 1 - ], - [ - 250, - 4, - 1 - ], - [ - 249, - 4, - 1 - ], - [ - 248, - 4, - 1 - ], - [ - 247, - 4, - 1 - ], - [ - 246, - 4, - 1 - ], - [ - 245, - 4, - 1 - ], - [ - 244, - 4, - 1 - ], - [ - 243, - 4, - 1 - ], - [ - 242, - 4, - 1 - ], - [ - 241, - 4, - 1 - ], - [ - 240, - 4, - 1 - ], - [ - 239, - 4, - 1 - ], - [ - 238, - 4, - 1 - ], - [ - 237, - 4, - 1 - ], - [ - 236, - 4, - 1 - ], - [ - 235, - 4, - 1 - ], - [ - 234, - 4, - 1 - ], - [ - 233, - 4, - 1 - ], - [ - 232, - 4, - 1 - ], - [ - 231, - 4, - 1 - ], - [ - 230, - 4, - 1 - ], - [ - 229, - 4, - 1 - ], - [ - 228, - 4, - 1 - ], - [ - 227, - 4, - 1 - ], - [ - 226, - 4, - 1 - ], - [ - 225, - 4, - 1 - ], - [ - 224, - 4, - 1 - ], - [ - 223, - 4, - 1 - ], - [ - 222, - 4, - 1 - ], - [ - 221, - 4, - 1 - ], - [ - 220, - 4, - 1 - ], - [ - 219, - 4, - 1 - ], - [ - 218, - 4, - 1 - ], - [ - 217, - 4, - 1 - ], - [ - 216, - 4, - 1 - ], - [ - 79, - 4, - 1 - ], - [ - 78, - 4, - 1 - ], - [ - 77, - 4, - 1 - ], - [ - 76, - 4, - 1 - ], - [ - 75, - 4, - 1 - ], - [ - 74, - 4, - 1 - ], - [ - 73, - 4, - 1 - ], - [ - 72, - 4, - 1 - ], - [ - 71, - 4, - 1 - ], - [ - 70, - 4, - 1 - ], - [ - 69, - 4, - 1 - ], - [ - 68, - 4, - 1 - ], - [ - 67, - 4, - 1 - ], - [ - 66, - 4, - 1 - ], - [ - 65, - 4, - 1 - ], - [ - 64, - 4, - 1 - ], - [ - 63, - 4, - 1 - ], - [ - 62, - 4, - 1 - ], - [ - 61, - 4, - 1 - ], - [ - 60, - 4, - 1 - ], - [ - 59, - 4, - 1 - ], - [ - 58, - 4, - 1 - ], - [ - 57, - 4, - 1 - ], - [ - 56, - 4, - 1 - ], - [ - 55, - 4, - 1 - ], - [ - 54, - 4, - 1 - ], - [ - 53, - 4, - 1 - ], - [ - 52, - 4, - 1 - ], - [ - 51, - 4, - 1 - ], - [ - 50, - 4, - 1 - ], - [ - 49, - 4, - 1 - ], - [ - 48, - 4, - 1 - ], - [ - 47, - 4, - 1 - ], - [ - 46, - 4, - 1 - ], - [ - 45, - 4, - 1 - ], - [ - 44, - 4, - 1 - ], - [ - 43, - 4, - 1 - ], - [ - 42, - 4, - 1 - ], - [ - 41, - 4, - 1 - ], - [ - 40, - 4, - 1 - ] + "๐ผž", + "๐ผŠ", + "๐ผˆ", + "๐ผ†", + "๐ผ…", + "๐ผ„", + "๐žฅƒ", + "๐žฅ‚", + "๐žฅ", + "๐žฅ€", + "๐žคฟ", + "๐žคพ", + "๐žคฝ", + "๐žคผ", + "๐žคป", + "๐žคบ", + "๐žคน", + "๐žคธ", + "๐žคท", + "๐žคถ", + "๐žคต", + "๐žคด", + "๐žคณ", + "๐žคฒ", + "๐žคฑ", + "๐žคฐ", + "๐žคฏ", + "๐žคฎ", + "๐žคญ", + "๐žคฌ", + "๐žคซ", + "๐žคช", + "๐žคฉ", + "๐žคจ", + "๐žคง", + "๐žคฆ", + "๐žคฅ", + "๐žคค", + "๐žคฃ", + "๐žคข", + "๐–นฟ", + "๐–นพ", + "๐–นฝ", + "๐–นผ", + "๐–นป", + "๐–นบ", + "๐–นน", + "๐–นธ", + "๐–นท", + "๐–นถ", + "๐–นต", + "๐–นด", + "๐–นณ", + "๐–นฒ", + "๐–นฑ", + "๐–นฐ", + "๐–นฏ", + "๐–นฎ", + "๐–นญ", + "๐–นฌ", + "๐–นซ", + "๐–นช", + "๐–นฉ", + "๐–นจ", + "๐–นง", + "๐–นฆ", + "๐–นฅ", + "๐–นค", + "๐–นฃ", + "๐–นข", + "๐–นก", + "๐–น ", + "๐‘ฃŸ", + "๐‘ฃž", + "๐‘ฃ", + "๐‘ฃœ", + "๐‘ฃ›", + "๐‘ฃš", + "๐‘ฃ™", + "๐‘ฃ˜", + "๐‘ฃ—", + "๐‘ฃ–", + "๐‘ฃ•", + "๐‘ฃ”", + "๐‘ฃ“", + "๐‘ฃ’", + "๐‘ฃ‘", + "๐‘ฃ", + "๐‘ฃ", + "๐‘ฃŽ", + "๐‘ฃ", + "๐‘ฃŒ", + "๐‘ฃ‹", + "๐‘ฃŠ", + "๐‘ฃ‰", + "๐‘ฃˆ", + "๐‘ฃ‡", + "๐‘ฃ†", + "๐‘ฃ…", + "๐‘ฃ„", + "๐‘ฃƒ", + "๐‘ฃ‚", + "๐‘ฃ", + "๐‘ฃ€", + "๐ณฒ", + "๐ณฑ", + "๐ณฐ", + "๐ณฏ", + "๐ณฎ", + "๐ณญ", + "๐ณฌ", + "๐ณซ", + "๐ณช", + "๐ณฉ", + "๐ณจ", + "๐ณง", + "๐ณฆ", + "๐ณฅ", + "๐ณค", + "๐ณฃ", + "๐ณข", + "๐ณก", + "๐ณ ", + "๐ณŸ", + "๐ณž", + "๐ณ", + "๐ณœ", + "๐ณ›", + "๐ณš", + "๐ณ™", + "๐ณ˜", + "๐ณ—", + "๐ณ–", + "๐ณ•", + "๐ณ”", + "๐ณ“", + "๐ณ’", + "๐ณ‘", + "๐ณ", + "๐ณ", + "๐ณŽ", + "๐ณ", + "๐ณŒ", + "๐ณ‹", + "๐ณŠ", + "๐ณ‰", + "๐ณˆ", + "๐ณ‡", + "๐ณ†", + "๐ณ…", + "๐ณ„", + "๐ณƒ", + "๐ณ‚", + "๐ณ", + "๐ณ€", + "๐–ผ", + "๐–ป", + "๐–น", + "๐–ธ", + "๐–ท", + "๐–ถ", + "๐–ต", + "๐–ด", + "๐–ณ", + "๐–ฑ", + "๐–ฐ", + "๐–ฏ", + "๐–ฎ", + "๐–ญ", + "๐–ฌ", + "๐–ซ", + "๐–ช", + "๐–ฉ", + "๐–จ", + "๐–ง", + "๐–ฆ", + "๐–ฅ", + "๐–ค", + "๐–ฃ", + "๐–ก", + "๐– ", + "๐–Ÿ", + "๐–ž", + "๐–", + "๐–œ", + "๐–›", + "๐–š", + "๐–™", + "๐–˜", + "๐–—", + "๐“ป", + "๐“บ", + "๐“น", + "๐“ธ", + "๐“ท", + "๐“ถ", + "๐“ต", + "๐“ด", + "๐“ณ", + "๐“ฒ", + "๐“ฑ", + "๐“ฐ", + "๐“ฏ", + "๐“ฎ", + "๐“ญ", + "๐“ฌ", + "๐“ซ", + "๐“ช", + "๐“ฉ", + "๐“จ", + "๐“ง", + "๐“ฆ", + "๐“ฅ", + "๐“ค", + "๐“ฃ", + "๐“ข", + "๐“ก", + "๐“ ", + "๐“Ÿ", + "๐“ž", + "๐“", + "๐“œ", + "๐“›", + "๐“š", + "๐“™", + "๐“˜", + "๐‘", + "๐‘Ž", + "๐‘", + "๐‘Œ", + "๐‘‹", + "๐‘Š", + "๐‘‰", + "๐‘ˆ", + "๐‘‡", + "๐‘†", + "๐‘…", + "๐‘„", + "๐‘ƒ", + "๐‘‚", + "๐‘", + "๐‘€", + "๐ฟ", + "๐พ", + "๐ฝ", + "๐ผ", + "๐ป", + "๐บ", + "๐น", + "๐ธ", + "๐ท", + "๐ถ", + "๐ต", + "๐ด", + "๐ณ", + "๐ฒ", + "๐ฑ", + "๐ฐ", + "๐ฏ", + "๐ฎ", + "๐ญ", + "๐ฌ", + "๐ซ", + "๐ช", + "๐ฉ", + "๐จ" ] }