From: Shane Carr Date: Wed, 29 May 2019 07:50:25 +0000 (+0000) Subject: ICU-20629 Fixing DTPG hour-format locale and region fallback logic. X-Git-Tag: release-65-rc~135 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=46c86b47cc9f97c8ed936866ef4a0afba00cf09e;p=icu ICU-20629 Fixing DTPG hour-format locale and region fallback logic. Includes changes in C and J. Makes region.cpp no longer depend on DecimalFormat. See also: CLDR-13071, ICU-20640, ICU-9982. --- diff --git a/icu4c/source/common/util.cpp b/icu4c/source/common/util.cpp index a762cc48716..86e5c791bad 100644 --- a/icu4c/source/common/util.cpp +++ b/icu4c/source/common/util.cpp @@ -276,6 +276,16 @@ int32_t ICU_Utility::parsePattern(const UnicodeString& pat, return -1; // text ended before end of pat } +int32_t ICU_Utility::parseAsciiInteger(const UnicodeString& str, int32_t& pos) { + int32_t result = 0; + UChar c; + while (pos < str.length() && (c = str.charAt(pos)) >= u'0' && c <= u'9') { + result = result * 10 + (c - u'0'); + pos++; + } + return result; +} + /** * Append a character to a rule that is being built up. To flush * the quoteBuf to rule, make one final call with isLiteral == TRUE. diff --git a/icu4c/source/common/util.h b/icu4c/source/common/util.h index e197cab7882..f3f71dce458 100644 --- a/icu4c/source/common/util.h +++ b/icu4c/source/common/util.h @@ -179,12 +179,21 @@ class U_COMMON_API ICU_Utility /* not : public UObject because all methods are s * Parse an integer at pos, either of the form \d+ or of the form * 0x[0-9A-Fa-f]+ or 0[0-7]+, that is, in standard decimal, hex, * or octal format. - * @param pos INPUT-OUTPUT parameter. On input, the first - * character to parse. On output, the character after the last - * parsed character. + * @param pos INPUT-OUTPUT parameter. On input, the index of the first + * character to parse. On output, the index of the character after the + * last parsed character. */ static int32_t parseInteger(const UnicodeString& rule, int32_t& pos, int32_t limit); + /** + * Parse an integer at pos using only ASCII digits. + * Base 10 only. + * @param pos INPUT-OUTPUT parameter. On input, the index of the first + * character to parse. On output, the index of the character after the + * last parsed character. + */ + static int32_t parseAsciiInteger(const UnicodeString& str, int32_t& pos); + /** * Parse a Unicode identifier from the given string at the given * position. Return the identifier, or an empty string if there diff --git a/icu4c/source/data/misc/langInfo.txt b/icu4c/source/data/misc/langInfo.txt index ca804f046fd..b8c176426e3 100644 --- a/icu4c/source/data/misc/langInfo.txt +++ b/icu4c/source/data/misc/langInfo.txt @@ -209,621 +209,621 @@ langInfo:table(nofallback){ "YU","RS", "ZR","CD", } // regionAliases - trie:bin{ // BytesTrie: 9782 bytes + trie:bin{ // BytesTrie: 9785 bytes 001a6dcc0b74c4e677c26077a2b378a4 -4e79a4bb7a0e6d7f7a5b7a30e1ad8ce8 -2ef5af2f10e1a537022a3c42cae54811 -616e01e2a3fcf4a3f70b4d24540e54ca -8c552a5610cea3fa10d3a3f94dca9550 -2a5310d2a3f502c1a3f4c6a3f2c8a3f3 -47d4a2473248d81dfb4910c4a3ef01c2 -a3f8c6a3ed6d326e36733a7910e2ad8c -10e9af2d10e5af2e10ed22022aa90643 -b4fd4910c4a908671767326836693a6c -10edaf2c10e8adb910f8ada910e1af2b -612e64326510e1af2a10e7af2810eaaf -2900126d46741b743475387742e1addc -efadf310edadf801f5adf9f6adfa10e1 -adfb6d3c6e406f50725a7301e7ad79eb -adf710efadef02e3adf0e9adf1f5adf2 -01e2adf4f3adf510f3adf66726673668 -3a693e6a4e6c10f3adee10e9ade710e7 -ade802e2ade9f5adeaf6adeb01e1adec -e9aded6138625463646501eca51ef2ad -e604e5adddeaaddeecaddfeeade0f2ad -e102f0ade2f1ade3f2ade410e9ade50c -6e3d7221722e7332774ee8adff10e2af -0504e1adb1e9af06eca52dedaf07f2af -0810e5af096e346f3e7001e5a78af2ad -ae01e1ada7f2af0201e7af03eeaf0465 -1d653a6c3e6d02e6af01eead9df2ada0 -10f3adfe02e1af00e3ad99e4ad9a612e -62326310f2ad6910f6adfc10e9adfd0d -6d49733073307534e9a731efaf1c10f3 -af2104e1af22e532eaaf25f4af26f7af -27012a2e4812616ef3af24012aaf2343 -10ceaf246d3a6f3e7202e2af1ee5af1f -ecaf2010ecaf1b10eeaf1d6520653e67 -426b4c6c02e5af18e7af19ecaf1a10f2 -af1401f2af15f7af1610efaf17612e62 -606410e4a73107f40cf4af0df6af0ef9 -af0ffaaf10eda7b2efaf0af0af0bf3af -0c02e1af11e2af12f9af1374a25275a4 -d0760a6f1fe509e5adcfe9ad57efadd7 -6f3472387501eeaddaf4addb10f4add8 -10efadd9613c654c69566c606d01e6ad -d5f7add602e7adcde9adbeeeadce01e3 -add0f0add101e3add2f6add310f3add4 -00267576e91ff20ef2abbdf3abc1f4ab -c7f767f9abd7e9aba2ebaba9ecabadee -abb3efabb57a247a36e1ab82e5ab93e7 -2ee8ab9e10edabda012a2e41127261e2 -ab9a012aab995010cbab9a753e765477 -6478ccca7901e1abd8f6abd903e8abce -ecabcfedabd0f1abd102e4a7b5ecabd2 -f5abd301e8abd4f1abd56b7d7049705e -716e727273827406f10cf1abb1f2abcb -f3abccf4abcde4abc8e5abc9eaabca02 -e9abb9edabbafaabbb10efabbc02f5ab -bef6abbff7abc004e4abc2e6abc3e7ab -c4eaabc5f7abc66b426c526d626e6c6f -02e6abb6e7abb7f1abb802ecabaaf2ab -abf4abac02e6abaef8abaff9abb001e8 -abb1f9abb210e8abb46546655e667467 -7868886906eb0cebaba5edaba6efaba7 -f6aba8e2a3b0e6aba3e7aba403e4ab94 -edab95efab96f4ab9710e9ab9802e3ab -9befab9cf5ab9d02ecab9ff1aba0f2ab -a16144625a63866403e4ab90e7ab91e8 -ab92f5a54303eaab83ecab84eeab85f1 -ab8606e70ce7ab8aefab8bf7ab8cfaab -8de3ab87e4ab88e6ab8901e9ab8ef9ab -8f0f735fe72ce742ebabe1f2ad3ffa01 -2a8641127261e2adcb012a2e43127972 -ecabde022aabdd4b2a4d10ceabdf10da -abde7360746476687a10ee012a2e4112 -7261e2adcb022aabec412a4310ceadcc -10c6adcb10e1adc710f2adc801e8adc9 -ecadca6d326d3e6e426f707202e9adc4 -f4adc5f7adc610e2abe301f226f8adc3 -012a2e44126576e1adc2012aadc14e10 -d0adc210eba55a62326436673a6c10e9 -abe210f5abdb10edabdc10e1abe070c3 +4e79a4bb7a0e6d7f7a5b7a30e1ad8de8 +2ef5af3010e1a538022a3c42cae54811 +616e01e2a3fdf4a3f80b4d24540e54ca +8c552a5610cea3fb10d3a3fa4dca9550 +2a5310d2a3f602c1a3f5c6a3f3c8a3f4 +47d4a2473248d81dfb4910c4a3f001c2 +a3f9c6a3ee6d326e36733a7910e2ad8d +10e9af2e10e5af2f10ed22022aa90743 +b4fd4910c4a909671767326836693a6c +10edaf2d10e8adba10f8adaa10e1af2c +612e64326510e1af2b10e7af2910eaaf +2a00126d46741b743475387742e1addd +efadf410edadf901f5adfaf6adfb10e1 +adfc6d3c6e406f50725a7301e7ad7aeb +adf810efadf002e3adf1e9adf2f5adf3 +01e2adf5f3adf610f3adf76726673668 +3a693e6a4e6c10f3adef10e9ade810e7 +ade902e2adeaf5adebf6adec01e1aded +e9adee6138625463646501eca51ff2ad +e704e5addeeaaddfecade0eeade1f2ad +e202f0ade3f1ade4f2ade510e9ade60c +6e3d7221722e7332774ee8af0010e2af +0604e1adb2e9af07eca52eedaf08f2af +0910e5af0a6e346f3e7001e5a78bf2ad +af01e1ada8f2af0301e7af04eeaf0565 +1d653a6c3e6d02e6af02eead9ef2ada1 +10f3adff02e1af01e3ad9ae4ad9b612e +62326310f2ad6a10f6adfd10e9adfe0d +6d49733073307534e9a732efaf1d10f3 +af2204e1af23e532eaaf26f4af27f7af +28012a2e4812616ef3af25012aaf2443 +10ceaf256d3a6f3e7202e2af1fe5af20 +ecaf2110ecaf1c10eeaf1e6520653e67 +426b4c6c02e5af19e7af1aecaf1b10f2 +af1501f2af16f7af1710efaf18612e62 +606410e4a73207f40cf4af0ef6af0ff9 +af10faaf11eda7b3efaf0bf0af0cf3af +0d02e1af12e2af13f9af1474a25275a4 +d0760a6f1fe509e5add0e9ad58efadd8 +6f3472387501eeaddbf4addc10f4add9 +10efadda613c654c69566c606d01e6ad +d6f7add702e7adcee9adbfeeadcf01e3 +add1f0add201e3add3f6add410f3add5 +00267576e91ff20ef2abbef3abc2f4ab +c8f767f9abd8e9aba3ebabaaecabaeee +abb4efabb67a247a36e1ab83e5ab94e7 +2ee8ab9f10edabdb012a2e41127261e2 +ab9b012aab9a5010cbab9b753e765477 +6478ccca7901e1abd9f6abda03e8abcf +ecabd0edabd1f1abd202e4a7b6ecabd3 +f5abd401e8abd5f1abd66b7d7049705e +716e727273827406f10cf1abb2f2abcc +f3abcdf4abcee4abc9e5abcaeaabcb02 +e9abbaedabbbfaabbc10efabbd02f5ab +bff6abc0f7abc104e4abc3e6abc4e7ab +c5eaabc6f7abc76b426c526d626e6c6f +02e6abb7e7abb8f1abb902ecababf2ab +acf4abad02e6abaff8abb0f9abb101e8 +abb2f9abb310e8abb56546655e667467 +7868886906eb0cebaba6edaba7efaba8 +f6aba9e2a3b1e6aba4e7aba503e4ab95 +edab96efab97f4ab9810e9ab9902e3ab +9cefab9df5ab9e02ecaba0f1aba1f2ab +a26144625a63866403e4ab91e7ab92e8 +ab93f5a54403eaab84ecab85eeab86f1 +ab8706e70ce7ab8befab8cf7ab8dfaab +8ee3ab88e4ab89e6ab8a01e9ab8ff9ab +900f735fe72ce742ebabe2f2ad40fa01 +2a8641127261e2adcc012a2e43127972 +ecabdf022aabde4b2a4d10ceabe010da +abdf7360746476687a10ee012a2e4112 +7261e2adcc022aabed412a4310ceadcd +10c6adcc10e1adc810f2adc901e8adca +ecadcb6d326d3e6e426f707202e9adc5 +f4adc6f7adc710e2abe401f226f8adc4 +012a2e44126576e1adc3012aadc24e10 +d0adc310eba55b62326436673a6c10e9 +abe310f5abdc10edabdd10e1abe170c3 9570a4f971a6d772a6e47300287884ec -39f229f509f5ab71f6ab77f7ab78f22c -f3ab6af4ab6e22032aab244da4bf522a -5410d2ab2801cfab27d5ab25ecab4ced -ab51eeab58efab5ef16de429e438e5ab -34e7ab39e9ab42ebab48032aab2e4432 -4b3a5312696ee4ab31126576e1ab2f12 -686feaab307834793e7a48e1ab18e3ab -2301eeab7ef7ab7f01ecab80f2a50a10 -ecab816cad724f725873747484758e77 -05e809e8ab78f0ab7cf6ab7de2ab79e3 -ab7ae7ab7b04e2ab67e3ab23eeab68f2 -ab69f8a5ef02e4ab6be7ab6cf9ab6d01 -ebab6ff1ab7004e1ab72e5ab73ebab74 -f2ab75f3ab766c4a6d666e8c6fa24370 -03e4ab64ecab65f3ab66f9a77204e4ab -4de9ab4eecab4fefab48f9ab5005f009 -f0ab55f1ab56f3ab57e1ab52eaab53ee -ab5404e3ab59ebab5af0ab5bf8ab5cf9 -ab5d04e7ab5febab60f1ab61f5ab62f9 -ab63673e67426858696e6a846b02e3ab -49f2ab4af3ab4b03e1ab3af3ab3bf7ab -3cfaab3d03e9ab3eebab3feeab40f5ab -4103e4ab43e7ab44ecab45edab4610f2 -ab47614a6276638664a26b6503e6ab35 -e8ab36e9ab37f3ab3806f30cf3ab1cf4 -ab1df6ab1efaab1fe6ab19e8ab1af1ab -1b02e1ab20e5ab21f0ab2206ee0ceeab -2befab2cf2a5fdf3ab2de32cebab29ec -ab2a22055211522e53325410d2ab2810 -cfab2710d5ab252aab24312a4d10c5ab -261137b2ab2501e3ab32e8ab3300166e -63752bec09eca9e4f3a9d5f4a9f0754c -7750e1012a2e41127261e2a9cd012aa9 -cc5010cba9cd10f5a9f210e1a9f37217 -722e733e7410f0a9f102e1a9ece4a9ed -e7a9ee10f3a9ef6e346f4a7001e1a386 -efa9eb03e2a7c4e7a9e7eea9e8f4a9e9 -10eea9ea66306b176b2e6c386d10f3a9 -e601e1a9e2efa9e301e1a9e5f4a92766 -3468386901eca9e0f0a9e110eca9dd01 -eca9deeea9df614e627e638864926504 -e4a9daefa9dbf2a56ef3a56ef8a9dc04 -e7a9ceec32eda9d1f0a9d2f5a9d3012a -a9cf5012686cf0a9d001e9a9d4f5a9d5 -01e4a9d6eda9d701e3a9d8f4a9d90175 -26f5a9f402e3a9f5e7a9f6faa9f40014 -6f457917ef09efa944f5ab11f7ab1479 -2cedab04eeab0910f5ab176f3c724c74 -5075547701ebab15efab1602e2ab0ce6 -ab0defab0e10efab0f10edab1002e5ab -12e7ab13eda9446934693c6a566b5a6d -5e6e01e1ab0ae7ab0b01e1a9ffe62201 -2aab004e10ccab0110f3ab0210f4ab03 -03e6ab05efab06f4ab07f5ab08613663 -46654a675a6810e7a9fe02e9a9f7eaa9 -59efa9f810e6a9f902eaa9faeca9fbf3 -a9fc10eea9fd6da2576ea6446f0b741d -ed09eda59ff2a9c4f3a9c7742a7a34e3 -a9bc01e1a9c9eba9ca10eda9cb701770 -2e72327310e1a9c810eda9c302efa9c5 -f5a9c6f9a9c4673a6b3e6e02e7a9c0ee -a9c1f3a9c210e3a9bd01f2a9bef6a9bf -0022749fe926ef0fefa944f2a94ff3a4 -92f4a953f9a3cde9a903eba7fdeca939 -ee012abaab4d126f6ee7a53e783d7834 -793e7a64e7a927e8a92d01e3a962eda9 -6305f709f7a967f8a968faa969eba964 -eda965f6a96605f009f0a96df7a96efa -a96feba96aeda96beea96c7444755a76 -707703eba95ff2a535f6a960f7a96103 -e3a954e6a955e9a956f2a95703e1a958 -f0a959f2a95af3a95b02e1a95ceea95d -f9a95e69856e446e426f5e707a719072 -02e4a950eaa951efa95204e1a940e6a9 -41e9a942ebb603f7a94304e1a945e5a9 -46e8a947f3a948f8a94903f0a94af3a9 -4bf4a94cf8a94d10eca94e693e6b686c -7e6d02efa93df5a93ef8a93f03e6a930 -eea931f326f7a934012aa9324d126564 -e6a93303e9a935eca936f0a937f7a938 -02e5a93af0a93bf3a93c6549653e666a -67866802e9a92eeca92ff2a3fe06ee0c -eea91ef2a91ff4a920f5a921e4a91be5 -a91ceba91d04e1a922e5a923eea924ef -a925f1a92604e8a928eca929efa92af0 -a92bf9a92c615e62a25663a2636406e8 -0ce8a917eaa918f2a919f8a91ae1a914 -e5a915e6a9160bee23f718f7a905f926 -faa90922022aa906432a4910c4a90810 -c3a907eeb414efa903f3a904e709e7a9 -00e9a901eba902e3a7fde4a7fee6a7ff -04e8a90aefa90bf1a90cf5a90df7a90e -04e9a90ff0a910f1a911f2a912f5a913 -0021745fe41dee0feea99aefa9a0f2a9 -a7f6a9b4f9a9b8e4a97fe5a982e7a987 -eca54a791579307a3ae1a970e2a97801 -eda9b9eea9ba10e9a9bb74387542775e -7801f1a9b6f2a9b701eda9adf2a9ae04 -e9a9aff0a9b0f3a9b1f6a9b2f8a9b310 -e2a9b56a5d6f326f4870647168726c73 -03eba9a9eea9aaefa9abf3a9ac04e4a9 -a1e5a9a2eea9a3f0a9a4f5a9a510e9a9 -8210efa9a610e2a9a86a4a6b4e6d586e -04e6a99be8a99ceba99deda99ef0a99f -10efa99501e7a996efa99701e7a998fa -a9996637665a675e686e6906ee0ceea9 -91f5a992f9a993faa994e6a98ee9a98f -eaa99010f2a98602e1a988e2a989eca9 -8a02e2a98be5a98cf7a98d613e636a64 -906502e2a983f7a984f8a98506ee0cee -a974f0a975f1a976f3a977e3a971e6a9 -72eba97305e809e8a97cefa97df5a97e -e1a979e5a97ae6a97b01e3a980f3a981 +39f229f509f5ab72f6ab78f7ab79f22c +f3ab6bf4ab6f22032aab254da4bf522a +5410d2ab2901cfab28d5ab26ecab4ded +ab52eeab59efab5ff16de429e438e5ab +35e7ab3ae9ab43ebab49032aab2f4432 +4b3a5312696ee4ab32126576e1ab3012 +686feaab317834793e7a48e1ab19e3ab +2401eeab7ff7ab8001ecab81f2a50b10 +ecab826cad724f725873747484758e77 +05e809e8ab79f0ab7df6ab7ee2ab7ae3 +ab7be7ab7c04e2ab68e3ab24eeab69f2 +ab6af8a5f002e4ab6ce7ab6df9ab6e01 +ebab70f1ab7104e1ab73e5ab74ebab75 +f2ab76f3ab776c4a6d666e8c6fa24370 +03e4ab65ecab66f3ab67f9a77304e4ab +4ee9ab4fecab50efab49f9ab5105f009 +f0ab56f1ab57f3ab58e1ab53eaab54ee +ab5504e3ab5aebab5bf0ab5cf8ab5df9 +ab5e04e7ab60ebab61f1ab62f5ab63f9 +ab64673e67426858696e6a846b02e3ab +4af2ab4bf3ab4c03e1ab3bf3ab3cf7ab +3dfaab3e03e9ab3febab40eeab41f5ab +4203e4ab44e7ab45ecab46edab4710f2 +ab48614a6276638664a26b6503e6ab36 +e8ab37e9ab38f3ab3906f30cf3ab1df4 +ab1ef6ab1ffaab20e6ab1ae8ab1bf1ab +1c02e1ab21e5ab22f0ab2306ee0ceeab +2cefab2df2a5fef3ab2ee32cebab2aec +ab2b22055211522e53325410d2ab2910 +cfab2810d5ab262aab25312a4d10c5ab +271137b2ab2601e3ab33e8ab3400166e +63752bec09eca9e5f3a9d6f4a9f1754c +7750e1012a2e41127261e2a9ce012aa9 +cd5010cba9ce10f5a9f310e1a9f47217 +722e733e7410f0a9f202e1a9ede4a9ee +e7a9ef10f3a9f06e346f4a7001e1a387 +efa9ec03e2a7c5e7a9e8eea9e9f4a9ea +10eea9eb66306b176b2e6c386d10f3a9 +e701e1a9e3efa9e401e1a9e6f4a92866 +3468386901eca9e1f0a9e210eca9de01 +eca9dfeea9e0614e627e638864926504 +e4a9dbefa9dcf2a56ff3a56ff8a9dd04 +e7a9cfec32eda9d2f0a9d3f5a9d4012a +a9d05012686cf0a9d101e9a9d5f5a9d6 +01e4a9d7eda9d801e3a9d9f4a9da0175 +26f5a9f502e3a9f6e7a9f7faa9f50014 +6f457917ef09efa945f5ab12f7ab1579 +2cedab05eeab0a10f5ab186f3c724c74 +5075547701ebab16efab1702e2ab0de6 +ab0eefab0f10efab1010edab1102e5ab +13e7ab14eda9456934693c6a566b5a6d +5e6e01e1ab0be7ab0c01e1ab00e62201 +2aab014e10ccab0210f3ab0310f4ab04 +03e6ab06efab07f4ab08f5ab09613663 +46654a675a6810e7a9ff02e9a9f8eaa9 +5aefa9f910e6a9fa02eaa9fbeca9fcf3 +a9fd10eea9fe6da2576ea6446f0b741d +ed09eda5a0f2a9c5f3a9c8742a7a34e3 +a9bd01e1a9caeba9cb10eda9cc701770 +2e72327310e1a9c910eda9c402efa9c6 +f5a9c7f9a9c5673a6b3e6e02e7a9c1ee +a9c2f3a9c310e3a9be01f2a9bff6a9c0 +0022749fe926ef0fefa945f2a950f3a4 +92f4a954f9a3cee9a904eba7feeca93a +ee012abaab4d126f6ee7a53f783d7834 +793e7a64e7a928e8a92e01e3a963eda9 +6405f709f7a968f8a969faa96aeba965 +eda966f6a96705f009f0a96ef7a96ffa +a970eba96beda96ceea96d7444755a76 +707703eba960f2a536f6a961f7a96203 +e3a955e6a956e9a957f2a95803e1a959 +f0a95af2a95bf3a95c02e1a95deea95e +f9a95f69856e446e426f5e707a719072 +02e4a951eaa952efa95304e1a941e6a9 +42e9a943ebb603f7a94404e1a946e5a9 +47e8a948f3a949f8a94a03f0a94bf3a9 +4cf4a94df8a94e10eca94f693e6b686c +7e6d02efa93ef5a93ff8a94003e6a931 +eea932f326f7a935012aa9334d126564 +e6a93403e9a936eca937f0a938f7a939 +02e5a93bf0a93cf3a93d6549653e666a +67866802e9a92feca930f2a3ff06ee0c +eea91ff2a920f4a921f5a922e4a91ce5 +a91deba91e04e1a923e5a924eea925ef +a926f1a92704e8a929eca92aefa92bf0 +a92cf9a92d615e62a25663a2636406e8 +0ce8a918eaa919f2a91af8a91be1a915 +e5a916e6a9170bee23f718f7a906f926 +faa90a22022aa907432a4910c4a90910 +c3a908eeb414efa904f3a905e709e7a9 +01e9a902eba903e3a7fee4a7ffe6a900 +04e8a90befa90cf1a90df5a90ef7a90f +04e9a910f0a911f1a912f2a913f5a914 +0021745fe41dee0feea99befa9a1f2a9 +a8f6a9b5f9a9b9e4a980e5a983e7a988 +eca54b791579307a3ae1a971e2a97901 +eda9baeea9bb10e9a9bc74387542775e +7801f1a9b7f2a9b801eda9aef2a9af04 +e9a9b0f0a9b1f3a9b2f6a9b3f8a9b410 +e2a9b66a5d6f326f4870647168726c73 +03eba9aaeea9abefa9acf3a9ad04e4a9 +a2e5a9a3eea9a4f0a9a5f5a9a610e9a9 +8310efa9a710e2a9a96a4a6b4e6d586e +04e6a99ce8a99deba99eeda99ff0a9a0 +10efa99601e7a997efa99801e7a999fa +a99a6637665a675e686e6906ee0ceea9 +92f5a993f9a994faa995e6a98fe9a990 +eaa99110f2a98702e1a989e2a98aeca9 +8b02e2a98ce5a98df7a98e613e636a64 +906502e2a984f7a985f8a98606ee0cee +a975f0a976f1a977f3a978e3a972e6a9 +73eba97405e809e8a97defa97ef5a97f +e1a97ae5a97be6a97c01e3a981f3a982 66c73c69c48269a4166aa4c46ba60e6c -001b744ae717ef0cefa7ebf4a7f3f5a7 -f5f6a7f9e7a7d5e9a7d7eea7e8771577 -307a34e1a7c0e2a7c710eca7fa01e8a7 -fbfaa7fc742e75327610f3a7f910e7a7 -f403e1a7f6efa7f7f9a3d4faa7f86a4a -6d316d326e426f4c7210e3a7f202eea7 -e5efa7e6f0a7e701f3a7e9f5a7ea05f2 -09f2a7eff3a7f0faa7f1eaa7eceba7ed -eca7ee6a346b386c01e5a7e3eea7e410 -f0a7e001e9a7e1f4a7e26448646c6570 -679c6906e70ce7a7dce8a7ddeaa7def3 -a7dfe1a7d8e4a7d9e6012aa7da4c1269 -6de2a7db10e2a7cd06f00cf0a7d1f1a7 -d2f5a7d3faa7d4e4a7cee5a7cfeda7d0 -10e7a7d66134625a6301eda7cbf0a7cc -05e809e8a7c4eaa7c5f3a7c6e2a7c1e4 -a7c2e7a7c302e5a7c8f5a7c9f7a7ca00 -197739eb17f30cf3a70bf4a723f5a717 -f7a724eba566eea71eefa720e409e4a7 -0de7a712e9a715772a7a34e1a70401ed -a725f3a72601e8a727e9a7286a366d17 -6d326e366f3a7210e9a72210efa71d10 -e8a71f10f5a7216a2e6b326c10efa71c -10eaa71604e5a717eba718f4a719f7a7 -1af8a71b641a643466446701e2a713e5 -a71402e4a70ee9a70ff5a71010e5a711 -613a62446302e1a70ae5a70be8a70c01 -eea705f2a70602e1a707e2a708f9a709 -0b721ae909e9a731f6a737f7a738722a -752ee1a72910e1a73510f4a736671767 -34693e6d01e3a733eca73401eba72fef -a73010e2a732612e62386510eea72e01 -e2a72aeda72b01efa72cf5a72d002875 -c0e4eb71f23cf628f6a78ef7a7aff902 -2a32414c4c126174eea7bc022aa7ba43 -2a5410d2a7bc10cea7bb127261e2a7bb -f2a781f3a79af5012aa45941127261e2 -a77ceb38eca771eda776eea780efa785 -012a2e41127261e2a76c042aa76a4132 -4336493a4d10cea76e10c6a76b10cea7 -6c10d2a76d7a187a38e1a5aee7a755e9 -a761eaa76502eaa543f2a7bff4a54375 -3c766e777e788e7901e5a7bdf8a7be07 -ed0ceda7a8eea7a9f0a7aaf3a7abe2a7 -a4e4a7a5e5a7a6eaa7a702e7a7acf2a7 -adf8a7ae02eaa7b0efa7b1f1a7b206ed -0ceda7b6f0a7b7f7a7b8faa7b9e1a7b3 -e3a7b4e5a7b56bc0cd7063704a717072 -8673a2457403e2a7a1eda7a2efa7a3f2 -a54305f209f2a78df6a78ef8a78fe5a7 -8ae6a78befa78c03e2a790e6a791f3a7 -92f9a79305ec09eca797f3a798f5a799 -e3a794e9a795eaa79605e809e8a79eea -a79ff2a7a0e2a79be4a79ce6a79d6b50 -6c5a6d706ea24f6f04e9a786eba783ec -a787f3a788faa78901e3a76feaa77003 -eea772f1a773f4a774f8a77506f21ef2 -32f3a77df5a77ef7a77f012a2e411272 -61e2a77c012aa77a4c10c2a77be2a777 -e8a778efa77904e3a781e6a782e7a755 -eea783f0a784665266486758686869a0 -6a03e4a766e7a767f3a768f9a76902ef -a752f2a753f9a75402e5a756e6a757f0 -a75808f10ff1a75cf3a75df4a75ef7a7 -5ffaa760e1a759e2a75aebac79eea75b -02eaa762f5a763f7a76461446276639c -64a2486502e1a74feea750faa75107e9 -0ce9a73deaa73eeda73fefa740e1a739 -e2a73ae3a73be4a73c05f109f1a744f8 -a745f9a746e4a741eda742f0a74303e7 -a747eba748eca749f4a74a03e5a74be8 -a74ceca74df4a74e66a2b567a46a6800 -137539f20ff2a5fdf4a700f5a701f9a3 -41faa7037536e13ae5a5e7e9a5e9efa5 -f910e9a70222032aa5dd372e43345310 -c4a5de1133b6a5de10cda5df6c386c3c -6d466e506f6c7301e2a5feeea5ff01e1 -a5f0f5a5f101e4a5f2f4a5f304e4a5f4 -e5a5f5eaa5f6eea5f7efa5f802e3a5fa -eaa5fbf4a5fc615862746478687c6905 -e809e8a5edeca5eeeda5efe1a5eae6a5 -ebe7a5ec04e7a5e0eba5e1eda5e2f7a5 -e3faa5e410e2a5e510f9a5e610f9a5e8 -00117553e90fe9a578eaa57cefa57ff2 -a585f9a59475427694e1a56ee6012aa5 -744112646ceda57509e80fe8a58ef1a5 -8ff2a590f6a591f9a592e2a58ae332e4 -a58be5a58ce6a58d012aa5744112646c -eda57510f2a5936d2f6d4e6f52706271 -667204e3a586e5a585f0a587f2a588f3 -a58910f0a57e02e4a580eea581f2a582 -10e5a58310f3a5846132665669606c10 -f2a57d05e908e9a572eea573f467e1a5 -6fe2a570e7a57101e9a576eda57702e1 -a579eca57af4a57b001a6e9f791dec0c -eca5baeea5bef5a5cef6a5d6792ce1a5 -95e4a5a701e1a5a0e9a5dc733a733e75 -4276747702e3a5d9e9a5daf4a5db10f7 -a5cd07f20cf2a5d2f7a5d3f8a5d4faa5 -d5e2a5cfe3a5d0e4a5d1e7a5be02e6a5 -d7f2a5b1f3a5d86e5a6f6a7204e2a5a3 -e332e5a559f4a5cbf7a5cc012aa5c94c -12696ee2a5ca02e4a5bfe7a5c0efa5c1 -07ee0ceea5c1f2a5c6f3a5c7f4a5c8e4 -a5c2e6a5c3e9a5c4eda5c567396a236a -386b486c526d01eda5bcf6a5bd02eba5 -b5eea5b6f5a5b701eea5b8f0a5b910eb -a5bb673468386901eca5b3eda5b410ee -a5b110f3a5b26428642e653e6610eba5 -b002e5a5a8eea5a9f2a5aa05ef09efa5 -aef2a52bfaa5afe2a5abeaa5aceca5ad -612e626c6310f2a5a609ed0feda59bee -a59cf7a59df9a59efaa59fe1a596e6a5 -97e7a598e8a599eaa59a05ef09efa5a3 -f9a5a4faa5a5e1a5a0e6a5a1eda5a263 +001b744ae717ef0cefa7ecf4a7f4f5a7 +f6f6a7fae7a7d6e9a7d8eea7e9771577 +307a34e1a7c1e2a7c810eca7fb01e8a7 +fcfaa7fd742e75327610f3a7fa10e7a7 +f503e1a7f7efa7f8f9a3d5faa7f96a4a +6d316d326e426f4c7210e3a7f302eea7 +e6efa7e7f0a7e801f3a7eaf5a7eb05f2 +09f2a7f0f3a7f1faa7f2eaa7edeba7ee +eca7ef6a346b386c01e5a7e4eea7e510 +f0a7e101e9a7e2f4a7e36448646c6570 +679c6906e70ce7a7dde8a7deeaa7dff3 +a7e0e1a7d9e4a7dae6012aa7db4c1269 +6de2a7dc10e2a7ce06f00cf0a7d2f1a7 +d3f5a7d4faa7d5e4a7cfe5a7d0eda7d1 +10e7a7d76134625a6301eda7ccf0a7cd +05e809e8a7c5eaa7c6f3a7c7e2a7c2e4 +a7c3e7a7c402e5a7c9f5a7caf7a7cb00 +197739eb17f30cf3a70cf4a724f5a718 +f7a725eba567eea71fefa721e409e4a7 +0ee7a713e9a716772a7a34e1a70501ed +a726f3a72701e8a728e9a7296a366d17 +6d326e366f3a7210e9a72310efa71e10 +e8a72010f5a7226a2e6b326c10efa71d +10eaa71704e5a718eba719f4a71af7a7 +1bf8a71c641a643466446701e2a714e5 +a71502e4a70fe9a710f5a71110e5a712 +613a62446302e1a70be5a70ce8a70d01 +eea706f2a70702e1a708e2a709f9a70a +0b721ae909e9a732f6a738f7a739722a +752ee1a72a10e1a73610f4a737671767 +34693e6d01e3a734eca73501eba730ef +a73110e2a733612e62386510eea72f01 +e2a72beda72c01efa72df5a72e002875 +c0e4eb71f23cf628f6a78ff7a7b0f902 +2a32414c4c126174eea7bd022aa7bb43 +2a5410d2a7bd10cea7bc127261e2a7bc +f2a782f3a79bf5012aa45941127261e2 +a77deb38eca772eda777eea781efa786 +012a2e41127261e2a76d042aa76b4132 +4336493a4d10cea76f10c6a76c10cea7 +6d10d2a76e7a187a38e1a5afe7a756e9 +a762eaa76602eaa544f2a7c0f4a54475 +3c766e777e788e7901e5a7bef8a7bf07 +ed0ceda7a9eea7aaf0a7abf3a7ace2a7 +a5e4a7a6e5a7a7eaa7a802e7a7adf2a7 +aef8a7af02eaa7b1efa7b2f1a7b306ed +0ceda7b7f0a7b8f7a7b9faa7bae1a7b4 +e3a7b5e5a7b66bc0cd7063704a717072 +8673a2457403e2a7a2eda7a3efa7a4f2 +a54405f209f2a78ef6a78ff8a790e5a7 +8be6a78cefa78d03e2a791e6a792f3a7 +93f9a79405ec09eca798f3a799f5a79a +e3a795e9a796eaa79705e809e8a79fea +a7a0f2a7a1e2a79ce4a79de6a79e6b50 +6c5a6d706ea24f6f04e9a787eba784ec +a788f3a789faa78a01e3a770eaa77103 +eea773f1a774f4a775f8a77606f21ef2 +32f3a77ef5a77ff7a780012a2e411272 +61e2a77d012aa77b4c10c2a77ce2a778 +e8a779efa77a04e3a782e6a783e7a756 +eea784f0a785665266486758686869a0 +6a03e4a767e7a768f3a769f9a76a02ef +a753f2a754f9a75502e5a757e6a758f0 +a75908f10ff1a75df3a75ef4a75ff7a7 +60faa761e1a75ae2a75bebac79eea75c +02eaa763f5a764f7a76561446276639c +64a2486502e1a750eea751faa75207e9 +0ce9a73eeaa73feda740efa741e1a73a +e2a73be3a73ce4a73d05f109f1a745f8 +a746f9a747e4a742eda743f0a74403e7 +a748eba749eca74af4a74b03e5a74ce8 +a74deca74ef4a74f66a2b567a46a6800 +137539f20ff2a5fef4a701f5a702f9a3 +41faa7047536e13ae5a5e8e9a5eaefa5 +fa10e9a70322032aa5de372e43345310 +c4a5df1133b6a5df10cda5e06c386c3c +6d466e506f6c7301e2a5ffeea70001e1 +a5f1f5a5f201e4a5f3f4a5f404e4a5f5 +e5a5f6eaa5f7eea5f8efa5f902e3a5fb +eaa5fcf4a5fd615862746478687c6905 +e809e8a5eeeca5efeda5f0e1a5ebe6a5 +ece7a5ed04e7a5e1eba5e2eda5e3f7a5 +e4faa5e510e2a5e610f9a5e710f9a5e9 +00117553e90fe9a579eaa57defa580f2 +a586f9a59575427694e1a56fe6012aa5 +754112646ceda57609e80fe8a58ff1a5 +90f2a591f6a592f9a593e2a58be332e4 +a58ce5a58de6a58e012aa5754112646c +eda57610f2a5946d2f6d4e6f52706271 +667204e3a587e5a586f0a588f2a589f3 +a58a10f0a57f02e4a581eea582f2a583 +10e5a58410f3a5856132665669606c10 +f2a57e05e908e9a573eea574f467e1a5 +70e2a571e7a57201e9a577eda57802e1 +a57aeca57bf4a57c001a6e9f791dec0c +eca5bbeea5bff5a5cff6a5d7792ce1a5 +96e4a5a801e1a5a1e9a5dd733a733e75 +4276747702e3a5dae9a5dbf4a5dc10f7 +a5ce07f20cf2a5d3f7a5d4f8a5d5faa5 +d6e2a5d0e3a5d1e4a5d2e7a5bf02e6a5 +d8f2a5b2f3a5d96e5a6f6a7204e2a5a4 +e332e5a55af4a5ccf7a5cd012aa5ca4c +12696ee2a5cb02e4a5c0e7a5c1efa5c2 +07ee0ceea5c2f2a5c7f3a5c8f4a5c9e4 +a5c3e6a5c4e9a5c5eda5c667396a236a +386b486c526d01eda5bdf6a5be02eba5 +b6eea5b7f5a5b801eea5b9f0a5ba10eb +a5bc673468386901eca5b4eda5b510ee +a5b210f3a5b36428642e653e6610eba5 +b102e5a5a9eea5aaf2a5ab05ef09efa5 +aff2a52cfaa5b0e2a5aceaa5adeca5ae +612e626c6310f2a5a709ed0feda59cee +a59df7a59ef9a59ffaa5a0e1a597e6a5 +98e7a599e8a59aeaa59b05ef09efa5a4 +f9a5a5faa5a6e1a5a1e6a5a2eda5a363 c2e863a29d64a4f2650011772dee19ee -38efa562f3a564f4a557f5a364012aa5 -5e53126861f7a55f77307834e5a552ec -a55910efa56c10f4a56d6d466d486e7a -728473887403f2a568f4a569f5a56af8 -a56b02e1a55ae9a55beb012a2e4e126b -6fefa55d012aa55c4710cea55d01eea5 -60f1a56110e9a56302e7a565eba566f5 -a567623e664267466b02e1a556eba557 -f9a55810f5a55110e9a55301eca554f9 -a555001a725ce821f316f3a517f52cf6 -a51df9a51e012aa51b47126c61e7a51c -e8a3e9efa50df2a510771277307a34e1 -a3e0e5a3e510e4a51010e5a517722e73 -547410e4a51a05ec09eca514eda515f3 -a516e8a511eaa512eba51301e2a518f7 -a51968c0ce6c306c326d3c6f6c7010f3 -a50f01e1a509e4a50a02e5a50be7a50c -ee022aa24a42a29b4811616e01e2a3fc -f4a3f710f0a50e68426aa28d6b03e2a5 -05eca506efa507f9a50805ef09efa3ff -f0a500f2a501e92ceba3fdeda3fe022a -3c42a25f4811616e01e2a3fcf4a3f70b -4d335417542e55385610c4a3fa01c8a3 -f6d7a3f701cba3f8d3a3f94d2e503853 -10d2a3f501cfa3f0d9a3f102c6a3f2c8 -a3f3daa3f4470e473048b4684910c4a3 -ef10c6a3ed2aa3ea412a4210cea3ec10 -d5a3eb126f70efa3fb02e1a502eda503 -f6a5046511652e66326710e7a3e810e2 -a3e610e1a3e7613462386301e8a3e3f0 -a3e410eea3e110eaa3e20016726f791c -e508e5a52bf6a54bfa45792a7a34e1a5 -1f01efa54ef5a54f10e7a550751d752e -764a7710f7a54d04e1a546e3a547e4a5 -48e7a549f4a54a10e1a54c7240737474 -03eda542f0a543f3a544f9a54502e82c -e9a53ff3a540012a2e4d126f6ee7a53e -012aa53d4310cea53e10e2a54167446a -1a6a406e446f03e2a53ae9a532f0a53b -f7a53c10e5a53810eaa5396734686069 -01e1a536f1a53706ec0ceca531efa532 -f2a533faa534e1a52ee8a52fe9a53010 -e4a535613c6268637264766501e4a52c -eea52d06e80ce8a523eba524f2a525f6 -a526e4a520e6a521e7a52201e4a527f1 -a52810e3a52910eea52a2aa4fa61be83 -62002373a5e51ded0feda3a7eea3acef -a3b0f2a3b9f3a3bee5a37ae7a387e8a3 -8be9a39277417732783c794c7a72e1a3 -6001e4a3d1f2a3d202e8a3d3eba3d4f2 -a3c605f309f3a3d8f6a3d9f8a3dae5a3 -d5eea3d6f2a3d704e1a3dbe5a3dce6a3 -dde8a3def7a3df7332744875587610e2 -a3d003eaa3bff1a3c0f3a3c1f4a3c202 -efa3c3f4a3c4f6a3c509ed0feda3cbef -a3ccf2a3cdf3a3cef5a3cfe1a3c6e3a3 -c7e4a3c8e7a3c9eba3ca6a7d6e3b6e48 -6f587068716c7203e1a3bae8a3bbf8a3 -bcfaa3bd02e7a3adeda3aef0a3af02ea -a3b1eda3b2eea3b310f9a3b403e3a3b5 -e9a3b6f0a3b7f6a3b86a466b786ca4a6 -6d03e8a3a8eba3a9f1a3aaf5a3ab07ef -0cefa39df2a39ef4a39ffaa3a0e8a399 -e9a39aeaa39beea39c04e3a3a1eda3a2 -f1a3a3f5a3a4f6a3a5656d6562669467 -a24468a24b6906ed0ceda395eea396ef -a397f1a398e2a393e7a394eba37307f4 -0cf4a37ff7a380f8a381faa382e6a37b -e8a37ceaa37deda37e03e4a383f1a384 -f4a385f9a38602e3a388eea389f8a38a -06eb0ceba38feca390efa38bf9a391e2 -a38ce7a38de9a38e6132626463906410 -e4a37907f20cf2a365f3a366f6a367f8 -a368eca361eea362f0a363f1a36406e4 -0ce4a36ceaa36df0a36ef2a36fe1a369 -e2a36ae3a36b09ed0feda374eea375ef -a376f1a377f5a378e3a361e6a370e8a3 -71e9a372eca37300184dc25d54c0c257 -2e5736584e59645a12616ee2adc00161 -2c631168efa99f1172e1adbf01702a73 -1175f8691165efa9db126969e9a71554 -3455a28756126169e9adbe056746674a -68506901622a7210e8adbd10f4012aa3 -b04210d445116ce7adba106101e158e9 -042aab9e43324b364c3a5410c8ab9e10 -cea7cc10c8adbb10c1adbc012aa54b4d -10d6a54b6130657c66116ee7adb9056d -116d2e6e327610f4a3a610ecab8210e7 -abd667346b386c01e5ab90f5a75a10e2 -adb710f2adb8116cf5ab93126761f2ab -e050c0c350a27252a2a8530669436942 -6f6a759079016c2a7210e3a50a10efad -b601643e6e01e4ab31e8012aab424c10 -cbab4210e4adb302672e72387910efa5 -0c01e4ab5fefadb410e1ab67116ee4ad -b5613e675e6801612a7210e4adb210f7 -a55f026d2e72327510f2ab1f10f2ab55 -10e2adb1116ef7a349046138654a6850 -6c76721174e9adae016c2a7510e3a51a -10ed9f1172edadac02612e6c326e10f8 -a9df10e7adad01e9a9cff0a9d01172e4 -a5f2026a306f3675116ef2a9a3116ee7 -adaf1168e7adb04d7c4ea2a44f036742 -6c48724e7301672a6d10e1adab10e5a9 -c81161edab3a1163ebadaa016b2a7910 -e1a9c410e8a9ca07722e725a74607566 -79116df2032aa3cd492e4d325410c8ad -a510cea75e10cda3cd116fefa9521165 -e9ada3116cf4ada4614265746c9a6f01 -642a6e10e7a53e10e9ada20368326b36 -6e3a7210e3ad9e10eaad9b10e1ad9c01 -e4a969e9ad9d0264346e387201e3ada0 -efada110e6a93310e4ad9f1179eda939 -046138624c65506b56731168f5ada901 -6e2a7210e2ada710e4ada61161f49d11 -77e1ada8116fefa55d47c40d4ac3214a +38efa563f3a565f4a558f5a365012aa5 +5f53126861f7a56077307834e5a553ec +a55a10efa56d10f4a56e6d466d486e7a +728473887403f2a569f4a56af5a56bf8 +a56c02e1a55be9a55ceb012a2e4e126b +6fefa55e012aa55d4710cea55e01eea5 +61f1a56210e9a56402e7a566eba567f5 +a568623e664267466b02e1a557eba558 +f9a55910f5a55210e9a55401eca555f9 +a556001a725ce821f316f3a518f52cf6 +a51ef9a51f012aa51c47126c61e7a51d +e8a3eaefa50ef2a511771277307a34e1 +a3e1e5a3e610e4a51110e5a518722e73 +547410e4a51b05ec09eca515eda516f3 +a517e8a512eaa513eba51401e2a519f7 +a51a68c0ce6c306c326d3c6f6c7010f3 +a51001e1a50ae4a50b02e5a50ce7a50d +ee022aa24a42a29b4811616e01e2a3fd +f4a3f810f0a50f68426aa28d6b03e2a5 +06eca507efa508f9a50905ef09efa500 +f0a501f2a502e92ceba3feeda3ff022a +3c42a25f4811616e01e2a3fdf4a3f80b +4d335417542e55385610c4a3fb01c8a3 +f7d7a3f801cba3f9d3a3fa4d2e503853 +10d2a3f601cfa3f1d9a3f202c6a3f3c8 +a3f4daa3f5470e473048b4684910c4a3 +f010c6a3ee2aa3eb412a4210cea3ed10 +d5a3ec126f70efa3fc02e1a503eda504 +f6a5056511652e66326710e7a3e910e2 +a3e710e1a3e8613462386301e8a3e4f0 +a3e510eea3e210eaa3e30016726f791c +e508e5a52cf6a54cfa45792a7a34e1a5 +2001efa54ff5a55010e7a551751d752e +764a7710f7a54e04e1a547e3a548e4a5 +49e7a54af4a54b10e1a54d7240737474 +03eda543f0a544f3a545f9a54602e82c +e9a540f3a541012a2e4d126f6ee7a53f +012aa53e4310cea53f10e2a54267446a +1a6a406e446f03e2a53be9a533f0a53c +f7a53d10e5a53910eaa53a6734686069 +01e1a537f1a53806ec0ceca532efa533 +f2a534faa535e1a52fe8a530e9a53110 +e4a536613c6268637264766501e4a52d +eea52e06e80ce8a524eba525f2a526f6 +a527e4a521e6a522e7a52301e4a528f1 +a52910e3a52a10eea52b2aa4fa61be83 +62002373a5e51ded0feda3a8eea3adef +a3b1f2a3baf3a3bfe5a37be7a388e8a3 +8ce9a39377417732783c794c7a72e1a3 +6101e4a3d2f2a3d302e8a3d4eba3d5f2 +a3c705f309f3a3d9f6a3daf8a3dbe5a3 +d6eea3d7f2a3d804e1a3dce5a3dde6a3 +dee8a3dff7a3e07332744875587610e2 +a3d103eaa3c0f1a3c1f3a3c2f4a3c302 +efa3c4f4a3c5f6a3c609ed0feda3ccef +a3cdf2a3cef3a3cff5a3d0e1a3c7e3a3 +c8e4a3c9e7a3caeba3cb6a7d6e3b6e48 +6f587068716c7203e1a3bbe8a3bcf8a3 +bdfaa3be02e7a3aeeda3aff0a3b002ea +a3b2eda3b3eea3b410f9a3b503e3a3b6 +e9a3b7f0a3b8f6a3b96a466b786ca4a6 +6d03e8a3a9eba3aaf1a3abf5a3ac07ef +0cefa39ef2a39ff4a3a0faa3a1e8a39a +e9a39beaa39ceea39d04e3a3a2eda3a3 +f1a3a4f5a3a5f6a3a6656d6562669467 +a24468a24b6906ed0ceda396eea397ef +a398f1a399e2a394e7a395eba37407f4 +0cf4a380f7a381f8a382faa383e6a37c +e8a37deaa37eeda37f03e4a384f1a385 +f4a386f9a38702e3a389eea38af8a38b +06eb0ceba390eca391efa38cf9a392e2 +a38de7a38ee9a38f6132626463906410 +e4a37a07f20cf2a366f3a367f6a368f8 +a369eca362eea363f0a364f1a36506e4 +0ce4a36deaa36ef0a36ff2a370e1a36a +e2a36be3a36c09ed0feda375eea376ef +a377f1a378f5a379e3a362e6a371e8a3 +72e9a373eca37400184dc25d54c0c257 +2e5736584e59645a12616ee2adc10161 +2c631168efa9a01172e1adc001702a73 +1175f8691165efa9dc126969e9a71654 +3455a28756126169e9adbf056746674a +68506901622a7210e8adbe10f4012aa3 +b14210d445116ce7adbb106101e158e9 +042aab9f43324b364c3a5410c8ab9f10 +cea7cd10c8adbc10c1adbd012aa54c4d +10d6a54c6130657c66116ee7adba056d +116d2e6e327610f4a3a710ecab8310e7 +abd767346b386c01e5ab91f5a75b10e2 +adb810f2adb9116cf5ab94126761f2ab +e150c0c350a27252a2a8530669436942 +6f6a759079016c2a7210e3a50b10efad +b701643e6e01e4ab32e8012aab434c10 +cbab4310e4adb402672e72387910efa5 +0d01e4ab60efadb510e1ab68116ee4ad +b6613e675e6801612a7210e4adb310f7 +a560026d2e72327510f2ab2010f2ab56 +10e2adb2116ef7a34a046138654a6850 +6c76721174e9adaf016c2a7510e3a51b +10ed9f1172edadad02612e6c326e10f8 +a9e010e7adae01e9a9d0f0a9d11172e4 +a5f3026a306f3675116ef2a9a4116ee7 +adb01168e7adb14d7c4ea2a44f036742 +6c48724e7301672a6d10e1adac10e5a9 +c91161edab3b1163ebadab016b2a7910 +e1a9c510e8a9cb07722e725a74607566 +79116df2032aa3ce492e4d325410c8ad +a610cea75f10cda3ce116fefa9531165 +e9ada4116cf4ada5614265746c9a6f01 +642a6e10e7a53f10e9ada30368326b36 +6e3a7210e3ad9f10eaad9c10e1ad9d01 +e4a96ae9ad9e0264346e387201e3ada1 +efada210e6a93410e4ada01179eda93a +046138624c65506b56731168f5adaa01 +6e2a7210e2ada810e4ada71161f49d11 +77e1ada9116fefa55e47c40d4ac3214a a6ba4ba6d34c03614665a69669a69879 -01632a6410e9ad9a10e9ad99026ea673 +01632a6410e9ad9b10e9ad9a026ea673 6fa6747410ee001a4bc139545b571457 -ac5458ac5859305a01c1abe8d7ab5810 -d4ad5b544055825603c1ad56c5ad58ce -ad57d5a3920bce14d609d6abd2d7abbf -daab78cead97cfabb5d2abbdcbc5b8cb -abaaccad52cdaba904c1ad98c7ad54d3 -a55ed9ad55daabec4e824e8a50a24a52 -a26d530cce17d40cd4ad4cd5a797d6ad -4dd9ad96cead4acfab5ed2ad4bca09ca -ad48cbab48cdad49c3ad47c5ab77c9ab -4c06c70cc7abe4c9ad3acca54acfa978 -c1ad37c3ad38c5ad390acc14d409d4ad -43d7a9d3d9a5becca9e4cdad40d2ad41 -c1ad3cc5ad3dc6ad3ec7abb9c8a57a03 -c5ad46cfa944d5a797d7ab144b9e4ca2 -434d0010cd1dd40fd4a953d5a923d8ab -e6d9a906daad36cda73bcfad94d1ad34 -d2ad95c60cc6ad33c7a927cbad93cca3 -a7c1ad92c3ad31c4ad32c5ab2601c5ad -26cdad9104c9ad2cd3ad2dd4a7f3d5ad -2ed6a7f943bd465f464c475c48a24849 -04c3ad23c4a70dd2ad90d3a70bd4a723 -02c9a578cfa57fd2a5850cce17d30cd3 -ad1ed4ad1fd5abebd7ad20cead1bd0ad -1cd1ad1dc608c6ad1ac867cca771c1ad -19c2abeec5ad8f04cdad21cead22d2a5 -fdd4a700d5a701435244a2424505d309 -d3a564d4ad89daad18c1ad14c3ad15c5 -a5570fcf1ad60cd6ad0fd7abf0d9ad8d -daa517cfad0cd0ad0dd2ad0ed5abe9c9 -c676c9ad09ccad0acdad0bcead8c05cb -09cba51fcfad12daad8ec5a52bc7ad45 -caad11345e34ae714178420bce14d209 -d2a9f0d5a73bd6ad05cead02cfad03d1 -ad04c909c9ab09caad00ccad01c1a3be -c5abfdc6abfe0cd217d50cd5abe5d7ab -fbd8abfcdaa35cd2abf8d3abf9d4abfa -cd09cdad8bcfabf6d1abf7c4abf3c6ad -8acc6d2aa55e312c321133b0ad891137 -b2a79710e1a9a110ef012aa7eb4c10c1 -a7eb1170e3a7d1026d2e6e327310f5a7 -df10e2a7db01e1a7c1e2a5ca01613a70 -1161ee012aa7294a10d0a729016d2a76 -10e1ad8610efad85046138684c6e7a6f -80741168e9ad88016c2a6e10e1ad8710 -e9a55802612e6d326f10eaab3010f2a9 -ec10f2012aa7764b10c8a7761164e1a7 -801172e5012aa7854b01d0ad28d2a785 -473448a25c49127461eca5690465466c -5a6f60727a75016a2a7210f5a9cc10f2 -a5ce116ff2012aa5ae4710c5a5ae1161 -e7a51c016e2a7410e8a5c801e7ad79ed -a5650161506510eb032aa559432e4732 -5410d2a38a10d9ad1010d2a55910eead -7a056c186c306d3675116ee7ad841175 -f7a5f1106e01e7a5f6f0a9616130659c -691172e1ad83016e2a7410f2a93205ef -24efad7df34cf4032aa3f7482e4d3254 -10d7a3f710cba3ee10cfa3f0012aa3ea -4310cea3eae2a3fce7ad7be9ad7c1162 -f2054917493a533e5502c1ad81cbad7f -d3ad8210cca5e710c5ad802aa5e7432a -4710c2ad7f10c1ad7e43c0f9437044a2 +ac5458ac5859305a01c1abe9d7ab5910 +d4ad5c544055825603c1ad57c5ad59ce +ad58d5a3930bce14d609d6abd3d7abc0 +daab79cead98cfabb6d2abbecbc5b8cb +ababccad53cdabaa04c1ad99c7ad55d3 +a55fd9ad56daabed4e824e8a50a24a52 +a26d530cce17d40cd4ad4dd5a798d6ad +4ed9ad97cead4bcfab5fd2ad4cca09ca +ad49cbab49cdad4ac3ad48c5ab78c9ab +4d06c70cc7abe5c9ad3bcca54bcfa979 +c1ad38c3ad39c5ad3a0acc14d409d4ad +44d7a9d4d9a5bfcca9e5cdad41d2ad42 +c1ad3dc5ad3ec6ad3fc7abbac8a57b03 +c5ad47cfa945d5a798d7ab154b9e4ca2 +434d0010cd1dd40fd4a954d5a924d8ab +e7d9a907daad37cda73ccfad95d1ad35 +d2ad96c60cc6ad34c7a928cbad94cca3 +a8c1ad93c3ad32c4ad33c5ab2701c5ad +27cdad9204c9ad2dd3ad2ed4a7f4d5ad +2fd6a7fa43bd465f464c475c48a24849 +04c3ad24c4a70ed2ad91d3a70cd4a724 +02c9a579cfa580d2a5860cce17d30cd3 +ad1fd4ad20d5abecd7ad21cead1cd0ad +1dd1ad1ec608c6ad1bc867cca772c1ad +1ac2abefc5ad9004cdad22cead23d2a5 +fed4a701d5a702435244a2424505d309 +d3a565d4ad8adaad19c1ad15c3ad16c5 +a5580fcf1ad60cd6ad10d7abf1d9ad8e +daa518cfad0dd0ad0ed2ad0fd5abeac9 +c676c9ad0accad0bcdad0ccead8d05cb +09cba520cfad13daad8fc5a52cc7ad46 +caad12345e34ae714178420bce14d209 +d2a9f1d5a73cd6ad06cead03cfad04d1 +ad05c909c9ab0acaad01ccad02c1a3bf +c5abfec6abff0cd217d50cd5abe6d7ab +fcd8abfddaa35dd2abf9d3abfad4abfb +cd09cdad8ccfabf7d1abf8c4abf4c6ad +8bcc6d2aa55f312c321133b0ad8a1137 +b2a79810e1a9a210ef012aa7ec4c10c1 +a7ec1170e3a7d2026d2e6e327310f5a7 +e010e2a7dc01e1a7c2e2a5cb01613a70 +1161ee012aa72a4a10d0a72a016d2a76 +10e1ad8710efad86046138684c6e7a6f +80741168e9ad89016c2a6e10e1ad8810 +e9a55902612e6d326f10eaab3110f2a9 +ed10f2012aa7774b10c8a7771164e1a7 +811172e5012aa7864b01d0ad29d2a786 +473448a25c49127461eca56a0465466c +5a6f60727a75016a2a7210f5a9cd10f2 +a5cf116ff2012aa5af4710c5a5af1161 +e7a51d016e2a7410e8a5c901e7ad7aed +a5660161506510eb032aa55a432e4732 +5410d2a38b10d9ad1110d2a55a10eead +7b056c186c306d3675116ee7ad851175 +f7a5f2106e01e7a5f7f0a9626130659c +691172e1ad84016e2a7410f2a93305ef +24efad7ef34cf4032aa3f8482e4d3254 +10d7a3f810cba3ef10cfa3f1012aa3eb +4310cea3ebe2a3fde7ad7ce9ad7d1162 +f2054917493a533e5502c1ad82cbad80 +d3ad8310cca5e810c5ad812aa5e8432a +4710c2ad8010c1ad7f43c0f9437044a2 b9450267406c46741168e9012a754501 -d2ad17d4751179f0a55501622a7910ed -ad7810e1ad770461a26868a2776fa280 +d2ad18d4751179f0a55601622a7910ed +ad7910e1ad780461a26868a2776fa280 70a282791172ec0a4d335414542e5538 -5810cbad7101caab99d2ad7010c1abe1 -4d2e523e5310cbad6f02c4ad6dcba7fd -cea53d02cfad6ed3ab24d5ab112aab11 -4138423c474c4b01c7a7badaad2a10cc -ad6a02c1ad6bc7a387d9a37a01c52dd2 -ad6c026b2e6e327210e9ad6910eda3e4 -10f3a51001612a6510f2a50110eda503 -1170f4a50e1172f4a5c90265306f8275 -1170ecad761176e106491749324d364e -3a5010cba3c510cea5e910d5ad7410d0 -a9822aa5e9422a4610caad7310d4ad72 -1167f2ad752aa25441aa3142056f1f6f -3e72447501672a6810e4ad6810e9ad67 -1170efa3fb106101e8a9e2e9ad666130 -655c68116bf3ad65036c326d36733a74 -10ebad6410e9ad6310f5a36810f3a3c0 -116ee7012aa3ac4210c4a3ac00214ac1 +5810cbad7201caab9ad2ad7110c1abe2 +4d2e523e5310cbad7002c4ad6ecba7fe +cea53e02cfad6fd3ab25d5ab122aab12 +4138423c474c4b01c7a7bbdaad2b10cc +ad6b02c1ad6cc7a388d9a37b01c52dd2 +ad6d026b2e6e327210e9ad6a10eda3e5 +10f3a51101612a6510f2a50210eda504 +1170f4a50f1172f4a5ca0265306f8275 +1170ecad771176e106491749324d364e +3a5010cba3c610cea5ea10d5ad7510d0 +a9832aa5ea422a4610caad7410d4ad73 +1167f2ad762aa25441aa3142056f1f6f +3e72447501672a6810e4ad6910e9ad68 +1170efa3fc106101e8a9e3e9ad676130 +655c68116bf3ad66036c326d36733a74 +10ebad6510e9ad6410f5a36910f3a3c1 +116ee7012aa3ad4210c4a3ad00214ac1 c052c0cc5638563c5758586259665a01 -d2abe7d7ab5804c1ad56c4ad57c5ad58 -cead57d5a39201c6ad59d3ab5110cbad -5a03c4abf2c5abf2d4ad5bd5ab245246 -536c54a2575503c1abe1c7ad54d9ad55 -daabec05d309d3ab24d5ab11d7ab14c5 -ad46c8ab58cfa9440ecd1ad40cd4ad4c -d5ab11d6ad4dd9ad4ecdad49cead4acf -ab5ed2ad4bc50cc5ab77c9ab4ccaad48 -cbab48c1abedc3ad47c4abf10ecd1ad2 -0cd2abbdd6abd2d7a3f7daab78cdaba9 -cead53cfabb5d0ad52c80cc8ab9ecaab -99cbabaaccad52c4ad4fc6ad50c7ad51 -4e644e404fa89650785102c1ad44cfad -45d5abee09cc0fcca54acfa978d0a982 -d1abf7d4abedc1ad37c3ad38c5ad39c8 -a392c9ad3a0dcd17d40cd4ad43d7a9d3 -d9a5bedaad3ccdad40d2ad41d3ad42c7 -0cc7abb9c8a57acbad3fcca9e4c1ad3c -c5ad3dc6ad3e4aa2484ba24c4ca2644d -0012ce20d50fd5a923d6a54bd8abe6d9 -a906daad36cea53dcfa3f0d1ad34d2ad -35d4a953c60fc6ad33c7a927cba7fdcc -a3a7cda3cdc1ad30c3ad31c4ad32c5ab -2601cfad25d0a72907d00cd0ad28d2a7 -85d7ad29daad2ac5ad26c7a7bac8a776 -cdad2708d30fd3ad2dd4a7f3d5ad2ed6 -a7f9d9ad2fc1a7ebc2ad2bc9ad2ccbab -4241c1604598456a46a24147a24e48a2 -754907d10cd1ad24d2a56ed3a70bd4a7 -23c3ad23c4a70dcca5e7cea5e909d20e -d2ad17d3a564d475d5abeedaad18c1ad -14c3ad15c5a557c799c8ad1604c9a578 -cfa57fd1abf7d2a585d8a5850bd014d3 -09d3ad1ed4ad1fd7ad20d0ad1cd1ad1d -d2a559c808c867cca771cead1bc1ad19 -c5a5aec6ad1a06d20cd2a5fdd4a700d5 -a701d6abfecba3eecdad21cead22415e -42a24c43a2834406cb0ccba51fcfad12 -d9ad00daad13c4a52bc5a52bcaad110d -d117d40cd4abfad7abfbd8abfcdaa35c -d1abf7d2abf8d3abf9cc0bcc6dcda341 -ceabf0cfabf6c4abf3c5abf4c6abf500 -10cc1cd20ed2a9f0d445d5a3cdd6ad05 -d9a37accad01cead02cfad03d1ad04c7 -0cc7a387c8abffc9ab09caad00c1a3be -c4a3acc5abfdc6abfe0010cf1dd50fd5 -abe9d6ad0fd7abf0d9ad10daa517cfad -0cd0ad0dd2ad0ed3ab24c90cc9ad09cc -ad0acdad0bcea3eac4abe7c6ad06c7ad -07c8ad08342234423548374e3801382a -3910b0ab2410b6abf21131b9abef1133 -b2abf01133b6abf12aa55e305031a26b -3202302e33383810b0a52b01b0a517b2 -abe410b0750533233334354a3601b1ab -51b2a5e903b0a3eab4a5e9b5a70db9a7 -2302b3abe5b4abeab7abeb3034314a32 -01b1a55eb9abe903b2abe4b3a55eb5a9 -f0b9abe506b50bb599b7abe7b8abe8b9 -a55eb1abe4b3abe6b4ab7802342e353e -3710b2ab1102b2a3eab3abecb5abed03 -b0ab11b1ab11b4abeeb5a52b04643667 -3c68427246761173f44b116ceda57511 -68e2ad5c116fed6301613c6d01e99bee +d2abe8d7ab5904c1ad57c4ad58c5ad59 +cead58d5a39301c6ad5ad3ab5210cbad +5b03c4abf3c5abf3d4ad5cd5ab255246 +536c54a2575503c1abe2c7ad55d9ad56 +daabed05d309d3ab25d5ab12d7ab15c5 +ad47c8ab59cfa9450ecd1ad40cd4ad4d +d5ab12d6ad4ed9ad4fcdad4acead4bcf +ab5fd2ad4cc50cc5ab78c9ab4dcaad49 +cbab49c1abeec3ad48c4abf20ecd1ad2 +0cd2abbed6abd3d7a3f8daab79cdabaa +cead54cfabb6d0ad53c80cc8ab9fcaab +9acbababccad53c4ad50c6ad51c7ad52 +4e644e404fa89650785102c1ad45cfad +46d5abef09cc0fcca54bcfa979d0a983 +d1abf8d4abeec1ad38c3ad39c5ad3ac8 +a393c9ad3b0dcd17d40cd4ad44d7a9d4 +d9a5bfdaad3dcdad41d2ad42d3ad43c7 +0cc7abbac8a57bcbad40cca9e5c1ad3d +c5ad3ec6ad3f4aa2484ba24c4ca2644d +0012ce20d50fd5a924d6a54cd8abe7d9 +a907daad37cea53ecfa3f1d1ad35d2ad +36d4a954c60fc6ad34c7a928cba7fecc +a3a8cda3cec1ad31c3ad32c4ad33c5ab +2701cfad26d0a72a07d00cd0ad29d2a7 +86d7ad2adaad2bc5ad27c7a7bbc8a777 +cdad2808d30fd3ad2ed4a7f4d5ad2fd6 +a7fad9ad30c1a7ecc2ad2cc9ad2dcbab +4341c1604598456a46a24147a24e48a2 +754907d10cd1ad25d2a56fd3a70cd4a7 +24c3ad24c4a70ecca5e8cea5ea09d20e +d2ad18d3a565d475d5abefdaad19c1ad +15c3ad16c5a558c799c8ad1704c9a579 +cfa580d1abf8d2a586d8a5860bd014d3 +09d3ad1fd4ad20d7ad21d0ad1dd1ad1e +d2a55ac808c867cca772cead1cc1ad1a +c5a5afc6ad1b06d20cd2a5fed4a701d5 +a702d6abffcba3efcdad22cead23415e +42a24c43a2834406cb0ccba520cfad13 +d9ad01daad14c4a52cc5a52ccaad120d +d117d40cd4abfbd7abfcd8abfddaa35d +d1abf8d2abf9d3abfacc0bcc6dcda341 +ceabf1cfabf7c4abf4c5abf5c6abf600 +10cc1cd20ed2a9f1d445d5a3ced6ad06 +d9a37bccad02cead03cfad04d1ad05c7 +0cc7a388c8ad00c9ab0acaad01c1a3bf +c4a3adc5abfec6abff0010cf1dd50fd5 +abead6ad10d7abf1d9ad11daa518cfad +0dd0ad0ed2ad0fd3ab25c90cc9ad0acc +ad0bcdad0ccea3ebc4abe8c6ad07c7ad +08c8ad09342234423548374e3801382a +3910b0ab2510b6abf31131b9abf01133 +b2abf11133b6abf22aa55f305031a26b +3202302e33383810b0a52c01b0a518b2 +abe510b0750533233334354a3601b1ab +52b2a5ea03b0a3ebb4a5eab5a70eb9a7 +2402b3abe6b4abebb7abec3034314a32 +01b1a55fb9abea03b2abe5b3a55fb5a9 +f1b9abe606b50bb599b7abe8b8abe9b9 +a55fb1abe5b3abe7b4ab7902342e353e +3710b2ab1202b2a3ebb3abedb5abee03 +b0ab12b1ab12b4abefb5a52c04643667 +3c68427246761173f44b116ceda57611 +68e2ad5d116fed6301613c6d01e99bee 012aa3414110cda34110e200134c6251 -31513c53405450556a5901c5abf2d4ab -7910c1ad4402c1abedc4abf1d9ad4e04 -c78fc8a922caad61cead53d2ad6210cb -ad5d4c3c4d464e624f665001cbad3fd3 -ad4201c2ad2bd9ad2f04c1ad30cda9fe -cea76ed2ad35d5ad5f10c7ad6010cdad -3b452e4542474a494e4a644b02c8a502 -cdad27d7ad2901c799c8ad1610c2ad5d -03c4a908cead5ed1ad24d2a56e10cfad -252a994132423c43464410daad1301c5 -abf4c6abf501c8abffd5a9fe01c3a907 -ceabdd00207492e52bf221f299f3a347 -f6a351f9a35afa012a2e41127261e2a3 -5e022aa35c49985210d5a35fe54be651 +31513c53405450556a5901c5abf3d4ab +7a10c1ad4502c1abeec4abf2d9ad4f04 +c78fc8a923caad62cead54d2ad6310cb +ad5e4c3c4d464e624f665001cbad40d3 +ad4301c2ad2cd9ad3004c1ad31cda9ff +cea76fd2ad36d5ad6010c7ad6110cdad +3c452e4542474a494e4a644b02c8a503 +cdad28d7ad2a01c799c8ad1710c2ad5e +03c4a909cead5fd1ad25d2a56f10cfad +262a994132423c43464410daad1401c5 +abf5c6abf601c8ad00d5a9ff01c3a908 +ceabde00207492e52bf221f299f3a348 +f6a352f9a35bfa012a2e41127261e2a3 +5f022aa35d49985210d5a360e54be651 eb67ed757934792c7a36e125e22d01e2 -a35bf2a35a10ea012a2e41127261e2a3 -5e032aa35c312e49345310d5a35f1137 -b2a35f01d1a35dd2a35e744475547658 -7703e1a356e2a357efa358f8a35902e1 -a34de7a34eeaa34f10f9a35003eca352 -eea353f4a354f5a3556b856f586f4a70 -54726e7304e1a348e5a349e7a34aefa3 -4bf4a34c02ea87ed89fa8b05f206f293 -f395fa97e38de48fe59108ee0feea342 -efa343f1a344f9a345faa346e299e32a -e8a1eda341022a9b4e2c5012616ced9f -126261f49d6b3c6c3e6d586e03e37feb -81ee83f98510eb6905ee06ee71f36df4 -73e16be26de96f03ed77ee79ef7bf07d -65256530673668506a10e76501e24df9 -4f05ed06ed59ef5bf15de353e455e757 -02e15fec61ef636148625263646405f0 -06f045f947fa49e13fe541ea4302e927 -eb29f52b04e92ff131f233f435f93702 -e439e53be83d +a35cf2a35b10ea012a2e41127261e2a3 +5f032aa35d312e49345310d5a3601137 +b2a36001d1a35ed2a35f744475547658 +7703e1a357e2a358efa359f8a35a02e1 +a34ee7a34feaa35010f9a35103eca353 +eea354f4a355f5a3566b886f5b6f4a70 +54726e7304e1a349e5a34ae7a34befa3 +4cf4a34d02ea87ed89fa8b05f206f293 +f395fa97e38de48fe59109ef0fefa343 +f1a344f3a345f9a346faa347e299e330 +e8a1eda341eea342022a9b4e2c501261 +6ced9f126261f49d6b3c6c3e6d586e03 +e37feb81ee83f98510eb6905ee06ee71 +f36df473e16be26de96f03ed77ee79ef +7bf07d65256530673668506a10e76501 +e24df94f05ed06ed59ef5bf15de353e4 +55e75702e15fec61ef63614862526364 +6405f006f045f947fa49e13fe541ea43 +02e927eb29f52b04e92ff131f233f435 +f93702e439e53be83d } // trie - lsrs{ // 1584 + lsrs{ // 1585 "","","", "skip","script","", "aa","Latn","ET", @@ -893,6 +893,7 @@ e439e53be83d "arn","Latn","CL", "aro","Latn","BO", "arq","Arab","DZ", + "ars","Arab","SA", "ary","Arab","MA", "arz","Arab","EG", "as","Beng","IN", @@ -2602,12 +2603,12 @@ ee34012a854216656ee74c6174ee3511 } // regionToPartitions partitions{".","0","1","2","3","4","5","6","0123456","03","16","02","05","04","012346"} paradigms{ - "pt","Latn","BR", - "pt","Latn","PT", "es","Latn","ES", + "pt","Latn","BR", "es","Latn","419", - "en","Latn","US", "en","Latn","GB", + "pt","Latn","PT", + "en","Latn","US", } distances:intvector{80,50,4,3} } // match diff --git a/icu4c/source/data/misc/likelySubtags.txt b/icu4c/source/data/misc/likelySubtags.txt index f9d35818f1b..76baf83c4c2 100644 --- a/icu4c/source/data/misc/likelySubtags.txt +++ b/icu4c/source/data/misc/likelySubtags.txt @@ -65,6 +65,7 @@ likelySubtags:table(nofallback){ arn{"arn_Latn_CL"} aro{"aro_Latn_BO"} arq{"arq_Arab_DZ"} + ars{"ars_Arab_SA"} ary{"ary_Arab_MA"} arz{"arz_Arab_EG"} as{"as_Beng_IN"} diff --git a/icu4c/source/i18n/calendar.cpp b/icu4c/source/i18n/calendar.cpp index 4f451ee099c..82a0e2316a2 100644 --- a/icu4c/source/i18n/calendar.cpp +++ b/icu4c/source/i18n/calendar.cpp @@ -268,6 +268,8 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // canonicalize, so grandfathered variant will be transformed to keywords // e.g ja_JP_TRADITIONAL -> ja_JP@calendar=japanese + // NOTE: Since ICU-20187, ja_JP_TRADITIONAL no longer canonicalizes, and + // the Gregorian calendar is returned instead. int32_t canonicalLen = uloc_canonicalize(locid, canonicalName, sizeof(canonicalName) - 1, &status); if (U_FAILURE(status)) { return CALTYPE_GREGORIAN; diff --git a/icu4c/source/i18n/dtptngen.cpp b/icu4c/source/i18n/dtptngen.cpp index 46161312719..c5f8618a6d6 100644 --- a/icu4c/source/i18n/dtptngen.cpp +++ b/icu4c/source/i18n/dtptngen.cpp @@ -28,6 +28,7 @@ #include "unicode/ures.h" #include "unicode/ustring.h" #include "unicode/rep.h" +#include "unicode/region.h" #include "cpputils.h" #include "mutex.h" #include "umutex.h" @@ -613,29 +614,56 @@ U_CFUNC void U_CALLCONV DateTimePatternGenerator::loadAllowedHourFormatsData(UEr ures_getAllItemsWithFallback(rb.getAlias(), "timeData", sink, status); } -void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErrorCode &status) { - if (U_FAILURE(status)) { return; } - Locale maxLocale(locale); - maxLocale.addLikelySubtags(status); - if (U_FAILURE(status)) { - return; - } - - const char *country = maxLocale.getCountry(); - if (*country == '\0') { country = "001"; } - const char *language = maxLocale.getLanguage(); - +static int32_t* getAllowedHourFormatsLangCountry(const char* language, const char* country, UErrorCode& status) { CharString langCountry; - langCountry.append(language, static_cast(uprv_strlen(language)), status); + langCountry.append(language, status); langCountry.append('_', status); - langCountry.append(country, static_cast(uprv_strlen(country)), status); + langCountry.append(country, status); - int32_t *allowedFormats; + int32_t* allowedFormats; allowedFormats = (int32_t *)uhash_get(localeToAllowedHourFormatsMap, langCountry.data()); if (allowedFormats == nullptr) { allowedFormats = (int32_t *)uhash_get(localeToAllowedHourFormatsMap, const_cast(country)); } + return allowedFormats; +} + +void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + + const char *language = locale.getLanguage(); + const char *country = locale.getCountry(); + Locale maxLocale; // must be here for correct lifetime + if (*language == '\0' || *country == '\0') { + maxLocale = locale; + UErrorCode localStatus = U_ZERO_ERROR; + maxLocale.addLikelySubtags(localStatus); + if (U_SUCCESS(localStatus)) { + language = maxLocale.getLanguage(); + country = maxLocale.getCountry(); + } + } + if (*language == '\0') { + // Unexpected, but fail gracefully + language = "und"; + } + if (*country == '\0') { + country = "001"; + } + + int32_t* allowedFormats = getAllowedHourFormatsLangCountry(language, country, status); + + // Check if the region has an alias + if (allowedFormats == nullptr) { + UErrorCode localStatus = U_ZERO_ERROR; + const Region* region = Region::getInstance(country, localStatus); + if (U_SUCCESS(localStatus)) { + country = region->getRegionCode(); // the real region code + allowedFormats = getAllowedHourFormatsLangCountry(language, country, status); + } + } + if (allowedFormats != nullptr) { // Lookup is successful // Here allowedFormats points to a list consisting of key for preferredFormat, // followed by one or more keys for allowedFormats, then followed by ALLOWED_HOUR_FORMAT_UNKNOWN. diff --git a/icu4c/source/i18n/region.cpp b/icu4c/source/i18n/region.cpp index 343ef78832a..76445aef328 100644 --- a/icu4c/source/i18n/region.cpp +++ b/icu4c/source/i18n/region.cpp @@ -25,7 +25,6 @@ #include "unicode/uobject.h" #include "unicode/unistr.h" #include "unicode/ures.h" -#include "unicode/decimfmt.h" #include "ucln_in.h" #include "cstring.h" #include "mutex.h" @@ -33,6 +32,7 @@ #include "umutex.h" #include "uresimp.h" #include "region_impl.h" +#include "util.h" #if !UCONFIG_NO_FORMATTING @@ -87,7 +87,6 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { LocalUHashtablePointer newRegionIDMap(uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, &status)); LocalUHashtablePointer newNumericCodeMap(uhash_open(uhash_hashLong,uhash_compareLong,NULL,&status)); LocalUHashtablePointer newRegionAliases(uhash_open(uhash_hashUnicodeString,uhash_compareUnicodeString,NULL,&status)); - LocalPointer df(new DecimalFormat(status), status); LocalPointer continents(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); LocalPointer groupings(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); @@ -115,7 +114,6 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { } // now, initialize - df->setParseIntegerOnly(TRUE); uhash_setValueDeleter(newRegionIDMap.getAlias(), deleteRegion); // regionIDMap owns objs uhash_setKeyDeleter(newRegionAliases.getAlias(), uprv_deleteUObject); // regionAliases owns the string keys @@ -192,11 +190,10 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { r->idStr.extract(0,r->idStr.length(),r->id,sizeof(r->id),US_INV); r->fType = URGN_TERRITORY; // Only temporary - figure out the real type later once the aliases are known. - Formattable result; - UErrorCode ps = U_ZERO_ERROR; - df->parse(r->idStr,result,ps); - if ( U_SUCCESS(ps) ) { - r->code = result.getLong(); // Convert string to number + int32_t pos = 0; + int32_t result = ICU_Utility::parseAsciiInteger(r->idStr, pos); + if (pos > 0) { + r->code = result; // Convert string to number uhash_iput(newNumericCodeMap.getAlias(),r->code,(void *)(r.getAlias()),&status); r->fType = URGN_SUBCONTINENT; } else { @@ -230,11 +227,10 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { aliasFromRegion->idStr.setTo(*aliasFromStr); aliasFromRegion->idStr.extract(0,aliasFromRegion->idStr.length(),aliasFromRegion->id,sizeof(aliasFromRegion->id),US_INV); uhash_put(newRegionIDMap.getAlias(),(void *)&(aliasFromRegion->idStr),(void *)aliasFromRegion,&status); - Formattable result; - UErrorCode ps = U_ZERO_ERROR; - df->parse(aliasFromRegion->idStr,result,ps); - if ( U_SUCCESS(ps) ) { - aliasFromRegion->code = result.getLong(); // Convert string to number + int32_t pos = 0; + int32_t result = ICU_Utility::parseAsciiInteger(aliasFromRegion->idStr, pos); + if ( pos > 0 ) { + aliasFromRegion->code = result; // Convert string to number uhash_iput(newNumericCodeMap.getAlias(),aliasFromRegion->code,(void *)aliasFromRegion,&status); } else { aliasFromRegion->code = -1; @@ -279,11 +275,10 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { Region *r = (Region *)uhash_get(newRegionIDMap.getAlias(),(void *)&codeMappingID); if ( r ) { - Formattable result; - UErrorCode ps = U_ZERO_ERROR; - df->parse(codeMappingNumber,result,ps); - if ( U_SUCCESS(ps) ) { - r->code = result.getLong(); // Convert string to number + int32_t pos = 0; + int32_t result = ICU_Utility::parseAsciiInteger(codeMappingNumber, pos); + if ( pos > 0 ) { + r->code = result; // Convert string to number uhash_iput(newNumericCodeMap.getAlias(),r->code,(void *)r,&status); } LocalPointer code3(new UnicodeString(codeMapping3Letter), status); @@ -516,15 +511,8 @@ Region::getInstance (int32_t code, UErrorCode &status) { Region *r = (Region *)uhash_iget(numericCodeMap,code); if ( !r ) { // Just in case there's an alias that's numeric, try to find it. - UnicodeString pat = UNICODE_STRING_SIMPLE("0"); - LocalPointer df(new DecimalFormat(pat,status), status); - if( U_FAILURE(status) ) { - return NULL; - } UnicodeString id; - id.remove(); - FieldPosition posIter; - df->format(code,id, posIter, status); + ICU_Utility::appendNumber(id, code, 10, 1); r = (Region *)uhash_get(regionAliases,&id); } diff --git a/icu4c/source/test/depstest/dependencies.txt b/icu4c/source/test/depstest/dependencies.txt index a0f75a620dd..70b5211d642 100644 --- a/icu4c/source/test/depstest/dependencies.txt +++ b/icu4c/source/test/depstest/dependencies.txt @@ -849,7 +849,7 @@ library: i18n group: region region.o uregion.o deps - formatting # Temporary, TODO: Ticket #9982 class Region should use low-level ASCII-integer functions, and probably be moved to the common library. + icu_utility resourcebundle uvector uclean_i18n @@ -1018,6 +1018,7 @@ group: formatting trigonometry # for astro.o sharedbreakiterator # for reldatefmt.o uclean_i18n + region group: sharedbreakiterator sharedbreakiterator.o diff --git a/icu4c/source/test/intltest/dtptngts.cpp b/icu4c/source/test/intltest/dtptngts.cpp index 800aba7bdbf..4a55bb719e3 100644 --- a/icu4c/source/test/intltest/dtptngts.cpp +++ b/icu4c/source/test/intltest/dtptngts.cpp @@ -41,12 +41,13 @@ void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool e TESTCASE(5, testSkeletonsWithDayPeriods); TESTCASE(6, testGetFieldDisplayNames); TESTCASE(7, testJjMapping); - TESTCASE(8, testFallbackWithDefaultRootLocale); + TESTCASE(8, test20640_HourCyclArsEnNH); + TESTCASE(9, testFallbackWithDefaultRootLocale); default: name = ""; break; } } -#define MAX_LOCALE 11 +#define MAX_LOCALE 12 /** * Test various generic API methods of DateTimePatternGenerator for API coverage. @@ -85,11 +86,12 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) {"zh", "Hans", "CN", ""}, // 7 {"zh", "TW", "", "calendar=roc"}, // 8 {"ru", "", "", ""}, // 9 - {"zh", "", "", "calendar=chinese"}, // 10 + {"zh", "", "", "calendar=chinese"}, // 10 + {"ja", "JP", "TRADITIONAL", ""}, // 11 }; // For Weds, Jan 13, 1999, 23:58:59 - UnicodeString patternResults[] = { + UnicodeString patternResults_en_US[] = { // en_US // 0 en_US UnicodeString("1/1999"), // 00: yM UnicodeString("Jan 1999"), // 01: yMMM @@ -108,7 +110,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) UnicodeString("13 Wed"), // 14: Ed -> d EEE UnicodeString("11:58:59.123 PM"), // 15: jmmssSSS -> "h:mm:ss.SSS a" UnicodeString("11:58"), // 16: JJmm + }; + UnicodeString patternResults_en_US_japanese[] = { // en_US@calendar=japanese // 1 en_US@calendar=japanese UnicodeString("1/11 H"), // 0: yM UnicodeString("Jan 11 Heisei"), // 1: yMMM @@ -127,7 +131,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) UnicodeString("13 Wed"), // 14: Ed -> d EEE UnicodeString("11:58:59.123 PM"), // 15: jmmssSSS -> "h:mm:ss.SSS a" UnicodeString("11:58"), // 16: JJmm + }; + UnicodeString patternResults_de_DE[] = { // de_DE // 2 de_DE UnicodeString("1.1999"), // 00: yM UnicodeString("Jan. 1999"), // 01: yMMM @@ -146,7 +152,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) UnicodeString("Mi., 13."), // 14: Ed -> EEE d. UnicodeString("23:58:59,123"), // 15: jmmssSSS -> "HH:mm:ss,SSS" UnicodeString("23:58"), // 16: JJmm + }; + UnicodeString patternResults_fi[] = { // fi // 3 fi UnicodeString("1.1999"), // 00: yM (fixed expected result per ticket:6626:) UnicodeString("tammi 1999"), // 01: yMMM @@ -165,7 +173,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) UnicodeString("ke 13."), // 14: Ed -> ccc d. UnicodeString("23.58.59,123"), // 15: jmmssSSS -> "H.mm.ss,SSS" UnicodeString("23.58"), // 16: JJmm + }; + UnicodeString patternResults_es[] = { // es // 4 es UnicodeString("1/1999"), // 00: yM -> "M/y" UnicodeString("ene. 1999"), // 01: yMMM -> "MMM y" @@ -184,7 +194,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("mi\\u00E9. 13"), // 14: Ed -> "EEE d" UnicodeString("23:58:59,123"), // 15: jmmssSSS -> "H:mm:ss,SSS" UnicodeString("23:58"), // 16: JJmm + }; + UnicodeString patternResults_ja[] = { // ja // 5 ja UnicodeString("1999/1"), // 00: yM -> y/M CharsToUnicodeString("1999\\u5E741\\u6708"), // 01: yMMM -> y\u5E74M\u6708 @@ -203,7 +215,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("13\\u65E5(\\u6C34)"), // 14: Ed -> d\u65E5(EEE) UnicodeString("23:58:59.123"), // 15: jmmssSSS -> "H:mm:ss.SSS" UnicodeString("23:58"), // 16: JJmm + }; + UnicodeString patternResults_ja_japanese[] = { // ja@calendar=japanese // 6 ja@calendar=japanese UnicodeString("H11/1"), // 00: yM -> GGGGGy/m CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"), // 01: yMMM -> Gy\u5E74M\u6708 @@ -222,7 +236,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("13\\u65E5(\\u6C34)"), // 14: Ed -> d\u65E5(EEE) UnicodeString("23:58:59.123"), // 15: jmmssSSS -> "H:mm:ss.SSS" UnicodeString("23:58"), // 16: JJmm + }; + UnicodeString patternResults_zh_Hans_CN[] = { // zh_Hans_CN // 7 zh_Hans_CN CharsToUnicodeString("1999\\u5E741\\u6708"), // 00: yM -> y\u5E74M\u6708 CharsToUnicodeString("1999\\u5E741\\u6708"), // 01: yMMM -> yyyy\u5E74MMM (fixed expected result per ticket:6626:) @@ -241,7 +257,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("13\\u65E5\\u5468\\u4E09"), // 14: Ed -> d\u65E5EEE CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"), // 15: jmmssSSS -> "ah:mm:ss.SSS" UnicodeString("11:58"), // 16: JJmm + }; + UnicodeString patternResults_zh_TW_roc[] = { // zh_TW@calendar=roc // 8 zh_TW@calendar=roc CharsToUnicodeString("\\u6C11\\u570B88/1"), // 00: yM -> Gy/M CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"), // 01: yMMM -> Gy\u5E74M\u6708 @@ -260,7 +278,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("13 \\u9031\\u4E09"), // 14: Ed -> d E CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"), // 15: jmmssSSS -> "ah:mm:ss.SSS" UnicodeString("11:58"), // 16: JJmm + }; + UnicodeString patternResults_ru[] = { // ru // 9 ru UnicodeString("01.1999"), // 00: yM -> MM.y CharsToUnicodeString("\\u044F\\u043D\\u0432. 1999 \\u0433."), // 01: yMMM -> LLL y @@ -279,7 +299,9 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("\\u0441\\u0440, 13"), // 14: Ed -> EEE, d UnicodeString("23:58:59,123"), // 15: jmmssSSS -> "H:mm:ss,SSS" UnicodeString("23:58"), // 16: JJmm + }; + UnicodeString patternResults_zh_chinese[] = { // zh@calendar=chinese // 10 zh@calendar=chinese CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u5341\\u4E00\\u6708"), // 00: yMMM CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u5341\\u4E00\\u6708"), // 01: yMMM @@ -298,8 +320,42 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) CharsToUnicodeString("26\\u65E5\\u5468\\u4E09"), // 14: Ed -> d\u65E5EEE CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"), // 15: jmmssSS UnicodeString("11:58"), // 16: JJmm + }; - UnicodeString(), + UnicodeString patternResults_ja_jp_traditional[] = { + // ja_JP_TRADITIONAL // 11 ja_JP_TRADITIONAL + u"AD1999/1", // 00: yM + u"西暦1999年1月", // 01: yMMM + u"1999年1月13日", // 02: yMd + u"西暦1999年1月13日", // 03: yMMMd + u"1/13", // 04: Md + u"1月13日", // 05: MMMd + u"1月13日", // 06: MMMMd + u"西暦1999/Q1", // 07: yQQQ + u"午後11:58", // 08: hhmm + u"23:58", // 09: HHmm + u"23:58", // 10: jjmm + u"58:59", // 11: mmss + u"西暦1999年1月", // 12: yyyyMMMM + u"1月13日(水)", // 13: MMMEd + u"13日(水)", // 14: Ed + u"23:58:59.123", // 15: jmmssSSS + u"23:58", // 16: JJmm + }; + + UnicodeString* patternResults[] = { + patternResults_en_US, // 0 + patternResults_en_US_japanese, // 1 + patternResults_de_DE, // 2 + patternResults_fi, // 3 + patternResults_es, // 4 + patternResults_ja, // 5 + patternResults_ja_japanese, // 6 + patternResults_zh_Hans_CN, // 7 + patternResults_zh_TW_roc, // 8 + patternResults_ru, // 9 + patternResults_zh_chinese, // 10 + patternResults_ja_jp_traditional, // 11 }; UnicodeString patternTests2[] = { @@ -635,6 +691,7 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) UDate testDate= LocaleTest::date(99, 0, 13, 23, 58, 59) + 123.0; while (localeIndex < MAX_LOCALE ) { + resultIndex=0; int32_t dataIndex=0; UnicodeString bestPattern; @@ -653,9 +710,12 @@ void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/) SimpleDateFormat sdf(bestPattern, loc, status); resultDate.remove(); resultDate = sdf.format(testDate, resultDate); - if ( resultDate != patternResults[resultIndex] ) { + if ( resultDate != patternResults[localeIndex][resultIndex] ) { + auto* calendar = sdf.getCalendar(); errln(UnicodeString("\nERROR: Test various skeletons[") + (dataIndex-1) + UnicodeString("], localeIndex ") + localeIndex + - UnicodeString(". Got: \"") + resultDate + UnicodeString("\" Expected: \"") + patternResults[resultIndex] + "\"" ); + u". Got: \"" + resultDate + + u"\" with calendar " + calendar->getType() + + u" Expected: \"" + patternResults[localeIndex][resultIndex] + u"\""); } resultIndex++; @@ -1329,12 +1389,13 @@ void IntlTestDateTimePatternGeneratorAPI::testJjMapping() { for (; *charPtr != (UChar)0; charPtr++) { if (jPatSkeleton.indexOf(*charPtr) >= 0) { if (shortPatSkeleton.indexOf(*charPtr) < 0) { - char jcBuf[2], spBuf[32]; + char jcBuf[2], spBuf[32], jpBuf[32]; u_austrncpy(jcBuf, charPtr, 1); jcBuf[1] = 0; shortPattern.extract(0, shortPattern.length(), spBuf, 32); + jPattern.extract(0, jPattern.length(), jpBuf, 32); const char* dfmtCalType = (dfmt->getCalendar())->getType(); - errln("ERROR: locale %s, expected j resolved char %s to occur in short time pattern %s for %s", localeID, jcBuf, spBuf, dfmtCalType); + errln("ERROR: locale %s, expected j resolved char %s to occur in short time pattern '%s' for %s (best pattern: '%s')", localeID, jcBuf, spBuf, dfmtCalType, jpBuf); } break; } @@ -1342,6 +1403,46 @@ void IntlTestDateTimePatternGeneratorAPI::testJjMapping() { } } +void IntlTestDateTimePatternGeneratorAPI::test20640_HourCyclArsEnNH() { + IcuTestErrorCode status(*this, "test20640_HourCyclArsEnNH"); + + const struct TestCase { + const char* localeName; + const char16_t* expectedDtpgPattern; + const char16_t* expectedTimePattern; + } cases[] = { + // ars is interesting because it does not have a region, but it aliases + // to ar_SA, which has a region. + {"ars", u"h a", u"h:mm a"}, + // en_NH is interesting because NH is a depregated region code. + {"en_NH", u"h a", u"h:mm a"}, + }; + + for (auto& cas : cases) { + status.setScope(cas.localeName); + + Locale loc(cas.localeName); + LocalPointer dtf(DateFormat::createTimeInstance(DateFormat::kShort, loc), status); + LocalPointer dtpg(DateTimePatternGenerator::createInstance(loc, status)); + if (status.errIfFailureAndReset()) { + return; + } + + UnicodeString timePattern; + dynamic_cast(dtf.getAlias())->toPattern(timePattern); + UnicodeString dtpgPattern = dtpg->getBestPattern(u"j", status); + if (status.errIfFailureAndReset()) { + return; + } + + assertEquals(UnicodeString("dtpgPattern ") + cas.localeName, + cas.expectedDtpgPattern, dtpgPattern); + assertEquals(UnicodeString("timePattern ") + cas.localeName, + cas.expectedTimePattern, timePattern); + } + +} + void IntlTestDateTimePatternGeneratorAPI::testFallbackWithDefaultRootLocale() { UErrorCode status = U_ZERO_ERROR; char original[ULOC_FULLNAME_CAPACITY]; diff --git a/icu4c/source/test/intltest/dtptngts.h b/icu4c/source/test/intltest/dtptngts.h index d9f4f428a49..c0bebccd3e3 100644 --- a/icu4c/source/test/intltest/dtptngts.h +++ b/icu4c/source/test/intltest/dtptngts.h @@ -33,6 +33,7 @@ private: void testSkeletonsWithDayPeriods(); void testGetFieldDisplayNames(); void testJjMapping(); + void test20640_HourCyclArsEnNH(); void testFallbackWithDefaultRootLocale(); }; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java index e5ad3db5b6b..81e2fce492b 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java @@ -37,6 +37,7 @@ import com.ibm.icu.impl.UResource; import com.ibm.icu.util.Calendar; import com.ibm.icu.util.Freezable; import com.ibm.icu.util.ICUCloneNotSupportedException; +import com.ibm.icu.util.Region; import com.ibm.icu.util.ULocale; import com.ibm.icu.util.ULocale.Category; import com.ibm.icu.util.UResourceBundle; @@ -319,6 +320,15 @@ public class DateTimePatternGenerator implements Freezable